|
@@ -159,11 +159,15 @@ static void loop_emit_phi(jit_State *J, IRRef1 *subst, IRRef1 *phi, IRRef nphi,
|
|
for (i = 0; i < nphi; i++) {
|
|
for (i = 0; i < nphi; i++) {
|
|
IRRef lref = phi[i];
|
|
IRRef lref = phi[i];
|
|
IRIns *ir = IR(lref);
|
|
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];
|
|
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. */
|
|
} else { /* Otherwise eliminate PHI. */
|
|
irt_clearmark(ir->t);
|
|
irt_clearmark(ir->t);
|
|
irt_clearphi(ir->t);
|
|
irt_clearphi(ir->t);
|