return zend_jit_trace_type_to_info_ex(type, -1);
}
-static zend_always_inline int zend_jit_var_may_be_modified_indirectly(const zend_op_array *op_array, const zend_ssa *ssa, uint32_t var)
+static zend_always_inline zend_ssa_alias_kind zend_jit_var_may_alias(const zend_op_array *op_array, const zend_ssa *ssa, uint32_t var)
{
- if ((!op_array->function_name || (ssa->cfg.flags & ZEND_FUNC_INDIRECT_VAR_ACCESS))
- && var < op_array->last_var) {
- return 1;
- } else if (var < op_array->last_var
- && zend_string_equals_literal(op_array->vars[var], "http_response_header")) {
- return 1;
- }
- return 0;
+ if (var >= op_array->last_var) {
+ return NO_ALIAS;
+ } else if ((!op_array->function_name || (ssa->cfg.flags & ZEND_FUNC_INDIRECT_VAR_ACCESS))) {
+ return SYMTABLE_ALIAS;
+ } else if (ssa->vars) {
+ return ssa->vars[var].alias;
+ } else if (zend_string_equals_literal(op_array->vars[var], "http_response_header")) {
+ return HTTP_RESPONSE_HEADER_ALIAS;
+ }
+ return NO_ALIAS;
}
#define STACK_VAR_TYPE(_var) \
{
zend_ssa_var_info *info = &tssa->var_info[ssa_var];
- if (zend_jit_var_may_be_modified_indirectly(op_array, ssa, EX_VAR_TO_NUM(var))) {
+ if (zend_jit_var_may_alias(op_array, ssa, EX_VAR_TO_NUM(var)) != NO_ALIAS) {
info->type = MAY_BE_GUARD | zend_jit_trace_type_to_info(op_type);
} else if ((info->type & (MAY_BE_ANY|MAY_BE_UNDEF)) != (1 << op_type)) {
info->type = MAY_BE_GUARD | zend_jit_trace_type_to_info_ex(op_type, info->type);
if (!zend_jit_type_guard(&dasm_state, opline, _var, op_type)) { \
goto jit_failure; \
} \
- if (zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, _var)) { \
+ if (zend_jit_var_may_alias(op_array, op_array_ssa, _var) != NO_ALIAS) { \
SET_STACK_VAR_TYPE(_var, IS_UNKNOWN); \
} else { \
SET_STACK_VAR_TYPE(_var, op_type); \
ssa_var_info[i].type = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
}
} else if (op_array->function_name
- && !zend_jit_var_may_be_modified_indirectly(op_array, ssa, i)) {
+ && zend_jit_var_may_alias(op_array, ssa, i) == NO_ALIAS) {
ssa_vars[i].no_val = ssa->vars ? ssa->vars[i].no_val : 0;
ssa_var_info[i].type = MAY_BE_UNDEF;
} else {
ssa_var_info[v].type = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
}
} else if (op_array->function_name
- && !zend_jit_var_may_be_modified_indirectly(op_array, ssa, i)) {
+ && zend_jit_var_may_alias(op_array, ssa, i) == NO_ALIAS) {
ssa_vars[v].no_val = ssa->vars ? ssa->vars[i].no_val : 0;
ssa_var_info[v].type = MAY_BE_UNDEF;
} else {
uint32_t t1 = ssa_var_info[phi->sources[1]].type;
if (t & MAY_BE_GUARD) {
- if (zend_jit_var_may_be_modified_indirectly(op_array, ssa, phi->sources[0])) {
+ if (zend_jit_var_may_alias(op_array, ssa, phi->sources[0]) != NO_ALIAS) {
/* pass */
} else if (((t0 | t1) & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) == (t & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF))) {
if (!((t0 | t1) & MAY_BE_GUARD)) {
/* We don't start intervals for variables used in Phi */
if ((ssa->vars[i].use_chain >= 0 /*|| ssa->vars[i].phi_use_chain*/)
&& zend_jit_var_supports_reg(ssa, i)
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, i)) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, i) == NO_ALIAS) {
start[i] = 0;
if (i < parent_vars_count
&& STACK_REG(parent_stack, i) != ZREG_NONE
vars_op_array[phi->ssa_var] = op_array;
if (ssa->vars[phi->ssa_var].use_chain >= 0
&& zend_jit_var_supports_reg(ssa, phi->ssa_var)
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, phi->sources[0])) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, phi->sources[0]) == NO_ALIAS) {
start[phi->ssa_var] = 0;
count++;
}
&& (ssa->vars[ssa_op->result_def].use_chain >= 0
|| ssa->vars[ssa_op->result_def].phi_use_chain)
&& zend_jit_var_supports_reg(ssa, ssa_op->result_def)
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->result.var))) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->result.var)) == NO_ALIAS) {
if (!(ssa->var_info[ssa_op->result_def].type & MAY_BE_GUARD)
|| opline->opcode == ZEND_PRE_INC
|| opline->opcode == ZEND_PRE_DEC
&& (ssa->vars[ssa_op->op1_def].use_chain >= 0
|| ssa->vars[ssa_op->op1_def].phi_use_chain)
&& zend_jit_var_supports_reg(ssa, ssa_op->op1_def)
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var))) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var)) == NO_ALIAS) {
start[ssa_op->op1_def] = idx;
vars_op_array[ssa_op->op1_def] = op_array;
count++;
&& (ssa->vars[ssa_op->op2_def].use_chain >= 0
|| ssa->vars[ssa_op->op2_def].phi_use_chain)
&& zend_jit_var_supports_reg(ssa, ssa_op->op2_def)
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op2.var))) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op2.var)) == NO_ALIAS) {
start[ssa_op->op2_def] = idx;
vars_op_array[ssa_op->op2_def] = op_array;
count++;
&& (ssa->vars[ssa_op->op1_def].use_chain >= 0
|| ssa->vars[ssa_op->op1_def].phi_use_chain)
&& zend_jit_var_supports_reg(ssa, ssa_op->op1_def)
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var))) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var)) == NO_ALIAS) {
start[ssa_op->op1_def] = idx;
vars_op_array[ssa_op->op1_def] = op_array;
count++;
vars_op_array[j] = op_array;
if (ssa->vars[j].use_chain >= 0
&& zend_jit_var_supports_reg(ssa, j)
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, i)) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, i) == NO_ALIAS) {
start[j] = idx;
flags[j] = ZREG_LOAD;
count++;
vars_op_array[j] = op_array;
if (ssa->vars[j].use_chain >= 0
&& zend_jit_var_supports_reg(ssa, j)
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, i)) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, i) == NO_ALIAS) {
start[j] = idx;
flags[j] = ZREG_LOAD;
count++;
if (!(info & MAY_BE_GUARD) && has_concrete_type(info)) {
SET_STACK_TYPE(stack, i, concrete_type(info));
- } else if (zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, i)) {
+ } else if (zend_jit_var_may_alias(op_array, op_array_ssa, i) != NO_ALIAS) {
SET_STACK_TYPE(stack, i, IS_UNKNOWN);
} else if (i < parent_vars_count
&& STACK_TYPE(parent_stack, i) != IS_UNKNOWN) {
goto jit_failure;
}
if (opline->op1_type == IS_CV
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var))) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var)) == NO_ALIAS) {
ssa->var_info[ssa_op->op1_use].guarded_reference = 1;
}
} else {
goto jit_failure;
}
if (opline->op1_type == IS_CV
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var))) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var)) == NO_ALIAS) {
ssa->var_info[ssa_op->op1_use].guarded_reference = 1;
}
} else {
goto jit_failure;
}
if (opline->op1_type == IS_CV
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var))) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var)) == NO_ALIAS) {
ssa->var_info[ssa_op->op1_use].guarded_reference = 1;
}
if (!zend_jit_assign_to_typed_ref(&dasm_state, opline, opline->op2_type, op2_addr, 1)) {
goto jit_failure;
}
if (opline->op1_type == IS_CV
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var))) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var)) == NO_ALIAS) {
ssa->var_info[ssa_op->op1_use].guarded_reference = 1;
}
} else {
goto jit_failure;
}
if (opline->op1_type == IS_CV
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var))) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var)) == NO_ALIAS) {
ssa->var_info[ssa_op->op1_use].guarded_reference = 1;
}
} else {
goto jit_failure;
}
if (opline->op1_type == IS_CV
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var))) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var)) == NO_ALIAS) {
ssa->var_info[ssa_op->op1_use].guarded_reference = 1;
}
} else {
goto jit_failure;
}
if (opline->op1_type == IS_CV
- && !zend_jit_var_may_be_modified_indirectly(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var))) {
+ && zend_jit_var_may_alias(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var)) == NO_ALIAS) {
ssa->var_info[ssa_op->op1_use].guarded_reference = 1;
}
} else {
}
while (i < p->op_array->last_var) {
if (jit_extension
- && zend_jit_var_may_be_modified_indirectly(p->op_array, &jit_extension->func_info.ssa, i)) {
+ && zend_jit_var_may_alias(p->op_array, &jit_extension->func_info.ssa, i) != NO_ALIAS) {
SET_STACK_TYPE(call->stack, i, IS_UNKNOWN);
} else {
SET_STACK_TYPE(call->stack, i, IS_UNDEF);