diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index d8b8772f5ef..a8ba7d01abe 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -2549,7 +2549,7 @@ static zend_always_inline int _zend_update_type_info( } if (t1 & (MAY_BE_RC1|MAY_BE_RCN)) { tmp |= (t1 & (MAY_BE_RC1|MAY_BE_RCN)); - if (opline->op1_type == IS_CV) { + if (opline->opcode == ZEND_COPY_TMP || opline->op1_type == IS_CV) { tmp |= MAY_BE_RCN; } } diff --git a/Zend/Optimizer/zend_ssa.c b/Zend/Optimizer/zend_ssa.c index 5dd0c3c5886..d173f20d330 100644 --- a/Zend/Optimizer/zend_ssa.c +++ b/Zend/Optimizer/zend_ssa.c @@ -766,6 +766,14 @@ add_op1_def: //NEW_SSA_VAR(opline->op2.var) } break; + case ZEND_COPY_TMP: + if (build_flags & ZEND_SSA_RC_INFERENCE) { + ssa_ops[k].op1_def = ssa_vars_count; + var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count; + ssa_vars_count++; + //NEW_SSA_VAR(opline->op1.var) + } + break; default: break; } diff --git a/ext/opcache/tests/jit/copy_tmp_002.phpt b/ext/opcache/tests/jit/copy_tmp_002.phpt new file mode 100644 index 00000000000..4b1cee2f627 --- /dev/null +++ b/ext/opcache/tests/jit/copy_tmp_002.phpt @@ -0,0 +1,15 @@ +--TEST-- +JIT COPY_TMP: 002 +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.file_update_protection=0 +opcache.jit_buffer_size=1M +opcache.protect_memory=1 +--FILE-- + +DONE +--EXPECT-- +DONE \ No newline at end of file