# HG changeset patch # User Doug Simon # Date 1351537374 -3600 # Node ID dc5eec61daba8e1564d76ac76e3ed279cb7c86f4 # Parent 341f34427e0967f06d97cd6f773c776a7d60ee95 removing intermediate materialization with frame-state-full merges now works diff -r 341f34427e09 -r dc5eec61daba graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java --- 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 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 mergePredecessors = merge.cfgPredecessors().snapshot(); List falseEnds = new ArrayList<>(mergePredecessors.size()); List trueEnds = new ArrayList<>(mergePredecessors.size()); Map 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));