hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/SwitchNode.java
--- a/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/SwitchNode.java Mon Dec 12 16:16:27 2016 +0300
+++ b/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/SwitchNode.java Wed Mar 22 13:42:45 2017 -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);
}