changeset 23240:6b75e88713cc

Move proxy handling from AbstractBeginNode to LoopExitNode.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Fri, 01 Jan 2016 18:50:05 +0100
parents aeb81e02fc3d
children 6186cfd47d3c
files graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/IfCanonicalizerTest.java graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MonitorGraphTest.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractMergeNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopExitNode.java
diffstat 6 files changed, 49 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/IfCanonicalizerTest.java	Fri Jan 01 18:44:10 2016 +0100
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/IfCanonicalizerTest.java	Fri Jan 01 18:50:05 2016 +0100
@@ -22,8 +22,6 @@
  */
 package com.oracle.graal.compiler.test;
 
-import static com.oracle.graal.graph.iterators.NodePredicates.isNotA;
-
 import org.junit.Test;
 
 import com.oracle.graal.debug.Debug;
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MonitorGraphTest.java	Fri Jan 01 18:44:10 2016 +0100
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MonitorGraphTest.java	Fri Jan 01 18:50:05 2016 +0100
@@ -22,8 +22,6 @@
  */
 package com.oracle.graal.compiler.test;
 
-import static com.oracle.graal.graph.iterators.NodePredicates.isNotA;
-
 import java.util.HashMap;
 import java.util.Map;
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java	Fri Jan 01 18:44:10 2016 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java	Fri Jan 01 18:50:05 2016 +0100
@@ -78,26 +78,9 @@
     }
 
     public void prepareDelete(FixedNode evacuateFrom) {
-        removeProxies();
         evacuateGuards(evacuateFrom);
     }
 
-    public void removeProxies() {
-        if (this.hasUsages()) {
-            outer: while (true) {
-                for (ProxyNode vpn : proxies().snapshot()) {
-                    ValueNode value = vpn.value();
-                    vpn.replaceAtUsagesAndDelete(value);
-                    if (value == this) {
-                        // Guard proxy could have this input as value.
-                        continue outer;
-                    }
-                }
-                break;
-            }
-        }
-    }
-
     @Override
     public boolean verify() {
         assertTrue(predecessor() != null || this == graph().start() || this instanceof AbstractMergeNode, "begin nodes must be connected");
@@ -114,24 +97,7 @@
     }
 
     public NodeIterable<Node> anchored() {
-        return usages().filter(n -> {
-            if (n instanceof ProxyNode) {
-                ProxyNode proxyNode = (ProxyNode) n;
-                return proxyNode.proxyPoint() != this;
-            }
-            return true;
-        });
-    }
-
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    public NodeIterable<ProxyNode> proxies() {
-        return (NodeIterable) usages().filter(n -> {
-            if (n instanceof ProxyNode) {
-                ProxyNode proxyNode = (ProxyNode) n;
-                return proxyNode.proxyPoint() == this;
-            }
-            return false;
-        });
+        return usages();
     }
 
     public NodeIterable<FixedNode> getBlockNodes() {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractMergeNode.java	Fri Jan 01 18:44:10 2016 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractMergeNode.java	Fri Jan 01 18:50:05 2016 +0100
@@ -22,8 +22,6 @@
  */
 package com.oracle.graal.nodes;
 
-import static com.oracle.graal.graph.iterators.NodePredicates.isNotA;
-
 import java.util.List;
 
 import com.oracle.graal.debug.Debug;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Fri Jan 01 18:44:10 2016 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Fri Jan 01 18:50:05 2016 +0100
@@ -847,8 +847,9 @@
     }
 
     private static void transferProxies(AbstractBeginNode successor, MergeNode falseMerge) {
-        if (falseMerge != null) {
-            for (ProxyNode proxy : successor.proxies().snapshot()) {
+        if (successor instanceof LoopExitNode && falseMerge != null) {
+            LoopExitNode loopExitNode = (LoopExitNode) successor;
+            for (ProxyNode proxy : loopExitNode.proxies().snapshot()) {
                 proxy.replaceFirstInput(successor, falseMerge);
             }
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopExitNode.java	Fri Jan 01 18:44:10 2016 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopExitNode.java	Fri Jan 01 18:50:05 2016 +0100
@@ -25,6 +25,7 @@
 import com.oracle.graal.graph.IterableNodeType;
 import com.oracle.graal.graph.Node;
 import com.oracle.graal.graph.NodeClass;
+import com.oracle.graal.graph.iterators.NodeIterable;
 import com.oracle.graal.graph.spi.Simplifiable;
 import com.oracle.graal.graph.spi.SimplifierTool;
 import com.oracle.graal.nodeinfo.InputType;
@@ -47,6 +48,50 @@
     }
 
     @Override
+    public NodeIterable<Node> anchored() {
+        return super.anchored().filter(n -> {
+            if (n instanceof ProxyNode) {
+                ProxyNode proxyNode = (ProxyNode) n;
+                return proxyNode.proxyPoint() != this;
+            }
+            return true;
+        });
+    }
+
+    @Override
+    public void prepareDelete(FixedNode evacuateFrom) {
+        removeProxies();
+        super.prepareDelete(evacuateFrom);
+    }
+
+    public void removeProxies() {
+        if (this.hasUsages()) {
+            outer: while (true) {
+                for (ProxyNode vpn : proxies().snapshot()) {
+                    ValueNode value = vpn.value();
+                    vpn.replaceAtUsagesAndDelete(value);
+                    if (value == this) {
+                        // Guard proxy could have this input as value.
+                        continue outer;
+                    }
+                }
+                break;
+            }
+        }
+    }
+
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    public NodeIterable<ProxyNode> proxies() {
+        return (NodeIterable) usages().filter(n -> {
+            if (n instanceof ProxyNode) {
+                ProxyNode proxyNode = (ProxyNode) n;
+                return proxyNode.proxyPoint() == this;
+            }
+            return false;
+        });
+    }
+
+    @Override
     public void simplify(SimplifierTool tool) {
         Node prev = this.predecessor();
         while (tool.allUsagesAvailable() && prev instanceof BeginNode && prev.hasNoUsages()) {