changeset 16508:79bbd0e9f1c9

Move computeDominators to AbstractControlFlowGraph.
author Josef Eisl <josef.eisl@jku.at>
date Tue, 15 Jul 2014 10:25:40 +0200
parents 32f326c239a5
children 1c96b77dcc80
files graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/cfg/AbstractControlFlowGraph.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/ControlFlowGraph.java
diffstat 2 files changed, 27 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- 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 <T extends AbstractBlock<T>> void computeDominators(AbstractControlFlowGraph<T> cfg) {
+        List<T> 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) {
--- 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()) {