Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Zend/Optimizer/block_pass.c
Original file line number Diff line number Diff line change
Expand Up @@ -1702,7 +1702,7 @@ static void zend_merge_blocks(const zend_op_array *op_array, const zend_cfg *cfg
void zend_optimize_cfg(zend_op_array *op_array, zend_optimizer_ctx *ctx)
{
zend_cfg cfg;
zend_basic_block *blocks, *end, *b;
zend_basic_block *blocks, *b;
int pass;
uint32_t bitset_len;
zend_bitset usage;
Expand Down Expand Up @@ -1730,7 +1730,7 @@ void zend_optimize_cfg(zend_op_array *op_array, zend_optimizer_ctx *ctx)
jmp_hitlist = zend_arena_alloc(&ctx->arena, cfg.blocks_count * sizeof(int));

blocks = cfg.blocks;
end = blocks + cfg.blocks_count;
const zend_basic_block *end = blocks + cfg.blocks_count;
for (pass = 0; pass < PASSES; pass++) {
opt_count = 0;

Expand Down
25 changes: 13 additions & 12 deletions Zend/Optimizer/compact_literals.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,26 +41,27 @@ typedef struct _literal_info {
info[n].num_related = (related); \
} while (0)

static uint32_t add_static_slot(HashTable *hash,
zend_op_array *op_array,
uint32_t op1,
uint32_t op2,
uint32_t kind,
uint32_t *cache_size)
{
static uint32_t add_static_slot(
HashTable *hash,
const zend_op_array *op_array,
uint32_t op1,
uint32_t op2,
uint32_t kind,
uint32_t *cache_size
) {
uint32_t ret;
zval *class_name = &op_array->literals[op1];
zval *prop_name = &op_array->literals[op2];
zval *pos, tmp;
const zval *class_name = &op_array->literals[op1];
const zval *prop_name = &op_array->literals[op2];

zend_string *key = zend_create_member_string(Z_STR_P(class_name), Z_STR_P(prop_name));
ZSTR_H(key) = zend_string_hash_func(key);
ZSTR_H(key) += kind;

pos = zend_hash_find(hash, key);
const zval *pos = zend_hash_find(hash, key);
if (pos) {
ret = Z_LVAL_P(pos);
} else {
zval tmp;
ret = *cache_size;
*cache_size += (kind == LITERAL_STATIC_PROPERTY ? 3 : 2) * sizeof(void *);
ZVAL_LONG(&tmp, ret);
Expand All @@ -77,7 +78,7 @@ static inline void bias_key(zend_string *key, uint32_t bias)
ZSTR_H(key) = zend_string_hash_val(key) + bias;
}

static zend_string *create_str_cache_key(zval *literal, uint8_t num_related)
static zend_string *create_str_cache_key(const zval *literal, uint8_t num_related)
{
ZEND_ASSERT(Z_TYPE_P(literal) == IS_STRING);
if (num_related == 1) {
Expand Down
2 changes: 1 addition & 1 deletion Zend/Optimizer/compact_vars.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ void zend_optimizer_compact_vars(zend_op_array *op_array) {
/* Determine which CVs are used */
zend_bitset_clear(used_vars, used_vars_len);
for (i = 0; i < op_array->last; i++) {
zend_op *opline = &op_array->opcodes[i];
const zend_op *opline = &op_array->opcodes[i];
if (opline->op1_type & (IS_CV|IS_VAR|IS_TMP_VAR)) {
zend_bitset_incl(used_vars, VAR_NUM(opline->op1.var));
}
Expand Down
32 changes: 16 additions & 16 deletions Zend/Optimizer/dfa_pass.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ zend_result zend_dfa_analyze_op_array(zend_op_array *op_array, zend_optimizer_ct
return SUCCESS;
}

static void zend_ssa_remove_nops(zend_op_array *op_array, zend_ssa *ssa, zend_optimizer_ctx *ctx)
static void zend_ssa_remove_nops(zend_op_array *op_array, const zend_ssa *ssa, zend_optimizer_ctx *ctx)
{
zend_basic_block *blocks = ssa->cfg.blocks;
zend_basic_block *blocks_end = blocks + ssa->cfg.blocks_count;
Expand Down Expand Up @@ -290,9 +290,9 @@ static inline bool can_elide_list_type(
}

static inline bool can_elide_return_type_check(
const zend_script *script, zend_op_array *op_array, zend_ssa *ssa, zend_ssa_op *ssa_op) {
zend_arg_info *arg_info = &op_array->arg_info[-1];
zend_ssa_var_info *use_info = &ssa->var_info[ssa_op->op1_use];
const zend_script *script, const zend_op_array *op_array, const zend_ssa *ssa, const zend_ssa_op *ssa_op) {
const zend_arg_info *arg_info = &op_array->arg_info[-1];
const zend_ssa_var_info *use_info = &ssa->var_info[ssa_op->op1_use];
uint32_t use_type = use_info->type & (MAY_BE_ANY|MAY_BE_UNDEF);
if (use_type & MAY_BE_REF) {
return false;
Expand All @@ -317,7 +317,7 @@ static inline bool can_elide_return_type_check(
}

static bool opline_supports_assign_contraction(
zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int src_var, uint32_t cv_var) {
const zend_op_array *op_array, const zend_ssa *ssa, const zend_op *opline, int src_var, uint32_t cv_var) {
if (opline->opcode == ZEND_NEW) {
/* see Zend/tests/generators/aborted_yield_during_new.phpt */
return false;
Expand Down Expand Up @@ -378,7 +378,7 @@ static bool opline_supports_assign_contraction(
return true;
}

static bool variable_defined_or_used_in_range(zend_ssa *ssa, int var, int start, int end)
static bool variable_defined_or_used_in_range(const zend_ssa *ssa, int var, int start, int end)
{
while (start < end) {
const zend_ssa_op *ssa_op = &ssa->ops[start];
Expand Down Expand Up @@ -571,11 +571,11 @@ static void replace_predecessor(zend_ssa *ssa, int block_id, int old_pred, int n
}
}

static void zend_ssa_replace_control_link(zend_op_array *op_array, zend_ssa *ssa, int from, int to, int new_to)
static void zend_ssa_replace_control_link(const zend_op_array *op_array, zend_ssa *ssa, int from, int to, int new_to)
{
zend_basic_block *src = &ssa->cfg.blocks[from];
zend_basic_block *old = &ssa->cfg.blocks[to];
zend_basic_block *dst = &ssa->cfg.blocks[new_to];
const zend_basic_block *src = &ssa->cfg.blocks[from];
const zend_basic_block *old = &ssa->cfg.blocks[to];
const zend_basic_block *dst = &ssa->cfg.blocks[new_to];
zend_op *opline;

for (uint32_t i = 0; i < src->successors_count; i++) {
Expand Down Expand Up @@ -643,7 +643,7 @@ static void zend_ssa_replace_control_link(zend_op_array *op_array, zend_ssa *ssa
replace_predecessor(ssa, new_to, to, from);
}

static void zend_ssa_unlink_block(zend_op_array *op_array, zend_ssa *ssa, zend_basic_block *block, uint32_t block_num)
static void zend_ssa_unlink_block(const zend_op_array *op_array, zend_ssa *ssa, const zend_basic_block *block, uint32_t block_num)
{
if (block->predecessors_count == 1 && ssa->blocks[block_num].phis == NULL) {
int *predecessors;
Expand Down Expand Up @@ -837,7 +837,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
break;
case ZEND_COALESCE:
{
zend_ssa_var *var = &ssa->vars[ssa_op->result_def];
const zend_ssa_var *var = &ssa->vars[ssa_op->result_def];
if (opline->op1_type == IS_CONST
&& var->use_chain < 0 && var->phi_use_chain == NULL) {
if (Z_TYPE_P(CT_CONSTANT_EX(op_array, opline->op1.constant)) == IS_NULL) {
Expand All @@ -859,7 +859,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
}
case ZEND_JMP_NULL:
{
zend_ssa_var *var = &ssa->vars[ssa_op->result_def];
const zend_ssa_var *var = &ssa->vars[ssa_op->result_def];
if (opline->op1_type == IS_CONST
&& var->use_chain < 0 && var->phi_use_chain == NULL) {
if (Z_TYPE_P(CT_CONSTANT_EX(op_array, opline->op1.constant)) == IS_NULL) {
Expand Down Expand Up @@ -904,8 +904,8 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)

uint32_t target;
if (correct_type) {
HashTable *jmptable = Z_ARRVAL_P(CT_CONSTANT_EX(op_array, opline->op2.constant));
zval *jmp_zv = type == IS_LONG
const HashTable *jmptable = Z_ARRVAL_P(CT_CONSTANT_EX(op_array, opline->op2.constant));
const zval *jmp_zv = type == IS_LONG
? zend_hash_index_find(jmptable, Z_LVAL_P(zv))
: zend_hash_find(jmptable, Z_STR_P(zv));

Expand Down Expand Up @@ -957,7 +957,7 @@ static int zend_dfa_optimize_jmps(zend_op_array *op_array, zend_ssa *ssa)
return removed_ops;
}

static bool zend_dfa_try_to_replace_result(zend_op_array *op_array, zend_ssa *ssa, int def, int cv_var)
static bool zend_dfa_try_to_replace_result(const zend_op_array *op_array, const zend_ssa *ssa, int def, int cv_var)
{
int result_var = ssa->ops[def].result_def;
uint32_t cv = EX_NUM_TO_VAR(ssa->vars[cv_var].var);
Expand Down
35 changes: 17 additions & 18 deletions Zend/Optimizer/escape_analysis.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,10 @@ static zend_always_inline void union_find_unite(int *parent, int *size, int i, i
}
/* }}} */

static zend_result zend_build_equi_escape_sets(int *parent, zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
static zend_result zend_build_equi_escape_sets(int *parent, const zend_op_array *op_array, const zend_ssa *ssa) /* {{{ */
{
zend_ssa_var *ssa_vars = ssa->vars;
int ssa_vars_count = ssa->vars_count;
zend_ssa_phi *p;
int i;
int *size;
ALLOCA_FLAG(use_heap)
Expand All @@ -88,7 +87,7 @@ static zend_result zend_build_equi_escape_sets(int *parent, zend_op_array *op_ar

for (i = 0; i < ssa_vars_count; i++) {
if (ssa_vars[i].definition_phi) {
p = ssa_vars[i].definition_phi;
const zend_ssa_phi *p = ssa_vars[i].definition_phi;
if (p->pi >= 0) {
union_find_unite(parent, size, i, p->sources[0]);
} else {
Expand All @@ -98,8 +97,8 @@ static zend_result zend_build_equi_escape_sets(int *parent, zend_op_array *op_ar
}
} else if (ssa_vars[i].definition >= 0) {
int def = ssa_vars[i].definition;
zend_ssa_op *op = ssa->ops + def;
zend_op *opline = op_array->opcodes + def;
const zend_ssa_op *op = ssa->ops + def;
const zend_op *opline = op_array->opcodes + def;

if (op->op1_def >= 0) {
if (op->op1_use >= 0) {
Expand Down Expand Up @@ -145,9 +144,9 @@ static zend_result zend_build_equi_escape_sets(int *parent, zend_op_array *op_ar
}
/* }}} */

static bool is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, int var, const zend_script *script) /* {{{ */
static bool is_allocation_def(const zend_op_array *op_array, const zend_ssa *ssa, int def, int var, const zend_script *script) /* {{{ */
{
zend_ssa_op *ssa_op = ssa->ops + def;
const zend_ssa_op *ssa_op = ssa->ops + def;
zend_op *opline = op_array->opcodes + def;

if (ssa_op->result_def == var) {
Expand All @@ -156,7 +155,7 @@ static bool is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, i
return true;
case ZEND_NEW: {
/* objects with destructors should escape */
zend_class_entry *ce = zend_optimizer_get_class_entry_from_op1(
const zend_class_entry *ce = zend_optimizer_get_class_entry_from_op1(
script, op_array, opline);
uint32_t forbidden_flags =
/* These flags will always cause an exception */
Expand Down Expand Up @@ -216,10 +215,10 @@ static bool is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, i
}
/* }}} */

static bool is_local_def(zend_op_array *op_array, zend_ssa *ssa, int def, int var, const zend_script *script) /* {{{ */
static bool is_local_def(const zend_op_array *op_array, const zend_ssa *ssa, int def, int var, const zend_script *script) /* {{{ */
{
zend_ssa_op *op = ssa->ops + def;
zend_op *opline = op_array->opcodes + def;
const zend_ssa_op *op = ssa->ops + def;
const zend_op *opline = op_array->opcodes + def;

if (op->result_def == var) {
switch (opline->opcode) {
Expand All @@ -230,7 +229,7 @@ static bool is_local_def(zend_op_array *op_array, zend_ssa *ssa, int def, int va
return true;
case ZEND_NEW: {
/* objects with destructors should escape */
zend_class_entry *ce = zend_optimizer_get_class_entry_from_op1(
const zend_class_entry *ce = zend_optimizer_get_class_entry_from_op1(
script, op_array, opline);
if (ce
&& !ce->create_object
Expand Down Expand Up @@ -266,10 +265,10 @@ static bool is_local_def(zend_op_array *op_array, zend_ssa *ssa, int def, int va
}
/* }}} */

static bool is_escape_use(zend_op_array *op_array, zend_ssa *ssa, int use, int var) /* {{{ */
static bool is_escape_use(const zend_op_array *op_array, const zend_ssa *ssa, int use, int var) /* {{{ */
{
zend_ssa_op *ssa_op = ssa->ops + use;
zend_op *opline = op_array->opcodes + use;
const zend_ssa_op *ssa_op = ssa->ops + use;
const zend_op *opline = op_array->opcodes + use;

if (ssa_op->op1_use == var) {
switch (opline->opcode) {
Expand Down Expand Up @@ -377,7 +376,7 @@ static bool is_escape_use(zend_op_array *op_array, zend_ssa *ssa, int use, int v
}
/* }}} */

zend_result zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa) /* {{{ */
zend_result zend_ssa_escape_analysis(const zend_script *script, const zend_op_array *op_array, const zend_ssa *ssa) /* {{{ */
{
zend_ssa_var *ssa_vars = ssa->vars;
int ssa_vars_count = ssa->vars_count;
Expand Down Expand Up @@ -474,8 +473,8 @@ zend_result zend_ssa_escape_analysis(const zend_script *script, zend_op_array *o
root = ees[i];
if (ssa_vars[root].escape_state == ESCAPE_STATE_NO_ESCAPE) {
FOREACH_USE(ssa_vars + i, use) {
zend_ssa_op *op = ssa->ops + use;
zend_op *opline = op_array->opcodes + use;
const zend_ssa_op *op = ssa->ops + use;
const zend_op *opline = op_array->opcodes + use;
int enclosing_root;

if (opline->opcode == ZEND_OP_DATA &&
Expand Down
2 changes: 1 addition & 1 deletion Zend/Optimizer/optimize_temp_vars_5.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ void zend_optimize_temporary_variables(zend_op_array *op_array, zend_optimizer_c
opline->opcode == ZEND_RETURN_BY_REF ||
opline->opcode == ZEND_FREE ||
opline->opcode == ZEND_FE_FREE)) {
zend_op *curr = opline;
const zend_op *curr = opline;

while (--curr >= end) {
if (curr->opcode == ZEND_FAST_CALL) {
Expand Down
5 changes: 2 additions & 3 deletions Zend/Optimizer/pass3.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
#include "zend_vm.h"

/* we use "jmp_hitlist" to avoid infinity loops during jmp optimization */
static zend_always_inline bool in_hitlist(zend_op *target, zend_op **jmp_hitlist, int jmp_hitlist_count)
static zend_always_inline bool in_hitlist(const zend_op *target, zend_op **jmp_hitlist, int jmp_hitlist_count)
{
int i;

Expand All @@ -51,15 +51,14 @@ static zend_always_inline bool in_hitlist(zend_op *target, zend_op **jmp_hitlist
void zend_optimizer_pass3(zend_op_array *op_array, zend_optimizer_ctx *ctx)
{
zend_op *opline;
zend_op *end;
zend_op *target;
zend_op **jmp_hitlist;
int jmp_hitlist_count;
ALLOCA_FLAG(use_heap);

jmp_hitlist = (zend_op**)do_alloca(sizeof(zend_op*)*op_array->last, use_heap);
opline = op_array->opcodes;
end = opline + op_array->last;
const zend_op *end = opline + op_array->last;

while (opline < end) {

Expand Down
Loading
Loading