# HG changeset patch # User Tom Rodriguez # Date 1447792663 28800 # Node ID 029b961c2668f8432e28f715fae3a7a4ca34b7aa # Parent 9551cbb2b31738e9629516ce41a1694194d2be81 splitIfAtPhi for non-constant compare canonicalizations diff -r 9551cbb2b317 -r 029b961c2668 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 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 compare = (Canonicalizable.Binary) 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 compare = (Canonicalizable.Unary) 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);