}
UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def);
}
- if ((opline+1)->op1_type == IS_CV) {
+ if ((opline+1)->op1_type == IS_CV && ssa_ops[i+1].op1_def >= 0) {
opline++;
i++;
tmp = OP1_INFO();
}
break;
case ZEND_ASSIGN:
- if (opline->op2_type == IS_CV) {
+ if (opline->op2_type == IS_CV && ssa_ops[i].op2_def >= 0) {
tmp = t2;
if (tmp & (MAY_BE_ANY | MAY_BE_REF)) {
if (tmp & MAY_BE_RC1) {
|| (b < 0 && a > ZEND_LONG_MAX + b);
}
-static int zend_ssa_rename(const zend_op_array *op_array, zend_ssa *ssa, int *var, int n) /* {{{ */
+static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, zend_ssa *ssa, int *var, int n) /* {{{ */
{
zend_basic_block *blocks = ssa->cfg.blocks;
zend_ssa_block *ssa_blocks = ssa->blocks;
ssa_vars_count++;
//NEW_SSA_VAR(opline->op1.var)
}
- if (opline->op2_type == IS_CV) {
+ if ((build_flags & ZEND_SSA_RC_INFERENCE) && opline->op2_type == IS_CV) {
ssa_ops[k].op2_def = ssa_vars_count;
var[EX_VAR_TO_NUM(opline->op2.var)] = ssa_vars_count;
ssa_vars_count++;
ssa_vars_count++;
//NEW_SSA_VAR(opline->op1.var)
}
- if (next->op1_type == IS_CV) {
+ if ((build_flags & ZEND_SSA_RC_INFERENCE) && next->op1_type == IS_CV) {
ssa_ops[k + 1].op1_def = ssa_vars_count;
var[EX_VAR_TO_NUM(next->op1.var)] = ssa_vars_count;
ssa_vars_count++;
j = blocks[n].children;
while (j >= 0) {
// FIXME: Tail call optimization?
- if (zend_ssa_rename(op_array, ssa, var, j) != SUCCESS)
+ if (zend_ssa_rename(op_array, build_flags, ssa, var, j) != SUCCESS)
return FAILURE;
j = blocks[j].next_child;
}
var[j] = j;
}
ssa->vars_count = op_array->last_var;
- if (zend_ssa_rename(op_array, ssa, var, 0) != SUCCESS) {
+ if (zend_ssa_rename(op_array, build_flags, ssa, var, 0) != SUCCESS) {
failure:
free_alloca(var, var_use_heap);
free_alloca(dfg.tmp, dfg_use_heap);