Mercurial > hg > truffle
diff graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java @ 4614:a3882fd1ae61
Make it possible to have multiple LoopEnds per LoopBegin
Factor out the 2 versions of KillCFG (GraphUitl/Canonicalizer)
Remove unused loop detection code from FloatingReadPhase
Made InvokeNode's toString/getDebugProperties more robust
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Thu, 16 Feb 2012 11:57:38 +0100 |
parents | 8220fa69f075 |
children | 7ccdae96e98a |
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Wed Feb 15 20:09:25 2012 +0100 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Thu Feb 16 11:57:38 2012 +0100 @@ -43,9 +43,9 @@ // remove chained Merges for (MergeNode merge : graph.getNodes(MergeNode.class)) { - if (merge.endCount() == 1 && !(merge instanceof LoopBeginNode)) { + if (merge.forwardEndCount() == 1 && !(merge instanceof LoopBeginNode)) { replacePhis(merge); - EndNode endNode = merge.endAt(0); + EndNode endNode = merge.forwardEndAt(0); FixedNode next = merge.next(); merge.safeDelete(); endNode.replaceAndDelete(next); @@ -76,21 +76,21 @@ } } } - for (LoopEndNode node : graph.getNodes(LoopEndNode.class)) { - if (!flood.isMarked(node)) { - LoopBeginNode loop = node.loopBegin(); - if (flood.isMarked(loop)) { + for (LoopBeginNode loop : graph.getNodes(LoopBeginNode.class)) { + if (flood.isMarked(loop)) { + boolean reachable = false; + for (LoopEndNode end : loop.loopEnds()) { + if (flood.isMarked(end)) { + reachable = true; + break; + } + } + if (!reachable) { Debug.log("Removing loop with unreachable end: %s", loop); - node.setLoopBegin(null); - EndNode endNode = loop.endAt(0); - assert endNode.predecessor() != null; - replacePhis(loop); - loop.removeEnd(endNode); - - FixedNode next = loop.next(); - loop.setNext(null); - endNode.replaceAndDelete(next); - loop.safeDelete(); + for (LoopEndNode end : loop.loopEnds().snapshot()) { + loop.removeEnd(end); + } + graph.reduceDegenerateLoopBegin(loop); } } }