Mercurial > hg > graal-jvmci-8
changeset 16404:fe985eebfcd9
ConvertDeoptimizeToGuardPhase: remove useless BeginNodes
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Fri, 04 Jul 2014 13:47:37 +0200 |
parents | 39f9f052e5a8 |
children | 9bfc4247262f |
files | graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java |
diffstat | 1 files changed, 13 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java Fri Jul 04 13:40:34 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java Fri Jul 04 13:47:37 2014 +0200 @@ -27,6 +27,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; +import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.util.*; @@ -56,10 +57,10 @@ if (graph.getNodes(DeoptimizeNode.class).isEmpty()) { return; } - + SimplifierTool simplifierTool = GraphUtil.getDefaultSimplifier(null, null, null, false); for (DeoptimizeNode d : graph.getNodes(DeoptimizeNode.class)) { assert d.isAlive(); - visitDeoptBegin(BeginNode.prevBegin(d), d.action(), d.reason(), graph); + visitDeoptBegin(BeginNode.prevBegin(d), d.action(), d.reason(), graph, simplifierTool); } for (FixedGuardNode fixedGuard : graph.getNodes(FixedGuardNode.class)) { @@ -92,7 +93,7 @@ } if (xs[i].getKind() != Kind.Object && ys[i].getKind() != Kind.Object && compare.condition().foldCondition(xs[i], ys[i], null, compare.unorderedIsTrue()) == fixedGuard.isNegated()) { - visitDeoptBegin(BeginNode.prevBegin(mergePredecessor), fixedGuard.getAction(), fixedGuard.getReason(), graph); + visitDeoptBegin(BeginNode.prevBegin(mergePredecessor), fixedGuard.getAction(), fixedGuard.getReason(), graph, simplifierTool); } } } @@ -102,21 +103,19 @@ new DeadCodeEliminationPhase().apply(graph); } - private void visitDeoptBegin(BeginNode deoptBegin, DeoptimizationAction deoptAction, DeoptimizationReason deoptReason, StructuredGraph graph) { + private void visitDeoptBegin(BeginNode deoptBegin, DeoptimizationAction deoptAction, DeoptimizationReason deoptReason, StructuredGraph graph, SimplifierTool simplifierTool) { if (deoptBegin instanceof MergeNode) { MergeNode mergeNode = (MergeNode) deoptBegin; Debug.log("Visiting %s", mergeNode); - List<BeginNode> begins = new ArrayList<>(); - for (AbstractEndNode end : mergeNode.forwardEnds()) { + FixedNode next = mergeNode.next(); + while (mergeNode.isAlive()) { + AbstractEndNode end = mergeNode.forwardEnds().first(); BeginNode newBeginNode = findBeginNode(end); - assert !begins.contains(newBeginNode); - begins.add(newBeginNode); + visitDeoptBegin(newBeginNode, deoptAction, deoptReason, graph, simplifierTool); } - for (BeginNode begin : begins) { - assert !begin.isDeleted(); - visitDeoptBegin(begin, deoptAction, deoptReason, graph); - } - assert mergeNode.isDeleted(); + assert next.isAlive(); + BeginNode newBeginNode = findBeginNode(next); + visitDeoptBegin(newBeginNode, deoptAction, deoptReason, graph, simplifierTool); return; } else if (deoptBegin.predecessor() instanceof IfNode) { IfNode ifNode = (IfNode) deoptBegin.predecessor(); @@ -147,6 +146,7 @@ } } } + survivingSuccessor.simplify(simplifierTool); Debug.log("Converting deopt on %-5s branch of %s to guard for remaining branch %s.", deoptBegin == ifNode.trueSuccessor() ? "true" : "false", ifNode, otherBegin); FixedNode next = pred.next(); pred.setNext(guard);