changeset 8186:bf1c9ae73775

Schedule predecessors before merges.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sun, 10 Mar 2013 23:02:48 +0100
parents 3bbdf34536bc
children 317b004fc741
files graal/com.oracle.graal.alloc/src/com/oracle/graal/alloc/ComputeBlockOrder.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java
diffstat 2 files changed, 14 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.alloc/src/com/oracle/graal/alloc/ComputeBlockOrder.java	Sun Mar 10 19:51:32 2013 +0100
+++ b/graal/com.oracle.graal.alloc/src/com/oracle/graal/alloc/ComputeBlockOrder.java	Sun Mar 10 23:02:48 2013 +0100
@@ -118,7 +118,20 @@
     private static void addPathToLinearScanOrder(Block block, List<Block> order, PriorityQueue<Block> worklist, BitSet visitedBlocks) {
         block.setLinearScanNumber(order.size());
         order.add(block);
+        Block mostLikelySuccessor = findAndMarkMostLikelySuccessor(block, visitedBlocks);
         enqueueSuccessors(block, worklist, visitedBlocks);
+        if (mostLikelySuccessor != null) {
+            if (!mostLikelySuccessor.isLoopHeader() && mostLikelySuccessor.getPredecessorCount() > 1) {
+                // We are at a merge. Check that predecessors are scheduled.
+                for (Block pred : mostLikelySuccessor.getPredecessors()) {
+                    if (pred.getLinearScanNumber() == -1) {
+                        visitedBlocks.clear(mostLikelySuccessor.getId());
+                        return;
+                    }
+                }
+            }
+            addPathToLinearScanOrder(mostLikelySuccessor, order, worklist, visitedBlocks);
+        }
     }
 
     /**
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java	Sun Mar 10 19:51:32 2013 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java	Sun Mar 10 23:02:48 2013 +0100
@@ -47,6 +47,7 @@
 
     protected Block() {
         id = ControlFlowGraph.BLOCK_ID_INITIAL;
+        this.linearScanNumber = -1;
     }
 
     public int getId() {