changeset 19774:5e74068c9150

iterative marking of loop phis in SchedulePhase
author Lukas Stadler <lukas.stadler@oracle.com>
date Wed, 11 Mar 2015 16:35:26 +0100
parents e66a6f8d63e3
children 905afef74a2e
files graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java
diffstat 1 files changed, 24 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java	Wed Mar 11 15:44:32 2015 +0100
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java	Wed Mar 11 16:35:26 2015 +0100
@@ -377,19 +377,34 @@
         processStack(blockToNodes, nodeToBlock, visited, stack);
 
         // Visit back input edges of loop phis.
-        for (LoopBeginNode loopBegin : graph.getNodes(LoopBeginNode.TYPE)) {
-            for (PhiNode phi : loopBegin.phis()) {
-                if (visited.isMarked(phi)) {
-                    for (int i = 0; i < loopBegin.getLoopEndCount(); ++i) {
-                        Node node = phi.valueAt(i + loopBegin.forwardEndCount());
-                        if (node != null && !visited.isMarked(node)) {
-                            stack.push(node);
-                            processStack(blockToNodes, nodeToBlock, visited, stack);
+
+        boolean changed;
+        boolean unmarkedPhi;
+        do {
+            changed = false;
+            unmarkedPhi = false;
+            for (LoopBeginNode loopBegin : graph.getNodes(LoopBeginNode.TYPE)) {
+                for (PhiNode phi : loopBegin.phis()) {
+                    if (visited.isMarked(phi)) {
+                        for (int i = 0; i < loopBegin.getLoopEndCount(); ++i) {
+                            Node node = phi.valueAt(i + loopBegin.forwardEndCount());
+                            if (node != null && !visited.isMarked(node)) {
+                                changed = true;
+                                stack.push(node);
+                                processStack(blockToNodes, nodeToBlock, visited, stack);
+                            }
                         }
+                    } else {
+                        unmarkedPhi = true;
                     }
                 }
             }
-        }
+
+            /*
+             * the processing of one loop phi could have marked a previously checked loop phi,
+             * therefore this needs to be iterative.
+             */
+        } while (unmarkedPhi && changed);
 
         // Check for dead nodes.
         if (visited.getCounter() < graph.getNodeCount()) {