changeset 4682:7cb57ac24ab8

Better ConvertDeoptimizeToGuardPhase (experimental). Spelling fixes.
author Andreas Woess <andreas.woess@jku.at>
date Fri, 24 Feb 2012 13:42:24 +0100
parents 84e7d6690293
children f5c1bd9c70b9
files graal/com.oracle.max.graal.alloc/src/com/oracle/max/graal/alloc/util/RegisterVerifier.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java
diffstat 3 files changed, 41 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.alloc/src/com/oracle/max/graal/alloc/util/RegisterVerifier.java	Thu Feb 23 16:57:05 2012 -0800
+++ b/graal/com.oracle.max.graal.alloc/src/com/oracle/max/graal/alloc/util/RegisterVerifier.java	Fri Feb 24 13:42:24 2012 +0100
@@ -145,7 +145,7 @@
                 if (savedValue != inputValue) {
                     // Current inputState and previous savedState assume a different value in this register.
                     // Assume that this register is invalid and remove it from the saved state.
-                    Debug.log("    invalididating %s because it is inconsistent with %s", savedValue, inputValue);
+                    Debug.log("    invalidating %s because it is inconsistent with %s", savedValue, inputValue);
                     iter.remove();
                     // Must re-visit this block.
                     addToWorkList(succ);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java	Thu Feb 23 16:57:05 2012 -0800
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java	Fri Feb 24 13:42:24 2012 +0100
@@ -24,8 +24,10 @@
 
 import java.util.*;
 
+import com.oracle.max.graal.debug.*;
 import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.nodes.*;
+import com.oracle.max.graal.nodes.util.*;
 
 public class ConvertDeoptimizeToGuardPhase extends Phase {
 
@@ -42,32 +44,48 @@
 
     @Override
     protected void run(final StructuredGraph graph) {
-        List<DeoptimizeNode> nodes = graph.getNodes(DeoptimizeNode.class).snapshot();
-        if (nodes.size() == 0) {
+        if (graph.getNodes(DeoptimizeNode.class).isEmpty()) {
             return;
         }
 
-        for (DeoptimizeNode d : nodes) {
-            BeginNode myBeginNode = findBeginNode(d);
-            Node controlSplit = myBeginNode.predecessor();
-
-            if (controlSplit instanceof IfNode) {
-                IfNode ifNode = (IfNode) controlSplit;
-                BeginNode otherBegin = ifNode.trueSuccessor();
-                BooleanNode conditionNode = ifNode.compare();
-                if (myBeginNode == ifNode.trueSuccessor()) {
-                    conditionNode = conditionNode.negate();
-                    otherBegin = ifNode.falseSuccessor();
-                }
-                BeginNode ifBlockBegin = findBeginNode(ifNode);
-                graph.unique(new GuardNode(conditionNode, ifBlockBegin));
-                otherBegin.replaceAtUsages(ifBlockBegin);
-                FixedNode next = otherBegin.next();
-                otherBegin.setNext(null);
-                ifNode.replaceAtPredecessors(next);
-            }
+        for (DeoptimizeNode d : graph.getNodes(DeoptimizeNode.class)) {
+            visitDeoptBranch(findBeginNode(d), d, graph);
         }
 
         new DeadCodeEliminationPhase().apply(graph);
     }
+
+    private void visitDeoptBranch(BeginNode deoptBegin, DeoptimizeNode deopt, StructuredGraph graph) {
+        if (deoptBegin instanceof MergeNode) {
+            MergeNode mergeNode = (MergeNode) deoptBegin;
+            Debug.log("Eliminating %s followed by %s", mergeNode, deopt);
+            List<EndNode> ends = mergeNode.forwardEnds().snapshot();
+            for (EndNode end : ends) {
+                if (!end.isDeleted()) {
+                    BeginNode beginNode = findBeginNode(end);
+                    visitDeoptBranch(beginNode, deopt, graph);
+                }
+            }
+            if (!deopt.isDeleted()) {
+                visitDeoptBranch(findBeginNode(deopt), deopt, graph);
+            }
+        } else if (deoptBegin.predecessor() instanceof IfNode) {
+            IfNode ifNode = (IfNode) deoptBegin.predecessor();
+            BeginNode otherBegin = ifNode.trueSuccessor();
+            BooleanNode conditionNode = ifNode.compare();
+            if (deoptBegin == ifNode.trueSuccessor()) {
+                conditionNode = conditionNode.negate();
+                otherBegin = ifNode.falseSuccessor();
+            }
+            BeginNode ifBlockBegin = findBeginNode(ifNode);
+            Debug.log("Converting %s on %-5s branch of %s to guard for remaining branch %s. IfBegin=%s", deopt, deoptBegin == ifNode.trueSuccessor() ? "true" : "false", ifNode, otherBegin, ifBlockBegin);
+            FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode));
+            otherBegin.replaceAtUsages(ifBlockBegin);
+            FixedNode next = otherBegin.next();
+            otherBegin.setNext(null);
+            guard.setNext(next);
+            ifNode.replaceAtPredecessors(guard);
+            GraphUtil.killCFG(ifNode);
+        }
+    }
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java	Thu Feb 23 16:57:05 2012 -0800
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java	Fri Feb 24 13:42:24 2012 +0100
@@ -116,7 +116,7 @@
         } else if (GraalOptions.ScheduleOutOfLoops && !(n instanceof VirtualObjectFieldNode) && !(n instanceof VirtualObjectNode)) {
             Block earliestBlock = earliestBlock(n);
             block = scheduleOutOfLoops(n, latestBlock, earliestBlock);
-            assert earliestBlock.dominates(block) : "Graph can not be scheduled : inconsisitant for " + n;
+            assert earliestBlock.dominates(block) : "Graph can not be scheduled : inconsistent for " + n;
         } else {
             block = latestBlock;
         }