diff graal/GraalCompiler/src/com/sun/c1x/alloc/LinearScanWalker.java @ 2718:c1ce2a53d6c3

Attempt to remove dependency between backend and BlockBegin.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Thu, 19 May 2011 16:05:42 +0200
parents 42450f536d24
children a2f62de90c76
line wrap: on
line diff
--- a/graal/GraalCompiler/src/com/sun/c1x/alloc/LinearScanWalker.java	Thu May 19 14:31:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/alloc/LinearScanWalker.java	Thu May 19 16:05:42 2011 +0200
@@ -58,11 +58,11 @@
         return allocator.blockCount();
     }
 
-    BlockBegin blockAt(int idx) {
+    LIRBlock blockAt(int idx) {
         return allocator.blockAt(idx);
     }
 
-    BlockBegin blockOfOpWithId(int opId) {
+    LIRBlock blockOfOpWithId(int opId) {
         return allocator.blockForId(opId);
     }
 
@@ -228,7 +228,7 @@
         // optimized away later in assignRegNums
 
         opId = (opId + 1) & ~1;
-        BlockBegin opBlock = allocator.blockForId(opId);
+        LIRBlock opBlock = allocator.blockForId(opId);
         assert opId > 0 && allocator.blockForId(opId - 2) == opBlock : "cannot insert move at block boundary";
 
         // calculate index of instruction inside instruction list of current block
@@ -252,7 +252,7 @@
         moveResolver.addMapping(srcIt, dstIt);
     }
 
-    int findOptimalSplitPos(BlockBegin minBlock, BlockBegin maxBlock, int maxSplitPos) {
+    int findOptimalSplitPos(LIRBlock minBlock, LIRBlock maxBlock, int maxSplitPos) {
         int fromBlockNr = minBlock.linearScanNumber();
         int toBlockNr = maxBlock.linearScanNumber();
 
@@ -262,19 +262,19 @@
 
         // Try to split at end of maxBlock. If this would be after
         // maxSplitPos, then use the begin of maxBlock
-        int optimalSplitPos = maxBlock.lirBlock.lastLirInstructionId() + 2;
+        int optimalSplitPos = maxBlock.lastLirInstructionId() + 2;
         if (optimalSplitPos > maxSplitPos) {
-            optimalSplitPos = maxBlock.lirBlock.firstLirInstructionId();
+            optimalSplitPos = maxBlock.firstLirInstructionId();
         }
 
         int minLoopDepth = maxBlock.loopDepth();
         for (int i = toBlockNr - 1; i >= fromBlockNr; i--) {
-            BlockBegin cur = blockAt(i);
+            LIRBlock cur = blockAt(i);
 
             if (cur.loopDepth() < minLoopDepth) {
                 // block with lower loop-depth found . split at the end of this block
                 minLoopDepth = cur.loopDepth();
-                optimalSplitPos = cur.lirBlock.lastLirInstructionId() + 2;
+                optimalSplitPos = cur.lastLirInstructionId() + 2;
             }
         }
         assert optimalSplitPos > allocator.maxOpId() || allocator.isBlockBegin(optimalSplitPos) : "algorithm must move split pos to block boundary";
@@ -298,13 +298,13 @@
             // reason for using minSplitPos - 1: when the minimal split pos is exactly at the
             // beginning of a block, then minSplitPos is also a possible split position.
             // Use the block before as minBlock, because then minBlock.lastLirInstructionId() + 2 == minSplitPos
-            BlockBegin minBlock = allocator.blockForId(minSplitPos - 1);
+            LIRBlock minBlock = allocator.blockForId(minSplitPos - 1);
 
             // reason for using maxSplitPos - 1: otherwise there would be an assert on failure
             // when an interval ends at the end of the last block of the method
             // (in this case, maxSplitPos == allocator().maxLirOpId() + 2, and there is no
             // block at this opId)
-            BlockBegin maxBlock = allocator.blockForId(maxSplitPos - 1);
+            LIRBlock maxBlock = allocator.blockForId(maxSplitPos - 1);
 
             assert minBlock.linearScanNumber() <= maxBlock.linearScanNumber() : "invalid order";
             if (minBlock == maxBlock) {
@@ -328,13 +328,13 @@
                 } else {
                     // seach optimal block boundary between minSplitPos and maxSplitPos
                     if (C1XOptions.TraceLinearScanLevel >= 4) {
-                        TTY.println("      moving split pos to optimal block boundary between block B%d and B%d", minBlock.blockID, maxBlock.blockID);
+                        TTY.println("      moving split pos to optimal block boundary between block B%d and B%d", minBlock.blockID(), maxBlock.blockID());
                     }
 
                     if (doLoopOptimization) {
                         // Loop optimization: if a loop-end marker is found between min- and max-position :
                         // then split before this loop
-                        int loopEndPos = interval.nextUsageExact(RegisterPriority.LiveAtLoopEnd, minBlock.lirBlock.lastLirInstructionId() + 2);
+                        int loopEndPos = interval.nextUsageExact(RegisterPriority.LiveAtLoopEnd, minBlock.lastLirInstructionId() + 2);
                         if (C1XOptions.TraceLinearScanLevel >= 4) {
                             TTY.println("      loop optimization: loop end found at pos %d", loopEndPos);
                         }
@@ -346,15 +346,15 @@
                             // the max-position to this loop block.
                             // Desired result: uses tagged as shouldHaveRegister inside a loop cause a reloading
                             // of the interval (normally, only mustHaveRegister causes a reloading)
-                            BlockBegin loopBlock = allocator.blockForId(loopEndPos);
+                            LIRBlock loopBlock = allocator.blockForId(loopEndPos);
 
                             if (C1XOptions.TraceLinearScanLevel >= 4) {
-                                TTY.println("      interval is used in loop that ends in block B%d, so trying to move maxBlock back from B%d to B%d", loopBlock.blockID, maxBlock.blockID, loopBlock.blockID);
+                                TTY.println("      interval is used in loop that ends in block B%d, so trying to move maxBlock back from B%d to B%d", loopBlock.blockID(), maxBlock.blockID(), loopBlock.blockID());
                             }
                             assert loopBlock != minBlock : "loopBlock and minBlock must be different because block boundary is needed between";
 
-                            optimalSplitPos = findOptimalSplitPos(minBlock, loopBlock, loopBlock.lirBlock.lastLirInstructionId() + 2);
-                            if (optimalSplitPos == loopBlock.lirBlock.lastLirInstructionId() + 2) {
+                            optimalSplitPos = findOptimalSplitPos(minBlock, loopBlock, loopBlock.lastLirInstructionId() + 2);
+                            if (optimalSplitPos == loopBlock.lastLirInstructionId() + 2) {
                                 optimalSplitPos = -1;
                                 if (C1XOptions.TraceLinearScanLevel >= 4) {
                                     TTY.println("      loop optimization not necessary");