summaryrefslogtreecommitdiff
path: root/lib/CodeGen/RegAllocGreedy.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2012-02-14 23:51:27 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2012-02-14 23:51:27 +0000
commitcac5fa39bd861861018bb2c3f0b36cc71c2caa38 (patch)
tree741e2246bfe739e1ae7a71ee746a9e4c3181ecd1 /lib/CodeGen/RegAllocGreedy.cpp
parent1cf8b0f2a5435d8444b6cc7d4a27eef424398273 (diff)
downloadllvm-cac5fa39bd861861018bb2c3f0b36cc71c2caa38.tar.gz
llvm-cac5fa39bd861861018bb2c3f0b36cc71c2caa38.tar.bz2
llvm-cac5fa39bd861861018bb2c3f0b36cc71c2caa38.tar.xz
Fix details in local live range splitting with regmasks.
Perform all comparisons at instruction granularity, and make sure register masks on uses count in both gaps. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150530 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/RegAllocGreedy.cpp')
-rw-r--r--lib/CodeGen/RegAllocGreedy.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/lib/CodeGen/RegAllocGreedy.cpp b/lib/CodeGen/RegAllocGreedy.cpp
index 874dca6f56..61e5e823df 100644
--- a/lib/CodeGen/RegAllocGreedy.cpp
+++ b/lib/CodeGen/RegAllocGreedy.cpp
@@ -1358,18 +1358,28 @@ unsigned RAGreedy::tryLocalSplit(LiveInterval &VirtReg, AllocationOrder &Order,
if (!UsableRegs.empty()) {
// Get regmask slots for the whole block.
ArrayRef<SlotIndex> RMS = LIS->getRegMaskSlotsInBlock(BI.MBB->getNumber());
+ DEBUG(dbgs() << RMS.size() << " regmasks in block:");
// Constrain to VirtReg's live range.
- unsigned ri = std::lower_bound(RMS.begin(), RMS.end(), Uses.front())
- - RMS.begin();
+ unsigned ri = std::lower_bound(RMS.begin(), RMS.end(),
+ Uses.front().getRegSlot()) - RMS.begin();
unsigned re = RMS.size();
for (unsigned i = 0; i != NumGaps && ri != re; ++i) {
- assert(Uses[i] <= RMS[ri]);
- if (Uses[i+1] <= RMS[ri])
+ // Look for Uses[i] <= RMS <= Uses[i+1].
+ assert(!SlotIndex::isEarlierInstr(RMS[ri], Uses[i]));
+ if (SlotIndex::isEarlierInstr(Uses[i+1], RMS[ri]))
continue;
+ // Skip a regmask on the same instruction as the last use. It doesn't
+ // overlap the live range.
+ if (SlotIndex::isSameInstr(Uses[i+1], RMS[ri]) && i+1 == NumGaps)
+ break;
+ DEBUG(dbgs() << ' ' << RMS[ri] << ':' << Uses[i] << '-' << Uses[i+1]);
RegMaskGaps.push_back(i);
- do ++ri;
- while (ri != re && RMS[ri] < Uses[i+1]);
+ // Advance ri to the next gap. A regmask on one of the uses counts in
+ // both gaps.
+ while (ri != re && SlotIndex::isEarlierInstr(RMS[ri], Uses[i+1]))
+ ++ri;
}
+ DEBUG(dbgs() << '\n');
}
// Since we allow local split results to be split again, there is a risk of