diff graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java @ 8382:496db8bf756d

Killing cfg path to deoptimization.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Tue, 19 Mar 2013 18:05:35 +0100
parents 0269ef50021f
children 0edb2a515cb1
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java	Tue Mar 19 14:13:51 2013 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java	Tue Mar 19 18:05:35 2013 +0100
@@ -28,6 +28,7 @@
 import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.java.*;
+import com.oracle.graal.nodes.util.*;
 import com.oracle.graal.phases.*;
 
 public class ConvertDeoptimizeToGuardPhase extends Phase {
@@ -75,27 +76,36 @@
                     visitDeoptBegin(findBeginNode(deopt), deopt, graph);
                 }
             }
+            return;
         } else if (deoptBegin.predecessor() instanceof IfNode) {
             IfNode ifNode = (IfNode) deoptBegin.predecessor();
             BeginNode otherBegin = ifNode.trueSuccessor();
             LogicNode conditionNode = ifNode.condition();
-            if (conditionNode instanceof InstanceOfNode || conditionNode instanceof InstanceOfDynamicNode) {
+            if (!(conditionNode instanceof InstanceOfNode) && !(conditionNode instanceof InstanceOfDynamicNode)) {
                 // TODO The lowering currently does not support a FixedGuard as the usage of an
                 // InstanceOfNode. Relax this restriction.
+                FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode, deopt.reason(), deopt.action(), deoptBegin == ifNode.trueSuccessor()));
+                FixedWithNextNode pred = (FixedWithNextNode) ifNode.predecessor();
+                if (deoptBegin == ifNode.trueSuccessor()) {
+                    graph.removeSplitPropagate(ifNode, ifNode.falseSuccessor());
+                } else {
+                    graph.removeSplitPropagate(ifNode, ifNode.trueSuccessor());
+                }
+                Debug.log("Converting %s on %-5s branch of %s to guard for remaining branch %s.", deopt, deoptBegin == ifNode.trueSuccessor() ? "true" : "false", ifNode, otherBegin);
+                FixedNode next = pred.next();
+                pred.setNext(guard);
+                guard.setNext(next);
                 return;
             }
-            FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode, deopt.reason(), deopt.action(), deoptBegin == ifNode.trueSuccessor()));
-            FixedWithNextNode pred = (FixedWithNextNode) ifNode.predecessor();
-            if (deoptBegin == ifNode.trueSuccessor()) {
-                graph.removeSplitPropagate(ifNode, ifNode.falseSuccessor());
-            } else {
-                graph.removeSplitPropagate(ifNode, ifNode.trueSuccessor());
-            }
-            Debug.log("Converting %s on %-5s branch of %s to guard for remaining branch %s.", deopt, deoptBegin == ifNode.trueSuccessor() ? "true" : "false", ifNode, otherBegin);
-            FixedNode next = pred.next();
-            pred.setNext(guard);
-            guard.setNext(next);
-            Debug.dump(graph, "After introducing fixed guard %s", guard);
+        }
+
+        // We could not convert the control split - at least cut off control flow after the split.
+        FixedNode next = deoptBegin.next();
+        if (next != deopt) {
+            FixedWithNextNode pred = (FixedWithNextNode) deopt.predecessor();
+            pred.setNext(null);
+            deoptBegin.setNext(deopt);
+            GraphUtil.killCFG(next);
         }
     }
 }