# HG changeset patch # User Christian Wimmer # Date 1452287452 28800 # Node ID 50079bd51344628b9adfd7885676476d5915ee00 # Parent 760c71be4a4a22adba80dc9b3c59bcf410a0dd28 Convert deoptimize to guard also when deoptimize is behind (possibly nested) loop exit diff -r 760c71be4a4a -r 50079bd51344 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 Wed Jan 06 18:18:22 2016 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java Fri Jan 08 13:10:52 2016 -0800 @@ -155,6 +155,12 @@ } private void visitDeoptBegin(AbstractBeginNode deoptBegin, DeoptimizationAction deoptAction, DeoptimizationReason deoptReason, JavaConstant speculation, StructuredGraph graph) { + if (deoptBegin.predecessor() instanceof AbstractBeginNode) { + /* Walk up chains of LoopExitNodes to the "real" BeginNode that leads to deoptimization. */ + visitDeoptBegin((AbstractBeginNode) deoptBegin.predecessor(), deoptAction, deoptReason, speculation, graph); + return; + } + if (deoptBegin instanceof AbstractMergeNode) { AbstractMergeNode mergeNode = (AbstractMergeNode) deoptBegin; Debug.log("Visiting %s", mergeNode);