changeset 16404:fe985eebfcd9

ConvertDeoptimizeToGuardPhase: remove useless BeginNodes
author Gilles Duboscq <duboscq@ssw.jku.at>
date Fri, 04 Jul 2014 13:47:37 +0200
parents 39f9f052e5a8
children 9bfc4247262f
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java
diffstat 1 files changed, 13 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java	Fri Jul 04 13:40:34 2014 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java	Fri Jul 04 13:47:37 2014 +0200
@@ -27,6 +27,7 @@
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.debug.*;
 import com.oracle.graal.graph.*;
+import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.util.*;
@@ -56,10 +57,10 @@
         if (graph.getNodes(DeoptimizeNode.class).isEmpty()) {
             return;
         }
-
+        SimplifierTool simplifierTool = GraphUtil.getDefaultSimplifier(null, null, null, false);
         for (DeoptimizeNode d : graph.getNodes(DeoptimizeNode.class)) {
             assert d.isAlive();
-            visitDeoptBegin(BeginNode.prevBegin(d), d.action(), d.reason(), graph);
+            visitDeoptBegin(BeginNode.prevBegin(d), d.action(), d.reason(), graph, simplifierTool);
         }
 
         for (FixedGuardNode fixedGuard : graph.getNodes(FixedGuardNode.class)) {
@@ -92,7 +93,7 @@
                         }
                         if (xs[i].getKind() != Kind.Object && ys[i].getKind() != Kind.Object &&
                                         compare.condition().foldCondition(xs[i], ys[i], null, compare.unorderedIsTrue()) == fixedGuard.isNegated()) {
-                            visitDeoptBegin(BeginNode.prevBegin(mergePredecessor), fixedGuard.getAction(), fixedGuard.getReason(), graph);
+                            visitDeoptBegin(BeginNode.prevBegin(mergePredecessor), fixedGuard.getAction(), fixedGuard.getReason(), graph, simplifierTool);
                         }
                     }
                 }
@@ -102,21 +103,19 @@
         new DeadCodeEliminationPhase().apply(graph);
     }
 
-    private void visitDeoptBegin(BeginNode deoptBegin, DeoptimizationAction deoptAction, DeoptimizationReason deoptReason, StructuredGraph graph) {
+    private void visitDeoptBegin(BeginNode deoptBegin, DeoptimizationAction deoptAction, DeoptimizationReason deoptReason, StructuredGraph graph, SimplifierTool simplifierTool) {
         if (deoptBegin instanceof MergeNode) {
             MergeNode mergeNode = (MergeNode) deoptBegin;
             Debug.log("Visiting %s", mergeNode);
-            List<BeginNode> begins = new ArrayList<>();
-            for (AbstractEndNode end : mergeNode.forwardEnds()) {
+            FixedNode next = mergeNode.next();
+            while (mergeNode.isAlive()) {
+                AbstractEndNode end = mergeNode.forwardEnds().first();
                 BeginNode newBeginNode = findBeginNode(end);
-                assert !begins.contains(newBeginNode);
-                begins.add(newBeginNode);
+                visitDeoptBegin(newBeginNode, deoptAction, deoptReason, graph, simplifierTool);
             }
-            for (BeginNode begin : begins) {
-                assert !begin.isDeleted();
-                visitDeoptBegin(begin, deoptAction, deoptReason, graph);
-            }
-            assert mergeNode.isDeleted();
+            assert next.isAlive();
+            BeginNode newBeginNode = findBeginNode(next);
+            visitDeoptBegin(newBeginNode, deoptAction, deoptReason, graph, simplifierTool);
             return;
         } else if (deoptBegin.predecessor() instanceof IfNode) {
             IfNode ifNode = (IfNode) deoptBegin.predecessor();
@@ -147,6 +146,7 @@
                     }
                 }
             }
+            survivingSuccessor.simplify(simplifierTool);
             Debug.log("Converting deopt on %-5s branch of %s to guard for remaining branch %s.", deoptBegin == ifNode.trueSuccessor() ? "true" : "false", ifNode, otherBegin);
             FixedNode next = pred.next();
             pred.setNext(guard);