changeset 6590:dc5eec61daba

removing intermediate materialization with frame-state-full merges now works
author Doug Simon <doug.simon@oracle.com>
date Mon, 29 Oct 2012 20:02:54 +0100
parents 341f34427e09
children c38f13903fdf
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java
diffstat 1 files changed, 11 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Mon Oct 29 17:22:25 2012 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Mon Oct 29 20:02:54 2012 +0100
@@ -237,12 +237,6 @@
             return false;
         }
 
-        if (merge.stateAfter() != null) {
-            // TODO (ds) remove once scheduling issue (sometimes) triggered by compiling org.eclipse.jdt.core.tests.util.Util::unzip is fixed.
-            // Command to reproduce: mx dacapo 4 eclipse -esa -G:+DumpOnError
-            return false;
-        }
-
         // Only consider merges with a single usage that is both a phi and an operand of the comparison
         NodeUsagesList mergeUsages = merge.usages();
         if (mergeUsages.count() != 1) {
@@ -255,12 +249,21 @@
 
         // Ensure phi is used by at most the comparison and the merge's frame state (if any)
         PhiNode phi = (PhiNode) singleUsage;
-        for (Node usage : phi.usages()) {
+        NodeUsagesList phiUsages = phi.usages();
+        if (phiUsages.count() > 2) {
+            return false;
+        }
+        for (Node usage : phiUsages) {
             if (usage != compare && usage != merge.stateAfter()) {
                 return false;
             }
         }
 
+        List<EndNode> mergePredecessors = merge.cfgPredecessors().snapshot();
+        if (phi.valueCount() != merge.forwardEndCount()) {
+            // Handles a loop begin merge
+            return false;
+        }
 
         Constant[] xs = constantValues(compare.x(), merge);
         Constant[] ys = constantValues(compare.y(), merge);
@@ -268,9 +271,6 @@
             return false;
         }
 
-        // DebugScope.dump(this.graph(), "Before removeIntermediateMaterialization");
-
-        List<EndNode> mergePredecessors = merge.cfgPredecessors().snapshot();
         List<EndNode> falseEnds = new ArrayList<>(mergePredecessors.size());
         List<EndNode> trueEnds = new ArrayList<>(mergePredecessors.size());
         Map<EndNode, ValueNode> phiValues = new HashMap<>(mergePredecessors.size());
@@ -325,6 +325,7 @@
                 oldMerge.removeEnd(end);
                 GraphUtil.killCFG(end);
             } else {
+                // Need a new phi in case the frame state is used by more than the merge being removed
                 MergeNode newMerge = graph().add(new MergeNode());
                 PhiNode oldPhi = (PhiNode) oldMerge.usages().first();
                 PhiNode newPhi = graph().add(new PhiNode(oldPhi.stamp(), newMerge));