# HG changeset patch # User Thomas Wuerthinger # Date 1366921247 -7200 # Node ID 18d28d9bb13ae55e2754a727c91538ee99512598 # Parent 5e1465ec46d6afbaca67ba9feb3bd459dc366e08 Fix branch probability injection. diff -r 5e1465ec46d6 -r 18d28d9bb13a graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BranchProbabilityNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BranchProbabilityNode.java Thu Apr 25 21:34:00 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BranchProbabilityNode.java Thu Apr 25 22:20:47 2013 +0200 @@ -72,8 +72,27 @@ } else if (probabilityValue > 1.0) { throw new GraalInternalError("A probability of more than 1.0 (" + probabilityValue + ") is not allowed!"); } - for (IfNode ifNodeUsages : this.usages().filter(IfNode.class)) { - ifNodeUsages.setTrueSuccessorProbability(probabilityValue); + boolean couldSet = false; + for (IntegerEqualsNode node : this.usages().filter(IntegerEqualsNode.class)) { + if (node.condition() == Condition.EQ) { + ValueNode other = node.x(); + if (node.x() == this) { + other = node.y(); + } + if (other.isConstant()) { + double probabilityToSet = probabilityValue; + if (!other.asConstant().asBoolean()) { + probabilityToSet = 1.0 - probabilityToSet; + } + for (IfNode ifNodeUsages : node.usages().filter(IfNode.class)) { + couldSet = true; + ifNodeUsages.setTrueSuccessorProbability(probabilityToSet); + } + } + } + } + if (!couldSet) { + throw new GraalInternalError("Wrong usage of branch probability injection!"); } return condition; }