Mercurial > hg > truffle
changeset 5095:57ae0b1cc74a
Fix possible endless recursion in ConvertDeoptimizeToGuardPhase.
author | Andreas Woess <andreas.woess@jku.at> |
---|---|
date | Fri, 16 Mar 2012 19:23:43 +0100 |
parents | d3f547b08304 |
children | 56a53c80ad2b |
files | graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java |
diffstat | 1 files changed, 11 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java Fri Mar 16 20:23:29 2012 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java Fri Mar 16 19:23:43 2012 +0100 @@ -49,25 +49,30 @@ } for (DeoptimizeNode d : graph.getNodes(DeoptimizeNode.class)) { - visitDeoptBranch(findBeginNode(d), d, graph); + visitDeoptBegin(findBeginNode(d), d, graph); } new DeadCodeEliminationPhase().apply(graph); } - private void visitDeoptBranch(BeginNode deoptBegin, DeoptimizeNode deopt, StructuredGraph graph) { + private void visitDeoptBegin(BeginNode deoptBegin, DeoptimizeNode deopt, StructuredGraph graph) { if (deoptBegin instanceof MergeNode) { MergeNode mergeNode = (MergeNode) deoptBegin; - Debug.log("Eliminating %s followed by %s", mergeNode, deopt); + 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); - visitDeoptBranch(beginNode, deopt, graph); + if (!(beginNode instanceof MergeNode)) { + visitDeoptBegin(beginNode, deopt, graph); + } } } - if (!deopt.isDeleted()) { - visitDeoptBranch(findBeginNode(deopt), deopt, graph); + if (mergeNode.isDeleted()) { + if (!deopt.isDeleted()) { + Debug.log("Merge deleted, deopt moved to %s", findBeginNode(deopt)); + visitDeoptBegin(findBeginNode(deopt), deopt, graph); + } } } else if (deoptBegin.predecessor() instanceof IfNode) { IfNode ifNode = (IfNode) deoptBegin.predecessor();