]> granicus.if.org Git - php/commitdiff
Shrink live intervals of IS_VAR/IS_TMP_VAR
authorDmitry Stogov <dmitry@zend.com>
Wed, 19 Aug 2020 11:53:01 +0000 (14:53 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 19 Aug 2020 11:53:01 +0000 (14:53 +0300)
ext/opcache/jit/zend_jit_trace.c

index b331b895270e504872e46127dfea4f5390fc50e0..29684a4085fa9c2aa7d41ff56d71a1f4cfeb6d83 100644 (file)
@@ -2105,9 +2105,25 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
                         && !zend_ssa_is_no_val_use(opline, ssa_op, ssa_op->op1_use)) {
                                if (support_opline) {
                                        zend_jit_trace_use_var(idx, ssa_op->op1_use, ssa_op->op1_def, ssa_op->op1_use_chain, start, end, flags, ssa, ssa_opcodes, op_array, op_array_ssa);
-                                       if (opline->opcode == ZEND_CASE && opline->op1_type != IS_CV) {
-                                               /* The value may be used outside of the trace */
-                                               flags[ssa_op->op1_use] |= ZREG_STORE;
+                                       if (opline->op1_type != IS_CV) {
+                                               if (opline->opcode == ZEND_CASE
+                                                || opline->opcode == ZEND_CASE_STRICT
+                                                || opline->opcode == ZEND_SWITCH_LONG
+                                                || opline->opcode == ZEND_MATCH
+                                                || opline->opcode == ZEND_FETCH_LIST_R
+                                                || opline->opcode == ZEND_COPY_TMP
+                                                || opline->opcode == ZEND_SWITCH_STRING
+                                                || opline->opcode == ZEND_FE_FETCH_R
+                                                || opline->opcode == ZEND_FE_FETCH_RW
+                                                || opline->opcode == ZEND_FETCH_LIST_W
+                                                || opline->opcode == ZEND_VERIFY_RETURN_TYPE
+                                                || opline->opcode == ZEND_BIND_LEXICAL
+                                                || opline->opcode == ZEND_ROPE_ADD) {
+                                                       /* The value is kept alive and may be used outside of the trace */
+                                                       flags[ssa_op->op1_use] |= ZREG_STORE;
+                                               } else {
+                                                       flags[ssa_op->op1_use] |= ZREG_LAST_USE;
+                                               }
                                        }
                                } else {
                                        start[ssa_op->op1_use] = -1;
@@ -2121,6 +2137,9 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
                         && !zend_ssa_is_no_val_use(opline, ssa_op, ssa_op->op2_use)) {
                                if (support_opline) {
                                        zend_jit_trace_use_var(idx, ssa_op->op2_use, ssa_op->op2_def, ssa_op->op2_use_chain, start, end, flags, ssa, ssa_opcodes, op_array, op_array_ssa);
+                                       if (opline->op2_type != IS_CV) {
+                                               flags[ssa_op->op2_use] |= ZREG_LAST_USE;
+                                       }
                                } else {
                                        start[ssa_op->op2_use] = -1;
                                        end[ssa_op->op2_use] = -1;
@@ -2215,6 +2234,9 @@ static zend_lifetime_interval** zend_jit_trace_allocate_registers(zend_jit_trace
                                         && !zend_ssa_is_no_val_use(opline, ssa_op, ssa_op->op1_use)) {
                                                if (support_opline) {
                                                        zend_jit_trace_use_var(idx, ssa_op->op1_use, ssa_op->op1_def, ssa_op->op1_use_chain, start, end, flags, ssa, ssa_opcodes, op_array, op_array_ssa);
+                                                       if (opline->op1_type != IS_CV) {
+                                                               flags[ssa_op->op1_use] |= ZREG_LAST_USE;
+                                                       }
                                                } else {
                                                        start[ssa_op->op1_use] = -1;
                                                        end[ssa_op->op1_use] = -1;