# HG changeset patch # User Lukas Stadler # Date 1389947919 -3600 # Node ID 4efb3399a36e9325c296cd145038f8569aa8d735 # Parent c215dec9d3cfce818c8cb329d4247e4691a34a58 additional simplifications for IfNode and MergeNode diff -r c215dec9d3cf -r 4efb3399a36e 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 Wed Jan 15 16:11:56 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Fri Jan 17 09:38:39 2014 +0100 @@ -371,6 +371,29 @@ } } } + if (trueSuccessor().next() instanceof ReturnNode && falseSuccessor().next() instanceof ReturnNode) { + ReturnNode trueEnd = (ReturnNode) trueSuccessor().next(); + ReturnNode falseEnd = (ReturnNode) falseSuccessor().next(); + ValueNode trueValue = trueEnd.result(); + ValueNode falseValue = falseEnd.result(); + ConditionalNode conditional = null; + if (trueValue != null) { + if (trueValue.kind() != falseValue.kind()) { + return false; + } + if (trueValue.kind() != Kind.Int && trueValue.kind() != Kind.Long) { + return false; + } + conditional = canonicalizeConditionalCascade(trueValue, falseValue); + if (conditional == null) { + return false; + } + } + ReturnNode newReturn = graph().add(new ReturnNode(conditional)); + replaceAtPredecessor(newReturn); + GraphUtil.killCFG(this); + return true; + } return false; } diff -r c215dec9d3cf -r 4efb3399a36e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java Wed Jan 15 16:11:56 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java Fri Jan 17 09:38:39 2014 +0100 @@ -24,6 +24,8 @@ import static com.oracle.graal.graph.iterators.NodePredicates.*; +import java.util.*; + import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.iterators.*; @@ -194,6 +196,35 @@ tool.addToWorkList(newEnd.predecessor()); // ? } graph().reduceTrivialMerge(this); + } else if (next instanceof ReturnNode) { + ReturnNode returnNode = (ReturnNode) next; + if (anchored().isNotEmpty() || returnNode.getMemoryMap() != null) { + return; + } + List phis = phis().snapshot(); + for (PhiNode phi : phis) { + for (Node usage : phi.usages().filter(isNotA(FrameState.class))) { + if (usage != returnNode) { + return; + } + } + } + + PhiNode returnValuePhi = returnNode.result() == null || !isPhiAtMerge(returnNode.result()) ? null : (PhiNode) returnNode.result(); + List endNodes = forwardEnds().snapshot(); + for (AbstractEndNode end : endNodes) { + ReturnNode newReturn = graph().add(new ReturnNode(returnValuePhi == null ? returnNode.result() : returnValuePhi.valueAt(end))); + end.replaceAtPredecessor(newReturn); + } + GraphUtil.killCFG(this); + for (AbstractEndNode end : endNodes) { + end.safeDelete(); + } + for (PhiNode phi : phis) { + if (phi.isAlive() && phi.usages().isEmpty()) { + GraphUtil.killWithUnusedFloatingInputs(phi); + } + } } } }