--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/SwitchNode.java 2017-03-20 17:40:47.000000000 -0700 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/SwitchNode.java 2017-03-20 17:40:47.000000000 -0700 @@ -28,6 +28,7 @@ import java.util.Arrays; import org.graalvm.compiler.core.common.type.AbstractPointerStamp; +import org.graalvm.compiler.core.common.type.Stamp; import org.graalvm.compiler.core.common.type.StampFactory; import org.graalvm.compiler.debug.GraalError; import org.graalvm.compiler.graph.Node; @@ -90,6 +91,11 @@ } @Override + public int getSuccessorCount() { + return successors.count(); + } + + @Override public double probability(AbstractBeginNode successor) { double sum = 0; for (int i = 0; i < keySuccessors.length; i++) { @@ -100,6 +106,39 @@ return sum; } + @Override + public boolean setProbability(AbstractBeginNode successor, double value) { + assert value <= 1.0 && value >= 0.0 : value; + assert assertProbabilities(); + + double sum = 0; + double otherSum = 0; + for (int i = 0; i < keySuccessors.length; i++) { + if (successors.get(keySuccessors[i]) == successor) { + sum += keyProbabilities[i]; + } else { + otherSum += keyProbabilities[i]; + } + } + + if (otherSum == 0 || sum == 0) { + // Cannot correctly adjust probabilities. + return false; + } + + double delta = value - sum; + + for (int i = 0; i < keySuccessors.length; i++) { + if (successors.get(keySuccessors[i]) == successor) { + keyProbabilities[i] = Math.max(0.0, keyProbabilities[i] + (delta * keyProbabilities[i]) / sum); + } else { + keyProbabilities[i] = Math.max(0.0, keyProbabilities[i] - (delta * keyProbabilities[i]) / otherSum); + } + } + assert assertProbabilities(); + return true; + } + public ValueNode value() { return value; } @@ -201,4 +240,6 @@ tool.addToWorkList(blockSuccessor(survivingEdge)); graph().removeSplit(this, blockSuccessor(survivingEdge)); } + + public abstract Stamp getValueStampForSuccessor(AbstractBeginNode beginNode); }