# HG changeset patch # User Gilles Duboscq # Date 1404474457 -7200 # Node ID fe985eebfcd96b1f64116dc273aa0ee7041d1952 # Parent 39f9f052e5a8821f371e98805810060c0b3d8bb4 ConvertDeoptimizeToGuardPhase: remove useless BeginNodes diff -r 39f9f052e5a8 -r fe985eebfcd9 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java --- 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 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);