Constrain the regmask search space for local live ranges.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 10 Feb 2012 01:31:31 +0000 (01:31 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 10 Feb 2012 01:31:31 +0000 (01:31 +0000)
When checking a local live range for interference, restrict the binary
search to the single block.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150220 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveIntervalAnalysis.cpp

index 1b80c9ca8493a2ea2df2b8f4ae4a00e373547985..b305fc2ab1769a738db10c3a07ceeb12b2f15bc4 100644 (file)
@@ -1161,11 +1161,21 @@ bool LiveIntervals::checkRegMaskInterference(LiveInterval &LI,
                                              BitVector &UsableRegs) {
   if (LI.empty())
     return false;
+  LiveInterval::iterator LiveI = LI.begin(), LiveE = LI.end();
+
+  // Use a smaller arrays for local live ranges.
+  ArrayRef<SlotIndex> Slots;
+  ArrayRef<const uint32_t*> Bits;
+  if (MachineBasicBlock *MBB = intervalIsInOneMBB(LI)) {
+    Slots = getRegMaskSlotsInBlock(MBB->getNumber());
+    Bits = getRegMaskBitsInBlock(MBB->getNumber());
+  } else {
+    Slots = getRegMaskSlots();
+    Bits = getRegMaskBits();
+  }
 
   // We are going to enumerate all the register mask slots contained in LI.
   // Start with a binary search of RegMaskSlots to find a starting point.
-  LiveInterval::iterator LiveI = LI.begin(), LiveE = LI.end();
-  ArrayRef<SlotIndex> Slots = getRegMaskSlots();
   ArrayRef<SlotIndex>::iterator SlotI =
     std::lower_bound(Slots.begin(), Slots.end(), LiveI->start);
   ArrayRef<SlotIndex>::iterator SlotE = Slots.end();
@@ -1187,7 +1197,7 @@ bool LiveIntervals::checkRegMaskInterference(LiveInterval &LI,
         Found = true;
       }
       // Remove usable registers clobbered by this mask.
-      UsableRegs.clearBitsNotInMask(RegMaskBits[SlotI-Slots.begin()]);
+      UsableRegs.clearBitsNotInMask(Bits[SlotI-Slots.begin()]);
       if (++SlotI == SlotE)
         return Found;
     }