diff graal/GraalCompiler/src/com/sun/c1x/graph/IR.java @ 2759:b72e6638b9e6

Removed the link from BlockBegin to LIRBlock.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Fri, 20 May 2011 16:40:32 +0200
parents bfcdda4fdd73
children 127db58b044e
line wrap: on
line diff
--- a/graal/GraalCompiler/src/com/sun/c1x/graph/IR.java	Fri May 20 16:31:31 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/graph/IR.java	Fri May 20 16:40:32 2011 +0200
@@ -66,6 +66,8 @@
         this.compilation = compilation;
     }
 
+    public Map<Value, LIRBlock> valueToBlock;
+
     /**
      * Builds the graph, optimizes it, and computes the linear scan block order.
      */
@@ -83,7 +85,8 @@
 
         Schedule schedule = new Schedule(this.compilation.graph);
 
-        computeLinearScanOrder();
+        valueToBlock = computeLinearScanOrder();
+        verifyAndPrint("After linear scan order");
 
         if (C1XOptions.PrintTimers) {
             C1XTimers.HIR_OPTIMIZE.stop();
@@ -100,14 +103,14 @@
         }
     }
 
-    private void computeLinearScanOrder() {
-        if (C1XOptions.GenLIR) {
-            makeLinearScanOrder();
-            verifyAndPrint("After linear scan order");
-        }
+    private Map<Value, LIRBlock> computeLinearScanOrder() {
+        return makeLinearScanOrder();
     }
 
-    private void makeLinearScanOrder() {
+    private Map<Value, LIRBlock> makeLinearScanOrder() {
+
+        Map<Value, LIRBlock> valueToBlock = new HashMap<Value, LIRBlock>();
+
         if (orderedBlocks == null) {
             CriticalEdgeFinder finder = new CriticalEdgeFinder(this);
             getHIRStartBlock().iteratePreOrder(finder);
@@ -119,7 +122,7 @@
             int z = 0;
             for (BlockBegin bb : blocks) {
                 LIRBlock lirBlock = new LIRBlock(z);
-                bb.setLIRBlock(lirBlock);
+                valueToBlock.put(bb, lirBlock);
                 lirBlock.setLinearScanNumber(bb.linearScanNumber());
                 // TODO(tw): Initialize LIRBlock.linearScanLoopHeader and LIRBlock.linearScanLoopEnd
                 lirBlock.setStateBefore(bb.stateBefore());
@@ -127,14 +130,15 @@
                 ++z;
             }
 
+            z = 0;
             for (BlockBegin bb : blocks) {
-                LIRBlock lirBlock = bb.lirBlock();
+                LIRBlock lirBlock = orderedBlocks.get(z);
                 for (int i = 0; i < bb.numberOfPreds(); ++i) {
-                    lirBlock.blockPredecessors().add(bb.predAt(i).block().lirBlock());
+                    lirBlock.blockPredecessors().add(valueToBlock.get(bb.predAt(i).block()));
                 }
 
                 for (int i = 0; i < bb.numberOfSux(); ++i) {
-                    lirBlock.blockSuccessors().add(bb.suxAt(i).lirBlock());
+                    lirBlock.blockSuccessors().add(valueToBlock.get(bb.suxAt(i)));
                 }
 
                 Instruction first = bb;
@@ -142,12 +146,14 @@
                     lirBlock.getInstructions().add(first);
                     first = first.next();
                 }
+                ++z;
             }
 
-            startBlock = getHIRStartBlock().lirBlock();
+            startBlock = valueToBlock.get(getHIRStartBlock());
             assert startBlock != null;
             compilation.stats.loopCount = computeLinearScanOrder.numLoops();
         }
+        return valueToBlock;
     }
 
     /**