changeset 9384:86584f07f852

Fix for removeIntermediateMaterialization.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sun, 28 Apr 2013 07:06:31 +0200
parents 6a050090dff8
children 033b0cd7d342
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java
diffstat 1 files changed, 17 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Sun Apr 28 06:32:04 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Sun Apr 28 07:06:31 2013 +0200
@@ -157,13 +157,15 @@
                 ((StructuredGraph) graph()).removeSplit(this, falseSuccessor());
                 return;
             }
-        } else if (trueSuccessor().guards().isEmpty() && falseSuccessor().guards().isEmpty()) {
+        } else if (trueSuccessor().usages().isEmpty() && falseSuccessor().usages().isEmpty()) {
+
             if (removeOrMaterializeIf(tool)) {
                 return;
             }
-        }
-        if (removeIntermediateMaterialization(tool)) {
-            return;
+
+            if (removeIntermediateMaterialization(tool)) {
+                return;
+            }
         }
 
         if (falseSuccessor().usages().isEmpty() && (!(falseSuccessor() instanceof LoopExitNode)) && falseSuccessor().next() instanceof IfNode) {
@@ -413,11 +415,12 @@
             return false;
         }
 
-        MergeNode merge = (MergeNode) predecessor();
-        if (!merge.anchored().isEmpty()) {
+        if (predecessor() instanceof LoopBeginNode) {
             return false;
         }
 
+        MergeNode merge = (MergeNode) predecessor();
+
         // Only consider merges with a single usage that is both a phi and an operand of the
         // comparison
         NodeIterable<Node> mergeUsages = merge.usages();
@@ -442,10 +445,7 @@
         }
 
         List<EndNode> mergePredecessors = merge.cfgPredecessors().snapshot();
-        if (phi.valueCount() != merge.forwardEndCount()) {
-            // Handles a loop begin merge
-            return false;
-        }
+        assert phi.valueCount() == merge.forwardEndCount();
 
         Constant[] xs = constantValues(compare.x(), merge);
         Constant[] ys = constantValues(compare.y(), merge);
@@ -504,6 +504,13 @@
         } else {
             if (ends.size() == 1) {
                 EndNode end = ends.get(0);
+                FrameState stateAfter = oldMerge.stateAfter();
+                if (stateAfter != null) {
+                    stateAfter = stateAfter.duplicate();
+                    PhiNode oldPhi = (PhiNode) oldMerge.usages().first();
+                    stateAfter.replaceFirstInput(oldPhi, phiValues.get(end));
+                    successor.setStateAfter(stateAfter);
+                }
                 ((FixedWithNextNode) end.predecessor()).setNext(successor);
                 oldMerge.removeEnd(end);
                 GraphUtil.killCFG(end);