hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/extended/SwitchNode.java
changeset 46344 694c102fd8ed
parent 43972 1ade39b8381b
child 46393 d497d892ab11
--- 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);
 }