Mercurial > hg > truffle
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