Browse Source

Add stricter check for sinking PHIs.

Mike Pall 13 years ago
parent
commit
c22d698e17
1 changed files with 3 additions and 2 deletions
  1. 3 2
      src/lj_opt_sink.c

+ 3 - 2
src/lj_opt_sink.c

@@ -47,7 +47,7 @@ static int sink_phidep(jit_State *J, IRRef ref)
   return 0;
   return 0;
 }
 }
 
 
-/* Check whether a value is a sinkable PHI or a non-PHI. */
+/* Check whether a value is a sinkable PHI or loop-invariant. */
 static int sink_checkphi(jit_State *J, IRIns *ira, IRRef ref)
 static int sink_checkphi(jit_State *J, IRIns *ira, IRRef ref)
 {
 {
   if (ref >= REF_FIRST) {
   if (ref >= REF_FIRST) {
@@ -57,7 +57,8 @@ static int sink_checkphi(jit_State *J, IRIns *ira, IRRef ref)
       ira->prev++;
       ira->prev++;
       return 1;  /* Sinkable PHI. */
       return 1;  /* Sinkable PHI. */
     }
     }
-    return !sink_phidep(J, ref);  /* Must be a non-PHI then. */
+    /* Otherwise the value must be loop-invariant. */
+    return ref < J->loopref && !sink_phidep(J, ref);
   }
   }
   return 1;  /* Constant (non-PHI). */
   return 1;  /* Constant (non-PHI). */
 }
 }