aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_opt_loop.c12
1 files changed, 8 insertions, 4 deletions
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,
159 for (i = 0; i < nphi; i++) { 159 for (i = 0; i < nphi; i++) {
160 IRRef lref = phi[i]; 160 IRRef lref = phi[i];
161 IRIns *ir = IR(lref); 161 IRIns *ir = IR(lref);
162 if (!irt_ismarked(ir->t)) { /* Emit PHI if not marked. */ 162 if (!irt_ismarked(ir->t)) { /* Emit PHI if not marked and not redundant. */
163 IRRef rref = subst[lref]; 163 IRRef rref = subst[lref];
164 if (rref > invar) 164 if (lref == rref) {
165 irt_setphi(IR(rref)->t); 165 irt_clearphi(ir->t);
166 emitir_raw(IRT(IR_PHI, irt_type(ir->t)), lref, rref); 166 } else {
167 if (rref > invar)
168 irt_setphi(IR(rref)->t);
169 emitir_raw(IRT(IR_PHI, irt_type(ir->t)), lref, rref);
170 }
167 } else { /* Otherwise eliminate PHI. */ 171 } else { /* Otherwise eliminate PHI. */
168 irt_clearmark(ir->t); 172 irt_clearmark(ir->t);
169 irt_clearphi(ir->t); 173 irt_clearphi(ir->t);