# HG changeset patch # User Gilles Duboscq # Date 1400844109 -7200 # Node ID 3a5ddfa22e77a5a955c64f44b231b30efbb1fa35 # Parent cd755faecaec261e52060f91a0a709b608424162 Simplify removeOrMaterializeIf and make it handle merges with more predecessors. diff -r cd755faecaec -r 3a5ddfa22e77 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 Fri May 23 13:22:54 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Fri May 23 13:21:49 2014 +0200 @@ -481,30 +481,23 @@ AbstractEndNode trueEnd = (AbstractEndNode) trueSuccessor().next(); AbstractEndNode falseEnd = (AbstractEndNode) falseSuccessor().next(); MergeNode merge = trueEnd.merge(); - if (merge == falseEnd.merge() && merge.forwardEndCount() == 2 && trueSuccessor().anchored().isEmpty() && falseSuccessor().anchored().isEmpty()) { + if (merge == falseEnd.merge() && trueSuccessor().anchored().isEmpty() && falseSuccessor().anchored().isEmpty()) { Iterator phis = merge.phis().iterator(); if (!phis.hasNext()) { - // empty if construct with no phis: remove it - removeEmptyIf(tool); + tool.addToWorkList(condition()); + removeThroughFalseBranch(tool); return true; } else { PhiNode singlePhi = phis.next(); if (!phis.hasNext()) { // one phi at the merge of an otherwise empty if construct: try to convert // into a MaterializeNode - boolean inverted = trueEnd == merge.forwardEndAt(1); - ValueNode trueValue = singlePhi.valueAt(inverted ? 1 : 0); - ValueNode falseValue = singlePhi.valueAt(inverted ? 0 : 1); - if (trueValue.getKind() != falseValue.getKind()) { - return false; - } - if (trueValue.getKind() != Kind.Int && trueValue.getKind() != Kind.Long) { - return false; - } + ValueNode trueValue = singlePhi.valueAt(trueEnd); + ValueNode falseValue = singlePhi.valueAt(falseEnd); ConditionalNode conditional = canonicalizeConditionalCascade(trueValue, falseValue); if (conditional != null) { - graph().replaceFloating(singlePhi, conditional); - removeEmptyIf(tool); + singlePhi.setValueAt(trueEnd, conditional); + removeThroughFalseBranch(tool); return true; } } @@ -518,12 +511,6 @@ ValueNode falseValue = falseEnd.result(); ConditionalNode conditional = null; if (trueValue != null) { - if (trueValue.getKind() != falseValue.getKind()) { - return false; - } - if (trueValue.getKind() != Kind.Int && trueValue.getKind() != Kind.Long) { - return false; - } conditional = canonicalizeConditionalCascade(trueValue, falseValue); if (conditional == null) { return false; @@ -537,7 +524,19 @@ return false; } + protected void removeThroughFalseBranch(SimplifierTool tool) { + BeginNode trueBegin = trueSuccessor(); + graph().removeSplitPropagate(this, trueBegin, tool); + tool.addToWorkList(trueBegin); + } + private ConditionalNode canonicalizeConditionalCascade(ValueNode trueValue, ValueNode falseValue) { + if (trueValue.getKind() != falseValue.getKind()) { + return null; + } + if (trueValue.getKind() != Kind.Int && trueValue.getKind() != Kind.Long) { + return null; + } if (trueValue.isConstant() && falseValue.isConstant()) { return graph().unique(new ConditionalNode(condition(), trueValue, falseValue)); } else { @@ -835,38 +834,4 @@ return null; } - - private void removeEmptyIf(SimplifierTool tool) { - BeginNode originalTrueSuccessor = trueSuccessor(); - BeginNode originalFalseSuccessor = falseSuccessor(); - assert originalTrueSuccessor.next() instanceof AbstractEndNode && originalFalseSuccessor.next() instanceof AbstractEndNode; - - AbstractEndNode trueEnd = (AbstractEndNode) originalTrueSuccessor.next(); - AbstractEndNode falseEnd = (AbstractEndNode) originalFalseSuccessor.next(); - assert trueEnd.merge() == falseEnd.merge(); - - FixedWithNextNode pred = (FixedWithNextNode) predecessor(); - MergeNode merge = trueEnd.merge(); - merge.prepareDelete(pred); - assert merge.usages().isEmpty(); - originalTrueSuccessor.prepareDelete(); - originalFalseSuccessor.prepareDelete(); - - FixedNode next = merge.next(); - FrameState state = merge.stateAfter(); - merge.setNext(null); - setTrueSuccessor(null); - setFalseSuccessor(null); - pred.setNext(next); - safeDelete(); - originalTrueSuccessor.safeDelete(); - originalFalseSuccessor.safeDelete(); - merge.safeDelete(); - trueEnd.safeDelete(); - falseEnd.safeDelete(); - if (state != null) { - tool.removeIfUnused(state); - } - tool.addToWorkList(next); - } } diff -r cd755faecaec -r 3a5ddfa22e77 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java Fri May 23 13:22:54 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java Fri May 23 13:21:49 2014 +0200 @@ -82,6 +82,10 @@ values().set(i, x); } + public void setValueAt(AbstractEndNode end, ValueNode x) { + setValueAt(merge().phiPredecessorIndex(end), x); + } + public ValueNode valueAt(AbstractEndNode pred) { return valueAt(merge().phiPredecessorIndex(pred)); } diff -r cd755faecaec -r 3a5ddfa22e77 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java Fri May 23 13:22:54 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java Fri May 23 13:21:49 2014 +0200 @@ -27,6 +27,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; +import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.util.*; @@ -303,6 +304,10 @@ } public void removeSplitPropagate(ControlSplitNode node, BeginNode survivingSuccessor) { + removeSplitPropagate(node, survivingSuccessor, null); + } + + public void removeSplitPropagate(ControlSplitNode node, BeginNode survivingSuccessor, SimplifierTool tool) { assert node != null; assert node.usages().isEmpty(); assert survivingSuccessor != null; @@ -313,7 +318,7 @@ for (Node successor : snapshot) { if (successor != null && successor.isAlive()) { if (successor != survivingSuccessor) { - GraphUtil.killCFG(successor); + GraphUtil.killCFG(successor, tool); } } }