changeset 6318:8886fdfde36c

Factor out code that kills loop exits In this code, do not use replaceFloating to kill ValueProxies since they can be replaced by null
author Gilles Duboscq <duboscq@ssw.jku.at>
date Thu, 06 Sep 2012 16:42:45 +0200
parents 7ac010ae8c97
children 0a0d0dfd83bc
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java
diffstat 4 files changed, 13 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java	Tue Sep 04 17:10:42 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java	Thu Sep 06 16:42:45 2012 +0200
@@ -107,9 +107,10 @@
     }
 
     public void removeProxies() {
-        StructuredGraph graph = (StructuredGraph) graph();
         for (ValueProxyNode vpn : proxies().snapshot()) {
-            graph.replaceFloating(vpn, vpn.value());
+            // can not use graph.replaceFloating because vpn.value may be null during killCFG
+            vpn.replaceAtUsages(vpn.value());
+            vpn.safeDelete();
         }
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java	Tue Sep 04 17:10:42 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java	Thu Sep 06 16:42:45 2012 +0200
@@ -161,4 +161,12 @@
     public boolean isLoopExit(BeginNode begin) {
         return begin instanceof LoopExitNode && ((LoopExitNode) begin).loopBegin() == this;
     }
+
+    public void removeExits() {
+        StructuredGraph graph = (StructuredGraph) graph();
+        for (LoopExitNode loopexit : loopExits().snapshot()) {
+            loopexit.removeProxies();
+            graph.replaceFixedWithFixed(loopexit, graph.add(new BeginNode()));
+        }
+    }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java	Tue Sep 04 17:10:42 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java	Thu Sep 06 16:42:45 2012 +0200
@@ -346,10 +346,7 @@
         FrameState stateAfter = merge.stateAfter();
         // remove loop exits
         if (merge instanceof LoopBeginNode) {
-            for (LoopExitNode exit : ((LoopBeginNode) merge).loopExits().snapshot()) {
-                exit.removeProxies();
-                replaceFixedWithFixed(exit, this.add(new BeginNode()));
-            }
+            ((LoopBeginNode) merge).removeExits();
         }
         // evacuateGuards
         merge.prepareDelete((FixedNode) singleEnd.predecessor());
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Tue Sep 04 17:10:42 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Thu Sep 06 16:42:45 2012 +0200
@@ -75,12 +75,7 @@
                     loopend.predecessor().replaceFirstSuccessor(loopend, null);
                     loopend.safeDelete();
                 }
-                for (LoopExitNode loopexit : begin.loopExits().snapshot()) {
-                    for (ValueProxyNode vpn : loopexit.proxies().snapshot()) {
-                        graph.replaceFloating(vpn, vpn.value());
-                    }
-                    graph.replaceFixedWithFixed(loopexit, graph.add(new BeginNode()));
-                }
+                begin.removeExits();
                 killCFG(begin.next());
                 begin.safeDelete();
             } else if (merge instanceof LoopBeginNode && ((LoopBeginNode) merge).loopEnds().isEmpty()) { // not a loop anymore