Mercurial > hg > graal-compiler
changeset 19731: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; } }