changeset 19724:19a4fbe393d0

Fix for conditional elimination: Block could have been deleted, but dominated block is alive.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Mon, 09 Mar 2015 17:41:20 +0100
parents 632f04ffc7a5
children 19d3db31bcea de35dd773272
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java
diffstat 1 files changed, 22 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java	Mon Mar 09 17:20:19 2015 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java	Mon Mar 09 17:41:20 2015 +0100
@@ -135,24 +135,23 @@
 
             List<Runnable> undoOperations = new ArrayList<>();
 
-            if (preprocess(block, undoOperations)) {
+            preprocess(block, undoOperations);
 
-                // Process always reached block first.
-                Block postdominator = block.getPostdominator();
-                if (postdominator != null && postdominator.getDominator() == block) {
-                    processBlock(postdominator);
-                }
+            // Process always reached block first.
+            Block postdominator = block.getPostdominator();
+            if (postdominator != null && postdominator.getDominator() == block) {
+                processBlock(postdominator);
+            }
 
-                // Now go for the other dominators.
-                for (Block dominated : block.getDominated()) {
-                    if (dominated != postdominator) {
-                        assert dominated.getDominator() == block;
-                        processBlock(dominated);
-                    }
+            // Now go for the other dominators.
+            for (Block dominated : block.getDominated()) {
+                if (dominated != postdominator) {
+                    assert dominated.getDominator() == block;
+                    processBlock(dominated);
                 }
+            }
 
-                postprocess(undoOperations);
-            }
+            postprocess(undoOperations);
         }
 
         private static void postprocess(List<Runnable> undoOperations) {
@@ -161,23 +160,17 @@
             }
         }
 
-        private boolean preprocess(Block block, List<Runnable> undoOperations) {
+        private void preprocess(Block block, List<Runnable> undoOperations) {
             AbstractBeginNode beginNode = block.getBeginNode();
-            if (beginNode.isAlive() || (beginNode instanceof MergeNode && beginNode.next().isAlive())) {
-                if (beginNode instanceof LoopExitNode) {
-                    LoopExitNode loopExitNode = (LoopExitNode) beginNode;
-                    this.loopExits.push(loopExitNode);
-                    undoOperations.add(() -> loopExits.pop());
+            if (beginNode instanceof LoopExitNode && beginNode.isAlive()) {
+                LoopExitNode loopExitNode = (LoopExitNode) beginNode;
+                this.loopExits.push(loopExitNode);
+                undoOperations.add(() -> loopExits.pop());
+            }
+            for (Node n : blockToNodes.apply(block)) {
+                if (n.isAlive()) {
+                    processNode(n, undoOperations);
                 }
-                for (Node n : blockToNodes.apply(block)) {
-                    if (n.isAlive()) {
-                        processNode(n, undoOperations);
-                    }
-                }
-                return true;
-            } else {
-                // Control flow has been deleted by previous eliminations.
-                return false;
             }
         }