Mercurial > hg > graal-compiler
changeset 8384:0edb2a515cb1
Fixes a corner case when killing the control flowing into a deoptimize node.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Tue, 19 Mar 2013 20:48:28 +0100 |
parents | b4dea2fa8d9b |
children | 85d4392b9e26 |
files | graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java |
diffstat | 1 files changed, 11 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- 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<EndNode> ends = mergeNode.forwardEnds().snapshot(); - for (EndNode end : ends) { - if (!end.isDeleted()) { - BeginNode beginNode = findBeginNode(end); - if (!(beginNode instanceof MergeNode)) { - visitDeoptBegin(beginNode, deopt, graph); - } - } + List<BeginNode> 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); } }