diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index ec48df256d2..5c0e5954f3d 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -853,6 +853,10 @@ typedef struct _op_var_info { uint32_t var; } op_var_info; +/* The following liveliness analyzing algorithm assumes that + * 1) temporary variables are defined before use + * 2) they have linear live-ranges without "holes" + */ ZEND_API uint32_t *generate_var_liveliness_info(zend_op_array *op_array) { uint32_t i, op_live_total = 0; @@ -942,9 +946,10 @@ ZEND_API uint32_t *generate_var_liveliness_info(zend_op_array *op_array) ZEND_ASSERT(T->end != (uint32_t) -1); j = T->start + 1; - if (op_array->opcodes[j].opcode == ZEND_FE_FETCH_R + if (op_array->opcodes[j].opcode == ZEND_OP_DATA + || op_array->opcodes[j].opcode == ZEND_FE_FETCH_R || op_array->opcodes[j].opcode == ZEND_FE_FETCH_RW) { - /* On exception FE_FETCH destroys loop vatriable itself */ + /* On exception TMP variable is destroyed by current opcode */ j++; }