changeset 9932:3d5fdf185a67

Bugfix concerning ComputeProbabilityClosure.
author Christian Haeubl <haeubl@ssw.jku.at>
date Fri, 07 Jun 2013 16:02:19 +0200
parents 8d62b9774d0c
children 78a1232be418
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeProbabilityClosure.java
diffstat 2 files changed, 7 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java	Fri Jun 07 14:57:36 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SwitchNode.java	Fri Jun 07 16:02:19 2013 +0200
@@ -56,9 +56,12 @@
     }
 
     private boolean assertProbabilities() {
+        double total = 0;
         for (double d : keyProbabilities) {
+            total += d;
             assert d >= 0.0 : "Cannot have negative probabilities in switch node: " + d;
         }
+        assert total > 0.999 && total < 1.001;
         return true;
     }
 
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeProbabilityClosure.java	Fri Jun 07 14:57:36 2013 +0200
+++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ComputeProbabilityClosure.java	Fri Jun 07 16:02:19 2013 +0200
@@ -24,6 +24,7 @@
 
 import java.util.*;
 
+import com.oracle.graal.debug.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.extended.*;
@@ -102,7 +103,7 @@
 
             for (Node pred : currentNode.cfgPredecessors()) {
                 FixedNode fixedPred = (FixedNode) pred;
-                if (allSuxVisited(fixedPred, visitedNodes)) {
+                if (allSuxVisited(fixedPred, visitedNodes) || fixedPred instanceof InvokeWithExceptionNode) {
                     nodes.push(fixedPred);
                 } else {
                     assert fixedPred instanceof ControlSplitNode : "only control splits can have more than one sux";
@@ -112,7 +113,7 @@
         } while (!nodes.isEmpty());
     }
 
-    private static void modifyProbabilities(Node node, NodeBitMap visitedNodes) {
+    private static void modifyProbabilities(ControlSplitNode node, NodeBitMap visitedNodes) {
         if (node instanceof IfNode) {
             IfNode ifNode = (IfNode) node;
             assert visitedNodes.isMarked(ifNode.falseSuccessor()) ^ visitedNodes.isMarked(ifNode.trueSuccessor());
@@ -134,7 +135,7 @@
                 }
             }
         } else {
-            assert !(node instanceof ControlSplitNode);
+            GraalInternalError.shouldNotReachHere();
         }
     }