# HG changeset patch # User Josef Eisl # Date 1405412740 -7200 # Node ID 79bbd0e9f1c91087fc0f5df73bfd1aa36db71f02 # Parent 32f326c239a5fd7fff9709ce902db778b32acf0f Move computeDominators to AbstractControlFlowGraph. diff -r 32f326c239a5 -r 79bbd0e9f1c9 graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/AbstractControlFlowGraph.java --- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/AbstractControlFlowGraph.java Tue Jul 15 10:17:10 2014 +0200 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/AbstractControlFlowGraph.java Tue Jul 15 10:25:40 2014 +0200 @@ -32,8 +32,8 @@ /** * Returns the list blocks contained in this control flow graph. * - * It is {@linkplain CFGVerifier guaranteed} that the blocks are numbered according to a reverse - * post order traversal of the control flow graph. + * It is {@linkplain CFGVerifier guaranteed} that the blocks are numbered and ordered according + * to a reverse post order traversal of the control flow graph. * * @see CFGVerifier */ @@ -44,6 +44,30 @@ T getStartBlock(); /** + * Computes the dominators of control flow graph. + */ + static > void computeDominators(AbstractControlFlowGraph cfg) { + List reversePostOrder = cfg.getBlocks(); + assert reversePostOrder.get(0).getPredecessorCount() == 0 : "start block has no predecessor and therefore no dominator"; + for (int i = 1; i < reversePostOrder.size(); i++) { + T block = reversePostOrder.get(i); + assert block.getPredecessorCount() > 0; + T dominator = null; + for (T pred : block.getPredecessors()) { + if (!pred.isLoopEnd()) { + dominator = commonDominatorTyped(dominator, pred); + } + } + // set dominator + block.setDominator(dominator); + if (dominator.getDominated().equals(Collections.emptyList())) { + dominator.setDominated(new ArrayList<>()); + } + dominator.getDominated().add(block); + } + } + + /** * True if block {@code a} is dominated by block {@code b}. */ static boolean isDominatedBy(AbstractBlock a, AbstractBlock b) { diff -r 32f326c239a5 -r 79bbd0e9f1c9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java Tue Jul 15 10:17:10 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java Tue Jul 15 10:25:40 2014 +0200 @@ -49,7 +49,7 @@ cfg.computeLoopInformation(); } if (computeDominators) { - cfg.computeDominators(); + AbstractControlFlowGraph.computeDominators(cfg); } if (computePostdominators) { cfg.computePostdominators(); @@ -309,29 +309,6 @@ } } - private void computeDominators() { - assert reversePostOrder.get(0).getPredecessorCount() == 0 : "start block has no predecessor and therefore no dominator"; - for (int i = 1; i < reversePostOrder.size(); i++) { - Block block = reversePostOrder.get(i); - assert block.getPredecessorCount() > 0; - Block dominator = null; - for (Block pred : block.getPredecessors()) { - if (!pred.isLoopEnd()) { - dominator = AbstractControlFlowGraph.commonDominatorTyped(dominator, pred); - } - } - setDominator(block, dominator); - } - } - - private static void setDominator(Block block, Block dominator) { - block.setDominator(dominator); - if (dominator.dominated == null) { - dominator.dominated = new ArrayList<>(); - } - dominator.dominated.add(block); - } - private void computePostdominators() { outer: for (Block block : postOrder()) { if (block.isLoopEnd()) {