@@ -1354,13 +1354,6 @@ static bool zend_jit_spilling_may_cause_conflict(zend_jit_ctx *jit, int var, ir_
13541354 && (jit->ssa->cfg.blocks[jit->ssa->vars[jit->ssa->ops[jit->ssa->vars[var].definition].op1_use].definition_phi->block].flags & ZEND_BB_LOOP_HEADER)) {
13551355 /* Avoid moving spill store out of loop */
13561356 return 1;
1357- } else if (jit->ssa->vars[var].definition >= 0
1358- && jit->ssa->ops[jit->ssa->vars[var].definition].op1_def == var
1359- && jit->ssa->ops[jit->ssa->vars[var].definition].op1_use >= 0
1360- && jit->ssa->ops[jit->ssa->vars[var].definition].op2_use >= 0
1361- && jit->ra[jit->ssa->ops[jit->ssa->vars[var].definition].op2_use].ref == val) {
1362- /* Avoid spill conflict between of ASSIGN.op1_def and ASSIGN.op1_use */
1363- return 1;
13641357 }
13651358 return 0;
13661359 }
@@ -1387,6 +1380,14 @@ static void zend_jit_def_reg(zend_jit_ctx *jit, zend_jit_addr addr, ir_ref val)
13871380 val = ir_emit2(&jit->ctx, IR_OPT(IR_COPY, jit->ctx.ir_base[val].type), val, 1);
13881381 }
13891382 }
1383+ if (jit->ssa->vars[var].var < jit->current_op_array->last_var
1384+ && jit->ssa->vars[var].definition >= 0
1385+ && jit->ssa->ops[jit->ssa->vars[var].definition].op1_def == var
1386+ && jit->ssa->ops[jit->ssa->vars[var].definition].op1_use >= 0
1387+ && jit->ssa->ops[jit->ssa->vars[var].definition].op2_use >= 0
1388+ && jit->ra[jit->ssa->ops[jit->ssa->vars[var].definition].op2_use].ref == val) {
1389+ val = ir_emit2(&jit->ctx, IR_OPT(IR_COPY, jit->ctx.ir_base[val].type), val, 1);
1390+ }
13901391 if (!zend_jit_spilling_may_cause_conflict(jit, var, val)) {
13911392 val = ir_bind(&jit->ctx, -EX_NUM_TO_VAR(jit->ssa->vars[var].var), val);
13921393 }
0 commit comments