# HG changeset patch # User Thomas Wuerthinger # Date 1363722508 -3600 # Node ID 0edb2a515cb1ac800c875f5f1fc68a7222d60d48 # Parent b4dea2fa8d9b87797c7a259d491e5f0e8a9e36ff Fixes a corner case when killing the control flowing into a deoptimize node. diff -r b4dea2fa8d9b -r 0edb2a515cb1 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 Tue Mar 19 18:05:49 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java Tue Mar 19 20:48:28 2013 +0100 @@ -51,6 +51,7 @@ } for (DeoptimizeNode d : graph.getNodes(DeoptimizeNode.class)) { + assert d.isAlive(); visitDeoptBegin(findBeginNode(d), d, graph); } @@ -61,21 +62,15 @@ if (deoptBegin instanceof MergeNode) { MergeNode mergeNode = (MergeNode) deoptBegin; Debug.log("Visiting %s followed by %s", mergeNode, deopt); - List ends = mergeNode.forwardEnds().snapshot(); - for (EndNode end : ends) { - if (!end.isDeleted()) { - BeginNode beginNode = findBeginNode(end); - if (!(beginNode instanceof MergeNode)) { - visitDeoptBegin(beginNode, deopt, graph); - } - } + List begins = new ArrayList<>(); + for (EndNode end : mergeNode.forwardEnds()) { + begins.add(findBeginNode(end)); } - if (mergeNode.isDeleted()) { - if (!deopt.isDeleted()) { - Debug.log("Merge deleted, deopt moved to %s", findBeginNode(deopt)); - visitDeoptBegin(findBeginNode(deopt), deopt, graph); - } + for (BeginNode begin : begins) { + assert !begin.isDeleted(); + visitDeoptBegin(begin, deopt, graph); } + assert mergeNode.isDeleted(); return; } else if (deoptBegin.predecessor() instanceof IfNode) { IfNode ifNode = (IfNode) deoptBegin.predecessor(); @@ -104,7 +99,9 @@ if (next != deopt) { FixedWithNextNode pred = (FixedWithNextNode) deopt.predecessor(); pred.setNext(null); - deoptBegin.setNext(deopt); + DeoptimizeNode newDeoptNode = (DeoptimizeNode) deopt.clone(graph); + deoptBegin.setNext(newDeoptNode); + assert deoptBegin == newDeoptNode.predecessor(); GraphUtil.killCFG(next); } }