[llvm-commits] [llvm] r125132 - /llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp

Jakob Stoklund Olesen stoklund at 2pi.dk
Tue Feb 8 15:02:58 PST 2011


Author: stoklund
Date: Tue Feb  8 17:02:58 2011
New Revision: 125132

URL: http://llvm.org/viewvc/llvm-project?rev=125132&view=rev
Log:
Reorganize interference code to check LastSplitPoint first.

The last split point can be anywhere in the block, so it interferes with the
strictly monotonic requirements of advanceTo().

Modified:
    llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp

Modified: llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp?rev=125132&r1=125131&r2=125132&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp (original)
+++ llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp Tue Feb  8 17:02:58 2011
@@ -449,6 +449,8 @@
     if (!IntI.valid())
       continue;
 
+    // Determine which blocks have interference live in or after the last split
+    // point.
     for (unsigned i = 0, e = LiveBlocks.size(); i != e; ++i) {
       BlockInfo &BI = LiveBlocks[i];
       SpillPlacement::BlockConstraint &BC = SpillConstraints[i];
@@ -459,29 +461,51 @@
       if (IntI.start() >= Stop)
         continue;
 
-      // Handle transparent blocks with interference separately.
-      // Transparent blocks never incur any fixed cost.
-      if (BI.LiveThrough && !BI.Uses) {
-        // Check if interference is live-in - force spill.
-        if (BC.Entry != SpillPlacement::MustSpill) {
-          BC.Entry = SpillPlacement::PrefSpill;
-          IntI.advanceTo(Start);
-          if (IntI.valid() && IntI.start() <= Start)
-            BC.Entry = SpillPlacement::MustSpill;
-        }
+      // Is the interference live-in?
+      if (BI.LiveIn) {
+        IntI.advanceTo(Start);
+        if (!IntI.valid())
+          break;
+        if (IntI.start() <= Start)
+          BC.Entry = SpillPlacement::MustSpill;
+      }
 
-        // Check if interference is live-out - force spill.
-        if (BC.Exit != SpillPlacement::MustSpill) {
-          BC.Exit = SpillPlacement::PrefSpill;
-          // Any interference overlapping [LastSplitPoint;Stop) forces a spill.
+      // Is the interference overlapping the last split point?
+      if (BI.LiveOut) {
+        if (IntI.stop() < BI.LastSplitPoint)
           IntI.advanceTo(BI.LastSplitPoint.getPrevSlot());
-          if (IntI.valid() && IntI.start() < Stop)
-            BC.Exit = SpillPlacement::MustSpill;
-        }
+        if (!IntI.valid())
+          break;
+        if (IntI.start() < Stop)
+          BC.Exit = SpillPlacement::MustSpill;
+      }
+    }
 
-        // Nothing more to do for this transparent block.
+    // Rewind iterator and check other interferences.
+    IntI.find(VirtReg.beginIndex());
+    for (unsigned i = 0, e = LiveBlocks.size(); i != e; ++i) {
+      BlockInfo &BI = LiveBlocks[i];
+      SpillPlacement::BlockConstraint &BC = SpillConstraints[i];
+      SlotIndex Start, Stop;
+      tie(Start, Stop) = Indexes->getMBBRange(BI.MBB);
+
+      // Skip interference-free blocks.
+      if (IntI.start() >= Stop)
+        continue;
+
+      // Handle transparent blocks with interference separately.
+      // Transparent blocks never incur any fixed cost.
+      if (BI.LiveThrough && !BI.Uses) {
+        IntI.advanceTo(Start);
         if (!IntI.valid())
           break;
+        if (IntI.start() >= Stop)
+          continue;
+
+        if (BC.Entry != SpillPlacement::MustSpill)
+          BC.Entry = SpillPlacement::PrefSpill;
+        if (BC.Exit != SpillPlacement::MustSpill)
+          BC.Exit = SpillPlacement::PrefSpill;
         continue;
       }
 
@@ -494,12 +518,8 @@
         IntI.advanceTo(Start);
         if (!IntI.valid())
           break;
-
-        // Interference is live-in - force spill.
-        if (IntI.start() <= Start)
-          BC.Entry = SpillPlacement::MustSpill;
         // Not live in, but before the first use.
-        else if (IntI.start() < BI.FirstUse)
+        if (IntI.start() < BI.FirstUse)
           BC.Entry = SpillPlacement::PrefSpill;
       }
 
@@ -534,12 +554,6 @@
           if (IntI.start() < Stop)
             BC.Exit = SpillPlacement::PrefSpill;
         }
-        // Is the interference overlapping the last split point?
-        IntI.advanceTo(BI.LastSplitPoint.getPrevSlot());
-        if (!IntI.valid())
-          break;
-        if (IntI.start() < Stop)
-          BC.Exit = SpillPlacement::MustSpill;
       }
     }
   }





More information about the llvm-commits mailing list