]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Fix handling of redundant PHIs.
authorMike Pall <mike>
Sat, 26 Oct 2013 15:31:23 +0000 (17:31 +0200)
committerMike Pall <mike>
Sat, 26 Oct 2013 15:31:23 +0000 (17:31 +0200)
src/lj_opt_loop.c

index 3a119f4703e6b8e3834cfb4b6da7be61d08a5da5..fa5e03e4f9640b007b1230e8aeafffa56260936a 100644 (file)
@@ -105,20 +105,24 @@ static void loop_emit_phi(jit_State *J, IRRef1 *subst, IRRef1 *phi, IRRef nphi,
                          SnapNo onsnap)
 {
   int passx = 0;
-  IRRef i, nslots;
+  IRRef i, j, nslots;
   IRRef invar = J->chain[IR_LOOP];
   /* Pass #1: mark redundant and potentially redundant PHIs. */
-  for (i = 0; i < nphi; i++) {
+  for (i = 0, j = 0; i < nphi; i++) {
     IRRef lref = phi[i];
     IRRef rref = subst[lref];
     if (lref == rref || rref == REF_DROP) {  /* Invariants are redundant. */
-      irt_setmark(IR(lref)->t);
-    } else if (!(IR(rref)->op1 == lref || IR(rref)->op2 == lref)) {
-      /* Quick check for simple recurrences failed, need pass2. */
-      irt_setmark(IR(lref)->t);
-      passx = 1;
+      irt_clearphi(IR(lref)->t);
+    } else {
+      phi[j++] = (IRRef1)lref;
+      if (!(IR(rref)->op1 == lref || IR(rref)->op2 == lref)) {
+       /* Quick check for simple recurrences failed, need pass2. */
+       irt_setmark(IR(lref)->t);
+       passx = 1;
+      }
     }
   }
+  nphi = j;
   /* Pass #2: traverse variant part and clear marks of non-redundant PHIs. */
   if (passx) {
     SnapNo s;
@@ -174,15 +178,10 @@ static void loop_emit_phi(jit_State *J, IRRef1 *subst, IRRef1 *phi, IRRef nphi,
       IRRef lref = phi[i];
       IRIns *ir = IR(lref);
       if (!irt_ismarked(ir->t)) {  /* Propagate only from unmarked PHIs. */
-       IRRef rref = subst[lref];
-       if (lref == rref) {  /* Mark redundant PHI. */
-         irt_setmark(ir->t);
-       } else {
-         IRIns *irr = IR(rref);
-         if (irt_ismarked(irr->t)) {  /* Right ref points to other PHI? */
-           irt_clearmark(irr->t);  /* Mark that PHI as non-redundant. */
-           passx = 1;  /* Retry. */
-         }
+       IRIns *irr = IR(subst[lref]);
+       if (irt_ismarked(irr->t)) {  /* Right ref points to other PHI? */
+         irt_clearmark(irr->t);  /* Mark that PHI as non-redundant. */
+         passx = 1;  /* Retry. */
        }
       }
     }