# HG changeset patch # User Christian Wimmer # Date 1330708204 28800 # Node ID f1cb5fa9a532859c5eaae6bf99b5ded821e2bd06 # Parent e3cc0d407bc642886bac05204fa9f6c89a42c416 Make reverse postorder computation more robust so that it can handle dead code. diff -r e3cc0d407bc6 -r f1cb5fa9a532 graal/com.oracle.max.graal.lir/src/com/oracle/max/graal/lir/cfg/ControlFlowGraph.java --- a/graal/com.oracle.max.graal.lir/src/com/oracle/max/graal/lir/cfg/ControlFlowGraph.java Fri Mar 02 09:08:39 2012 -0800 +++ b/graal/com.oracle.max.graal.lir/src/com/oracle/max/graal/lir/cfg/ControlFlowGraph.java Fri Mar 02 09:10:04 2012 -0800 @@ -123,10 +123,8 @@ } } - // Compute reverse postorder. - reversePostOrder = new Block[numBlocks]; - int reversePostOrderId = numBlocks - 1; - + // Compute postorder. + ArrayList postOrder = new ArrayList<>(numBlocks); ArrayList stack = new ArrayList<>(); stack.add(blockFor(graph.start())); @@ -136,45 +134,60 @@ // First time we see this block: push all successors. for (Node suxNode : block.getEndNode().cfgSuccessors()) { Block suxBlock = blockFor(suxNode); - assert suxBlock.id != BLOCK_ID_VISITED : "Sux already visited?? from " + block.getEndNode() + " to " + suxNode; if (suxBlock.id == BLOCK_ID_INITIAL) { stack.add(suxBlock); } } block.id = BLOCK_ID_VISITED; } else if (block.id == BLOCK_ID_VISITED) { - // Second time we see this block: All successors haved been processed, so insert block into reverse postorder list. + // Second time we see this block: All successors have been processed, so add block to postorder list. stack.remove(stack.size() - 1); - reversePostOrder[reversePostOrderId] = block; - block.id = reversePostOrderId; - reversePostOrderId--; + postOrder.add(block); } else { throw GraalInternalError.shouldNotReachHere(); } } while (!stack.isEmpty()); - assert reversePostOrderId == -1; + + // Compute reverse postorder and number blocks. + assert postOrder.size() <= numBlocks : "some blocks originally created can be unreachable, so actual block list can be shorter"; + numBlocks = postOrder.size(); + reversePostOrder = new Block[numBlocks]; + for (int i = 0; i < numBlocks; i++) { + reversePostOrder[i] = postOrder.get(numBlocks - i - 1); + reversePostOrder[i].id = i; + } } - // Connect blocks (including loop backward edges). + // Connect blocks (including loop backward edges), but ignoring dead code (blocks with id < 0). private void connectBlocks() { for (Block block : reversePostOrder) { List predecessors = new ArrayList<>(); for (Node predNode : block.getBeginNode().cfgPredecessors()) { - predecessors.add(nodeToBlock.get(predNode)); + Block predBlock = nodeToBlock.get(predNode); + if (predBlock.id >= 0) { + predecessors.add(predBlock); + } } if (block.getBeginNode() instanceof LoopBeginNode) { for (LoopEndNode predNode : ((LoopBeginNode) block.getBeginNode()).orderedLoopEnds()) { - predecessors.add(nodeToBlock.get(predNode)); + Block predBlock = nodeToBlock.get(predNode); + if (predBlock.id >= 0) { + predecessors.add(predBlock); + } } } block.predecessors = predecessors; List successors = new ArrayList<>(); for (Node suxNode : block.getEndNode().cfgSuccessors()) { - successors.add(nodeToBlock.get(suxNode)); + Block suxBlock = nodeToBlock.get(suxNode); + assert suxBlock.id >= 0; + successors.add(suxBlock); } if (block.getEndNode() instanceof LoopEndNode) { - successors.add(nodeToBlock.get(((LoopEndNode) block.getEndNode()).loopBegin())); + Block suxBlock = nodeToBlock.get(((LoopEndNode) block.getEndNode()).loopBegin()); + assert suxBlock.id >= 0; + successors.add(suxBlock); } block.successors = successors; }