changeset 9464:b5d83338286f

Fix post dominator calculation.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 01 May 2013 15:02:36 +0200
parents 902a974d55c8
children 89c5c388d6d5
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java
diffstat 1 files changed, 15 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java	Tue Apr 30 23:24:25 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java	Wed May 01 15:02:36 2013 +0200
@@ -335,21 +335,28 @@
     }
 
     private void computePostdominators() {
-        for (Block block : postOrder()) {
+        outer: for (Block block : postOrder()) {
             if (block.isLoopEnd()) {
                 // We do not want the loop header registered as the postdominator of the loop end.
                 continue;
             }
-            Block postdominator = null;
+            if (block.getSuccessorCount() == 0) {
+                // No successors => no postdominator.
+                continue;
+            }
+            Block firstSucc = block.getSuccessors().get(0);
+            if (block.getSuccessorCount() == 1) {
+                block.postdominator = block;
+            }
+            Block postdominator = firstSucc;
             for (Block sux : block.getSuccessors()) {
-                if (sux.isExceptionEntry()) {
-                    // We ignore exception handlers.
-                } else if (postdominator == null) {
-                    postdominator = sux;
-                } else {
-                    postdominator = commonPostdominator(postdominator, sux);
+                postdominator = commonPostdominator(postdominator, sux);
+                if (postdominator == null) {
+                    // There is a dead end => no postdominator available.
+                    continue outer;
                 }
             }
+            assert !block.getSuccessors().contains(postdominator);
             block.postdominator = postdominator;
         }
     }