# HG changeset patch # User Thomas Wuerthinger # Date 1367125591 -7200 # Node ID 86584f07f8527699fcc39f25560a6a1a9bd2f1dd # Parent 6a050090dff89b8ba5be42128750ebbdee327c50 Fix for removeIntermediateMaterialization. diff -r 6a050090dff8 -r 86584f07f852 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 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 mergeUsages = merge.usages(); @@ -442,10 +445,7 @@ } List 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);