Mercurial > hg > graal-compiler
changeset 13693:4efb3399a36e
additional simplifications for IfNode and MergeNode
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Fri, 17 Jan 2014 09:38:39 +0100 |
parents | c215dec9d3cf |
children | 0e8c22aa6ec3 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java |
diffstat | 2 files changed, 54 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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; }
--- 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<PhiNode> 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<AbstractEndNode> 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); + } + } } } }