Eliminate some rare occurrences of redundant PHIs.

This commit is contained in:
Mike Pall 2011-11-14 23:57:05 +01:00
parent 87456f73f5
commit 8437d0c48d

View File

@ -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) if (lref == rref) {
irt_setphi(IR(rref)->t); irt_clearphi(ir->t);
emitir_raw(IRT(IR_PHI, irt_type(ir->t)), lref, rref); } 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);