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);
         }
     }