# HG changeset patch # User Thomas Wuerthinger # Date 1425919280 -3600 # Node ID 19a4fbe393d0fa041c9443b0f65735bce1396d71 # Parent 632f04ffc7a5997cfcaae8baa880a6e77d935376 Fix for conditional elimination: Block could have been deleted, but dominated block is alive. diff -r 632f04ffc7a5 -r 19a4fbe393d0 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java --- 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 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 undoOperations) { @@ -161,23 +160,17 @@ } } - private boolean preprocess(Block block, List undoOperations) { + private void preprocess(Block block, List 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; } }