Mercurial > hg > graal-compiler
changeset 15417:b2381f53c77f
pass SimplifierTool to GraphUtil.killCFG
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Mon, 28 Apr 2014 16:22:25 +0200 |
parents | 89ff116d8956 |
children | 46c51b5d0abb |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java |
diffstat | 2 files changed, 20 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- 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); } }
--- 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); } /**