# HG changeset patch # User Gilles Duboscq # Date 1346942565 -7200 # Node ID 8886fdfde36cf6e4441798c9e4a103218c94a6a4 # Parent 7ac010ae8c977b336faa25eb904933dbc3c7d329 Factor out code that kills loop exits In this code, do not use replaceFloating to kill ValueProxies since they can be replaced by null diff -r 7ac010ae8c97 -r 8886fdfde36c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java --- 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(); } } diff -r 7ac010ae8c97 -r 8886fdfde36c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java --- 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())); + } + } } diff -r 7ac010ae8c97 -r 8886fdfde36c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java --- 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()); diff -r 7ac010ae8c97 -r 8886fdfde36c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java --- 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