changeset 16351:3e341c30e5c0

No need to duplicate the loop begin's state for LoopFragmentInside
author Gilles Duboscq <duboscq@ssw.jku.at>
date Tue, 01 Jul 2014 18:26:08 +0200
parents 6055f84e41d7
children 00460aab5c96
files graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java
diffstat 1 files changed, 22 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java	Tue Jul 01 18:10:27 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java	Tue Jul 01 18:26:08 2014 +0200
@@ -113,15 +113,9 @@
             for (PhiNode phi : loopBegin.phis()) {
                 nodes.clear(phi);
             }
+            clearStateNodes(loopBegin);
             for (LoopExitNode exit : exits()) {
-                FrameState exitState = exit.stateAfter();
-                if (exitState != null) {
-                    exitState.applyToVirtual(v -> {
-                        if (v.usages().filter(n -> nodes.isMarked(n) && n != exit).isEmpty()) {
-                            nodes.clear(v);
-                        }
-                    });
-                }
+                clearStateNodes(exit);
                 for (ProxyNode proxy : exit.proxies()) {
                     nodes.clear(proxy);
                 }
@@ -130,6 +124,17 @@
         return nodes;
     }
 
+    private void clearStateNodes(StateSplit stateSplit) {
+        FrameState loopState = stateSplit.stateAfter();
+        if (loopState != null) {
+            loopState.applyToVirtual(v -> {
+                if (v.usages().filter(n -> nodes.isMarked(n) && n != stateSplit).isEmpty()) {
+                    nodes.clear(v);
+                }
+            });
+        }
+    }
+
     public NodeIterable<LoopExitNode> exits() {
         return loop().loopBegin().loopExits();
     }
@@ -202,14 +207,12 @@
 
         NodeBitMap usagesToPatch = nodes.copy();
         for (LoopExitNode exit : exits()) {
-            FrameState exitState = exit.stateAfter();
-            if (exitState != null) {
-                exitState.applyToVirtual(v -> usagesToPatch.markAndGrow(v));
-            }
+            markStateNodes(exit, usagesToPatch);
             for (ProxyNode proxy : exit.proxies()) {
                 usagesToPatch.markAndGrow(proxy);
             }
         }
+        markStateNodes(loopBegin, usagesToPatch);
 
         for (PhiNode phi : loopBegin.phis().snapshot()) {
             if (phi.usages().isEmpty()) {
@@ -259,6 +262,13 @@
         }
     }
 
+    private static void markStateNodes(StateSplit stateSplit, NodeBitMap marks) {
+        FrameState exitState = stateSplit.stateAfter();
+        if (exitState != null) {
+            exitState.applyToVirtual(v -> marks.markAndGrow(v));
+        }
+    }
+
     /**
      * Gets the corresponding value in this fragment.
      *