Mercurial > hg > graal-compiler
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));