diff --git a/src/lj_opt_loop.c b/src/lj_opt_loop.c index 0e03205f..d1512468 100644 --- a/src/lj_opt_loop.c +++ b/src/lj_opt_loop.c @@ -159,11 +159,15 @@ static void loop_emit_phi(jit_State *J, IRRef1 *subst, IRRef1 *phi, IRRef nphi, for (i = 0; i < nphi; i++) { IRRef lref = phi[i]; IRIns *ir = IR(lref); - if (!irt_ismarked(ir->t)) { /* Emit PHI if not marked. */ + if (!irt_ismarked(ir->t)) { /* Emit PHI if not marked and not redundant. */ IRRef rref = subst[lref]; - if (rref > invar) - irt_setphi(IR(rref)->t); - emitir_raw(IRT(IR_PHI, irt_type(ir->t)), lref, rref); + if (lref == rref) { + irt_clearphi(ir->t); + } else { + if (rref > invar) + irt_setphi(IR(rref)->t); + emitir_raw(IRT(IR_PHI, irt_type(ir->t)), lref, rref); + } } else { /* Otherwise eliminate PHI. */ irt_clearmark(ir->t); irt_clearphi(ir->t);