ZEND_ASSERT(call);
ZEND_ASSERT(call->caller_call_opline == opline);
if (opline->result_type & (IS_TMP_VAR|IS_VAR)) {
- zend_optimizer_remove_live_range_ex(op_array, opline->result.var, var->definition + 1);
+ zend_optimizer_remove_live_range_ex(op_array, opline->result.var, var->definition);
}
zend_ssa_remove_result_def(ssa, ssa_op);
zend_ssa_remove_instr(ssa, opline, ssa_op);
} else {
/* Ordinary computational instruction -> remove it */
if (opline->result_type & (IS_TMP_VAR|IS_VAR)) {
- zend_optimizer_remove_live_range_ex(op_array, opline->result.var, var->definition + 1);
+ zend_optimizer_remove_live_range_ex(op_array, opline->result.var, var->definition);
}
zend_ssa_remove_result_def(ssa, ssa_op);
zend_ssa_remove_instr(ssa, opline, ssa_op);
&& ssa->vars[ssa_op->result_def].use_chain < 0
&& ssa->vars[ssa_op->result_def].phi_use_chain == NULL) {
if (opline->result_type & (IS_TMP_VAR|IS_VAR)) {
- zend_optimizer_remove_live_range_ex(op_array, opline->result.var, var->definition + 1);
+ zend_optimizer_remove_live_range_ex(op_array, opline->result.var, var->definition);
}
zend_ssa_remove_result_def(ssa, ssa_op);
opline->result_type = IS_UNUSED;
{
uint32_t i = 0;
+ switch (op_array->opcodes[start].opcode) {
+ case ZEND_ROPE_ADD:
+ case ZEND_ADD_ARRAY_ELEMENT:
+ return;
+ case ZEND_ROPE_INIT:
+ var |= ZEND_LIVE_ROPE;
+ break;
+ case ZEND_BEGIN_SILENCE:
+ var |= ZEND_LIVE_SILENCE;
+ break;
+ case ZEND_FE_RESET_R:
+ case ZEND_FE_RESET_RW:
+ var |= ZEND_LIVE_LOOP;
+ /* break missing intentionally */
+ default:
+ start++;
+ }
+
while (i < op_array->last_live_range) {
if (op_array->live_range[i].var == var
&& op_array->live_range[i].start == start) {
}
if (op_array->opcodes[j].result_type & (IS_TMP_VAR|IS_VAR)) {
- zend_optimizer_remove_live_range_ex(op_array, op_array->opcodes[j].result.var, j + 1);
+ zend_optimizer_remove_live_range_ex(op_array, op_array->opcodes[j].result.var, j);
}
zend_ssa_remove_defs_of_instr(ssa, &ssa->ops[j]);
zend_ssa_remove_instr(ssa, &op_array->opcodes[j], &ssa->ops[j]);