changeset 9472:e4e2686f30df

Merge.
author Doug Simon <doug.simon@oracle.com>
date Wed, 01 May 2013 18:04:28 +0200
parents 5fa54bf57f8c (current diff) 225fc5463430 (diff)
children d9fd6af5d200
files
diffstat 5 files changed, 33 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Wed May 01 17:46:12 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Wed May 01 18:04:28 2013 +0200
@@ -65,8 +65,8 @@
         super(StampFactory.forVoid());
         this.condition = condition;
         this.falseSuccessor = falseSuccessor;
-        this.trueSuccessorProbability = trueSuccessorProbability;
         this.trueSuccessor = trueSuccessor;
+        setTrueSuccessorProbability(trueSuccessorProbability);
 
     }
 
@@ -117,11 +117,12 @@
         setFalseSuccessor(null);
         setTrueSuccessor(falseSucc);
         setFalseSuccessor(trueSucc);
-        trueSuccessorProbability = 1 - trueSuccessorProbability;
+        setTrueSuccessorProbability(1 - trueSuccessorProbability);
         return this;
     }
 
     public void setTrueSuccessorProbability(double prob) {
+        assert prob >= 0.0 && prob <= 1.0 : "Probability out of bounds: " + prob;
         trueSuccessorProbability = prob;
     }
 
@@ -189,8 +190,12 @@
                     intermediateBegin.setNext(this);
                     this.setFalseSuccessor(bothFalseBegin);
                     nextIf.setTrueSuccessorProbability(probabilityB);
-                    double newProbability = this.trueSuccessorProbability / (1.0 - probabilityB);
-                    this.setTrueSuccessorProbability(newProbability);
+                    if (probabilityB == 1.0) {
+                        this.setTrueSuccessorProbability(0.0);
+                    } else {
+                        double newProbability = this.trueSuccessorProbability / (1.0 - probabilityB);
+                        this.setTrueSuccessorProbability(Math.min(1.0, newProbability));
+                    }
                     return;
                 }
             }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java	Wed May 01 17:46:12 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java	Wed May 01 18:04:28 2013 +0200
@@ -52,6 +52,14 @@
         this.value = value;
         this.keySuccessors = keySuccessors;
         this.keyProbabilities = keyProbabilities;
+        assert assertProbabilities();
+    }
+
+    private boolean assertProbabilities() {
+        for (double d : keyProbabilities) {
+            assert d >= 0.0 : "Cannot have negative probabilities in switch node: " + d;
+        }
+        return true;
     }
 
     @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/NodesToDoubles.java	Wed May 01 17:46:12 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/NodesToDoubles.java	Wed May 01 18:04:28 2013 +0200
@@ -35,6 +35,7 @@
     }
 
     public void put(FixedNode n, double value) {
+        assert value >= 0.0;
         nodeProbabilities.put(n, value);
     }
 
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java	Wed May 01 17:46:12 2013 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java	Wed May 01 18:04:28 2013 +0200
@@ -649,9 +649,16 @@
 
                     ValueNode firstMethodConstantNode = ConstantNode.forConstant(firstMethodConstant, runtime, graph);
                     constantMethods[i] = firstMethodConstantNode;
-                    probability[i] = concretesProbabilities.get(i);
+                    double concretesProbability = concretesProbabilities.get(i);
+                    assert concretesProbability >= 0.0;
+                    probability[i] = concretesProbability;
                     if (i > 0) {
-                        probability[i] /= (1.0 - probability[i - 1]);
+                        double prevProbability = probability[i - 1];
+                        if (prevProbability == 1.0) {
+                            probability[i] = 1.0;
+                        } else {
+                            probability[i] = Math.min(1.0, Math.max(0.0, probability[i] / (1.0 - prevProbability)));
+                        }
                     }
                 }
 
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeProbabilityClosure.java	Wed May 01 17:46:12 2013 +0200
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeProbabilityClosure.java	Wed May 01 18:04:28 2013 +0200
@@ -79,11 +79,6 @@
         }
     }
 
-    private static boolean isRelativeProbability(double prob) {
-        // 1.01 to allow for some rounding errors
-        return prob >= 0 && prob <= 1.01;
-    }
-
     public static class LoopInfo {
 
         public final LoopBeginNode loopBegin;
@@ -131,6 +126,7 @@
         public LoopInfo loopInfo;
 
         public Probability(double probability, HashSet<LoopInfo> loops) {
+            assert probability >= 0.0;
             this.probability = probability;
             this.loops = new HashSet<>(4);
             if (loops != null) {
@@ -174,7 +170,7 @@
                 }
                 loops = intersection;
                 mergeLoops.put(merge, new HashSet<>(intersection));
-                assert isRelativeProbability(probability) : probability;
+                probability = Math.max(0.0, probability);
             }
             return true;
         }
@@ -219,7 +215,10 @@
             } else {
                 assert pred instanceof ControlSplitNode;
                 ControlSplitNode x = (ControlSplitNode) pred;
-                probability *= x.probability(node);
+                double nodeProbability = x.probability(node);
+                assert nodeProbability >= 0.0 : "Node " + x + " provided negative probability for begin " + node + ": " + nodeProbability;
+                probability *= nodeProbability;
+                assert probability >= 0.0;
             }
         }
     }