]> granicus.if.org Git - php/commitdiff
Fixed incorrect invariant guard motion
authorDmitry Stogov <dmitry@zend.com>
Thu, 5 Nov 2020 15:32:00 +0000 (18:32 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 5 Nov 2020 15:32:00 +0000 (18:32 +0300)
ext/opcache/jit/zend_jit_trace.c

index 7e053f5cda220a92b18d8b0c6cf7da06e337cc58..27362312e543cf8525105c474d745aefd988a0f2 100644 (file)
@@ -3488,7 +3488,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                        } else if ((info & MAY_BE_GUARD) != 0
                         && (trace_buffer->stop == ZEND_JIT_TRACE_STOP_LOOP
                          || trace_buffer->stop == ZEND_JIT_TRACE_STOP_RECURSIVE_CALL
-                         || trace_buffer->stop == ZEND_JIT_TRACE_STOP_RECURSIVE_RET)
+                         || (trace_buffer->stop == ZEND_JIT_TRACE_STOP_RECURSIVE_RET
+                          && (opline-1)->result_type == IS_VAR
+                          && EX_VAR_TO_NUM((opline-1)->result.var) == i))
                         && (ssa->vars[i].use_chain != -1
                          || (ssa->vars[i].phi_use_chain
                           && !(ssa->var_info[ssa->vars[i].phi_use_chain->ssa_var].type & MAY_BE_GUARD)))) {