@@ -10591,15 +10591,11 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst,
10591
10591
}
10592
10592
}
10593
10593
10594
- if (op1_avoid_refcounting) {
10595
- SET_STACK_REG(JIT_G(current_frame)->stack,
10596
- EX_VAR_TO_NUM(opline->op1.var), ZREG_NONE);
10597
- }
10598
-
10599
10594
if ((res_info & MAY_BE_GUARD)
10600
10595
&& JIT_G(current_frame)
10601
10596
&& (op1_info & (MAY_BE_ANY|MAY_BE_UNDEF)) == MAY_BE_ARRAY) {
10602
10597
uint32_t flags = 0;
10598
+ uint32_t old_op1_info = 0;
10603
10599
uint32_t old_info;
10604
10600
zend_jit_trace_stack *stack = JIT_G(current_frame)->stack;
10605
10601
int32_t exit_point;
@@ -10613,6 +10609,7 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst,
10613
10609
flags |= ZEND_JIT_EXIT_FREE_OP2;
10614
10610
}
10615
10611
if ((opline->result_type & (IS_VAR|IS_TMP_VAR))
10612
+ && !(flags & ZEND_JIT_EXIT_FREE_OP1)
10616
10613
&& (res_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))
10617
10614
&& (ssa_op+1)->op1_use == ssa_op->result_def
10618
10615
&& !(op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF) - (MAY_BE_STRING|MAY_BE_LONG)))
@@ -10621,6 +10618,11 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst,
10621
10618
ssa->var_info[ssa_op->result_def].avoid_refcounting = 1;
10622
10619
}
10623
10620
10621
+ if (op1_avoid_refcounting) {
10622
+ old_op1_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var));
10623
+ SET_STACK_REG(stack, EX_VAR_TO_NUM(opline->op1.var), ZREG_NONE);
10624
+ }
10625
+
10624
10626
if (!(op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF) - (MAY_BE_STRING|MAY_BE_LONG)))) {
10625
10627
old_info = STACK_INFO(stack, EX_VAR_TO_NUM(opline->result.var));
10626
10628
SET_STACK_TYPE(stack, EX_VAR_TO_NUM(opline->result.var), IS_UNKNOWN);
@@ -10647,6 +10649,10 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst,
10647
10649
return 0;
10648
10650
}
10649
10651
}
10652
+
10653
+ if (op1_avoid_refcounting) {
10654
+ SET_STACK_INFO(stack, EX_VAR_TO_NUM(opline->op1.var), old_op1_info);
10655
+ }
10650
10656
}
10651
10657
10652
10658
if (op1_info & MAY_BE_REF) {
@@ -11647,6 +11653,7 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
11647
11653
| LOAD_ZVAL_ADDR r0, prop_addr
11648
11654
11649
11655
if ((opline->result_type & (IS_VAR|IS_TMP_VAR))
11656
+ && !(flags & ZEND_JIT_EXIT_FREE_OP1)
11650
11657
&& (res_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))
11651
11658
&& (ssa_op+1)->op1_use == ssa_op->result_def
11652
11659
&& zend_jit_may_avoid_refcounting(opline+1)) {
0 commit comments