# HG changeset patch # User Thomas Wuerthinger # Date 1367086630 -7200 # Node ID f11381a657256bf6cde094a210233d1180200b51 # Parent 98603705e565eeb9a52bf891ba367b6a81bd44fe Do not swap if nodes when there is a loop exit node between them. Do not swap if one of the compares has unorderedIsTrue set. diff -r 98603705e565 -r f11381a65725 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 Sat Apr 27 18:06:32 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Sat Apr 27 20:17:10 2013 +0200 @@ -166,7 +166,7 @@ return; } - if (falseSuccessor().usages().isEmpty() && falseSuccessor().next() instanceof IfNode) { + if (falseSuccessor().usages().isEmpty() && (!(falseSuccessor() instanceof LoopExitNode)) && falseSuccessor().next() instanceof IfNode) { BeginNode intermediateBegin = falseSuccessor(); IfNode nextIf = (IfNode) intermediateBegin.next(); double probabilityB = (1.0 - this.trueSuccessorProbability) * nextIf.trueSuccessorProbability; @@ -251,12 +251,18 @@ } else if (a instanceof CompareNode) { CompareNode compareA = (CompareNode) a; Condition conditionA = compareA.condition(); + if (compareA.unorderedIsTrue()) { + return false; + } if (b instanceof CompareNode) { CompareNode compareB = (CompareNode) b; if (compareA == compareB) { Debug.log("Same conditions => do not swap and leave the work for global value numbering."); return false; } + if (compareB.unorderedIsTrue()) { + return false; + } Condition comparableCondition = null; Condition conditionB = compareB.condition(); if (compareB.x() == compareA.x() && compareB.y() == compareA.y()) {