changeset 15204:4d19ee79fcee

Fix loop peeling problem with VirtualState: duplicate states deeply and only clear the parts of the exit's state that's not used by the duplicated nodes.
author Gilles Duboscq <duboscq@ssw.jku.at>
date Thu, 17 Apr 2014 17:16:05 +0200
parents a40e775ecb83
children affef8631cf4
files graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragment.java graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java
diffstat 2 files changed, 10 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragment.java	Thu Apr 17 15:43:50 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragment.java	Thu Apr 17 17:16:05 2014 +0200
@@ -29,7 +29,6 @@
 import com.oracle.graal.graph.Graph.DuplicationReplacement;
 import com.oracle.graal.graph.iterators.*;
 import com.oracle.graal.nodes.*;
-import com.oracle.graal.nodes.VirtualState.VirtualClosure;
 import com.oracle.graal.nodes.cfg.*;
 import com.oracle.graal.nodes.java.*;
 import com.oracle.graal.nodes.virtual.*;
@@ -168,7 +167,7 @@
                 if (n instanceof StateSplit) {
                     FrameState stateAfter = ((StateSplit) n).stateAfter();
                     if (stateAfter != null) {
-                        nodes.mark(stateAfter);
+                        stateAfter.applyToVirtual(node -> nodes.mark(node));
                     }
                 }
                 nodes.mark(n);
@@ -181,14 +180,7 @@
 
             FrameState stateAfter = earlyExit.stateAfter();
             if (stateAfter != null) {
-                nodes.mark(stateAfter);
-                stateAfter.applyToVirtual(new VirtualClosure() {
-
-                    @Override
-                    public void apply(VirtualState node) {
-                        nodes.mark(node);
-                    }
-                });
+                stateAfter.applyToVirtual(node -> nodes.mark(node));
             }
             nodes.mark(earlyExit);
             for (ProxyNode proxy : earlyExit.proxies()) {
@@ -342,19 +334,11 @@
                  * VirtualState nodes contained in the old exit's state may be shared by other
                  * dominated VirtualStates. Those dominated virtual states need to see the
                  * proxy->phi update that are applied below.
-                 *
+                 * 
                  * We now update the original fragment's nodes accordingly:
                  */
-                state.applyToVirtual(new VirtualClosure() {
-                    public void apply(VirtualState node) {
-                        original.nodes.clear(node);
-                    }
-                });
-                exitState.applyToVirtual(new VirtualClosure() {
-                    public void apply(VirtualState node) {
-                        original.nodes.mark(node);
-                    }
-                });
+                state.applyToVirtual(node -> original.nodes.clear(node));
+                exitState.applyToVirtual(node -> original.nodes.mark(node));
             }
             FrameState finalExitState = exitState;
 
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java	Thu Apr 17 15:43:50 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java	Thu Apr 17 17:16:05 2014 +0200
@@ -113,7 +113,11 @@
             for (LoopExitNode exit : exits()) {
                 FrameState exitState = exit.stateAfter();
                 if (exitState != null) {
-                    exitState.applyToVirtual(v -> nodes.clear(v));
+                    exitState.applyToVirtual(v -> {
+                        if (v.usages().filter(n -> nodes.isMarked(n) && !(n instanceof VirtualState && exitState.isPartOfThisState((VirtualState) n))).isEmpty()) {
+                            nodes.clear(v);
+                        }
+                    });
                 }
                 for (ProxyNode proxy : exit.proxies()) {
                     nodes.clear(proxy);