Mercurial > hg > graal-compiler
changeset 23007:029b961c2668
splitIfAtPhi for non-constant compare canonicalizations
author | Tom Rodriguez <tom.rodriguez@oracle.com> |
---|---|
date | Tue, 17 Nov 2015 12:37:43 -0800 |
parents | 9551cbb2b317 |
children | 2b94c6a74b0b |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java |
diffstat | 1 files changed, 29 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Tue Nov 17 12:36:33 2015 -0800 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Tue Nov 17 12:37:43 2015 -0800 @@ -784,18 +784,18 @@ for (EndNode end : merge.forwardEnds().snapshot()) { Node value = phi.valueAt(end); - Node result = null; + LogicNode result = null; if (condition() instanceof Canonicalizable.Binary<?>) { Canonicalizable.Binary<Node> compare = (Canonicalizable.Binary<Node>) condition; if (compare.getX() == phi) { - result = compare.canonical(tool, value, compare.getY()); + result = (LogicNode) compare.canonical(tool, value, compare.getY()); } else { - result = compare.canonical(tool, compare.getX(), value); + result = (LogicNode) compare.canonical(tool, compare.getX(), value); } } else { assert condition() instanceof Canonicalizable.Unary<?>; Canonicalizable.Unary<Node> compare = (Canonicalizable.Unary<Node>) condition; - result = compare.canonical(tool, value); + result = (LogicNode) compare.canonical(tool, value); } if (result instanceof LogicConstantNode) { merge.removeEnd(end); @@ -810,6 +810,31 @@ } falseMerge.addForwardEnd(end); } + } else if (result != condition) { + // Build a new IfNode using the new condition + BeginNode trueBegin = graph().add(new BeginNode()); + BeginNode falseBegin = graph().add(new BeginNode()); + + if (result.graph() == null) { + result = graph().addOrUniqueWithInputs(result); + } + IfNode newIfNode = graph().add(new IfNode(result, trueBegin, falseBegin, trueSuccessorProbability)); + merge.removeEnd(end); + ((FixedWithNextNode) end.predecessor()).setNext(newIfNode); + + if (trueMerge == null) { + trueMerge = insertMerge(trueSuccessor()); + } + trueBegin.setNext(graph().add(new EndNode())); + trueMerge.addForwardEnd((EndNode) trueBegin.next()); + + if (falseMerge == null) { + falseMerge = insertMerge(falseSuccessor()); + } + falseBegin.setNext(graph().add(new EndNode())); + falseMerge.addForwardEnd((EndNode) falseBegin.next()); + + end.safeDelete(); } } transferProxies(trueSuccessor(), trueMerge);