diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-02-10 01:31:31 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-02-10 01:31:31 +0000 |
commit | 9f10ac63a3a2a74ac381a05d8ba0f7b1b455a6b6 (patch) | |
tree | d5b814d303b6c4341765245dd66e60217955a7d5 /lib/CodeGen/LiveIntervalAnalysis.cpp | |
parent | 34e85d0307e3c17e5061622dccf8a20e5457b099 (diff) |
Constrain the regmask search space for local live ranges.
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
Diffstat (limited to 'lib/CodeGen/LiveIntervalAnalysis.cpp')
-rw-r--r-- | lib/CodeGen/LiveIntervalAnalysis.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index 1b80c9ca84..b305fc2ab1 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -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; } |