# HG changeset patch # User Lukas Stadler # Date 1398694945 -7200 # Node ID b2381f53c77fbdfbeba5416b99a63fc38179d050 # Parent 89ff116d89566adf348aa383738d01f353aa2908 pass SimplifierTool to GraphUtil.killCFG diff -r 89ff116d8956 -r b2381f53c77f 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 Mon Apr 28 16:21:44 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java Mon Apr 28 16:22:25 2014 +0200 @@ -27,6 +27,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.iterators.*; +import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.java.*; @@ -42,12 +43,12 @@ } }; - public static void killCFG(Node node) { + public static void killCFG(Node node, SimplifierTool tool) { assert node.isAlive(); if (node instanceof AbstractEndNode) { // We reached a control flow end. AbstractEndNode end = (AbstractEndNode) node; - killEnd(end); + killEnd(end, tool); } else { // Normal control flow node. /* @@ -57,13 +58,17 @@ * while processing one branch. */ for (Node successor : node.successors()) { - killCFG(successor); + killCFG(successor, tool); } } propagateKill(node); } - private static void killEnd(AbstractEndNode end) { + public static void killCFG(Node node) { + killCFG(node, null); + } + + private static void killEnd(AbstractEndNode end, SimplifierTool tool) { MergeNode merge = end.merge(); if (merge != null) { merge.removeEnd(end); @@ -85,12 +90,17 @@ killCFG(loopBody); } begin.safeDelete(); - } else if (merge instanceof LoopBeginNode && ((LoopBeginNode) merge).loopEnds().isEmpty()) { // not - // a - // loop - // anymore + } else if (merge instanceof LoopBeginNode && ((LoopBeginNode) merge).loopEnds().isEmpty()) { + // not a loop anymore + if (tool != null) { + merge.phis().forEach(phi -> phi.usages().forEach(usage -> tool.addToWorkList(usage))); + } graph.reduceDegenerateLoopBegin((LoopBeginNode) merge); - } else if (merge.phiPredecessorCount() == 1) { // not a merge anymore + } else if (merge.phiPredecessorCount() == 1) { + // not a merge anymore + if (tool != null) { + merge.phis().forEach(phi -> phi.usages().forEach(usage -> tool.addToWorkList(usage))); + } graph.reduceTrivialMerge(merge); } } diff -r 89ff116d8956 -r b2381f53c77f graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java Mon Apr 28 16:21:44 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java Mon Apr 28 16:22:25 2014 +0200 @@ -346,7 +346,7 @@ @Override public void deleteBranch(Node branch) { branch.predecessor().replaceFirstSuccessor(branch, null); - GraphUtil.killCFG(branch); + GraphUtil.killCFG(branch, this); } /**