]> granicus.if.org Git - php/commitdiff
Improve zend_check_live_ranges()
authorDmitry Stogov <dmitry@zend.com>
Fri, 7 Dec 2018 15:15:14 +0000 (18:15 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 7 Dec 2018 15:15:14 +0000 (18:15 +0300)
Zend/zend_compile.c

index 70ce4346930ad24adaff3187436f86bcecef7c92..41a01e12a66caf6a31e49ad0c1713fc3f4d7a064 100644 (file)
@@ -1913,10 +1913,9 @@ static zend_always_inline int zend_is_def_range(zend_op *opline, zend_uchar type
 }
 /* }}} */
 
-static void zend_check_live_ranges(zend_op *opline) /* {{{ */
+static void zend_check_live_ranges_op1(zend_op *opline) /* {{{ */
 {
-       if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) &&
-               !zend_is_def_range(opline - 1, opline->op1_type, opline->op1.var)) {
+       if (!zend_is_def_range(opline - 1, opline->op1_type, opline->op1.var)) {
 
                if (opline->opcode == ZEND_OP_DATA) {
                        if (!zend_is_def_range(opline - 2, opline->op1_type, opline->op1.var)) {
@@ -1946,9 +1945,12 @@ static void zend_check_live_ranges(zend_op *opline) /* {{{ */
                        zend_find_live_range(opline, opline->op1_type, opline->op1.var);
                }
        }
+}
+/* }}} */
 
-       if ((opline->op2_type & (IS_VAR|IS_TMP_VAR)) &&
-               !zend_is_def_range(opline - 1, opline->op2_type, opline->op2.var)) {
+static void zend_check_live_ranges_op2(zend_op *opline) /* {{{ */
+{
+       if (!zend_is_def_range(opline - 1, opline->op2_type, opline->op2.var)) {
 
                if (opline->opcode == ZEND_OP_DATA) {
                        if (!zend_is_def_range(opline - 2, opline->op2_type, opline->op2.var)) {
@@ -1971,6 +1973,17 @@ static void zend_check_live_ranges(zend_op *opline) /* {{{ */
 }
 /* }}} */
 
+static void zend_check_live_ranges(zend_op *opline) /* {{{ */
+{
+       if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) {
+               zend_check_live_ranges_op1(opline);
+       }
+       if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) {
+               zend_check_live_ranges_op2(opline);
+       }
+}
+/* }}} */
+
 static zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2) /* {{{ */
 {
        zend_op *opline = get_next_op();
@@ -1978,14 +1991,18 @@ static zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode
 
        if (op1 != NULL) {
                SET_NODE(opline->op1, op1);
+               if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) {
+                       zend_check_live_ranges_op1(opline);
+               }
        }
 
        if (op2 != NULL) {
                SET_NODE(opline->op2, op2);
+               if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) {
+                       zend_check_live_ranges_op2(opline);
+               }
        }
 
-       zend_check_live_ranges(opline);
-
        if (result) {
                zend_make_var_result(result, opline);
        }
@@ -2000,14 +2017,18 @@ static zend_op *zend_emit_op_tmp(znode *result, zend_uchar opcode, znode *op1, z
 
        if (op1 != NULL) {
                SET_NODE(opline->op1, op1);
+               if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) {
+                       zend_check_live_ranges_op1(opline);
+               }
        }
 
        if (op2 != NULL) {
                SET_NODE(opline->op2, op2);
+               if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) {
+                       zend_check_live_ranges_op2(opline);
+               }
        }
 
-       zend_check_live_ranges(opline);
-
        if (result) {
                zend_make_tmp_result(result, opline);
        }