changeset 23274:50079bd51344

Convert deoptimize to guard also when deoptimize is behind (possibly nested) loop exit
author Christian Wimmer <christian.wimmer@oracle.com>
date Fri, 08 Jan 2016 13:10:52 -0800
parents 760c71be4a4a
children a886e9dc3a47
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java
diffstat 1 files changed, 6 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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);