summaryrefslogtreecommitdiff
path: root/lib/CodeGen/RegAllocGreedy.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2011-07-14 05:35:11 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2011-07-14 05:35:11 +0000
commitf1c709837bd11c5383fce3b8a026a7c8eaabba86 (patch)
tree93f1a51b7608bf5cc57dcd508fbf5b044a143207 /lib/CodeGen/RegAllocGreedy.cpp
parent49c19f778b62df6f2a28798113a17d5cb3582bda (diff)
downloadllvm-f1c709837bd11c5383fce3b8a026a7c8eaabba86.tar.gz
llvm-f1c709837bd11c5383fce3b8a026a7c8eaabba86.tar.bz2
llvm-f1c709837bd11c5383fce3b8a026a7c8eaabba86.tar.xz
Reapply r135121 with a fixed copy constructor.
Original commit message: Count references to interference cache entries. Each InterferenceCache::Cursor instance references a cache entry. A non-zero reference count guarantees that the entry won't be reused for a new register. This makes it possible to have multiple live cursors examining interference for different physregs. The total number of live cursors into a cache must be kept below InterferenceCache::getMaxCursors(). Code generation should be unaffected by this change, and it doesn't seem to affect the cache replacement strategy either. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@135130 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/RegAllocGreedy.cpp')
-rw-r--r--lib/CodeGen/RegAllocGreedy.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/CodeGen/RegAllocGreedy.cpp b/lib/CodeGen/RegAllocGreedy.cpp
index 4728a050b1..8677a3e257 100644
--- a/lib/CodeGen/RegAllocGreedy.cpp
+++ b/lib/CodeGen/RegAllocGreedy.cpp
@@ -854,11 +854,6 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg,
});
InterferenceCache::Cursor &Intf = Cand.Intf;
-
- // FIXME: We need cache reference counts to guarantee that Intf hasn't been
- // clobbered.
- Intf.setPhysReg(IntfCache, Cand.PhysReg);
-
LiveRangeEdit LREdit(VirtReg, NewVRegs, this);
SE->reset(LREdit);
@@ -1252,6 +1247,22 @@ unsigned RAGreedy::tryRegionSplit(LiveInterval &VirtReg, AllocationOrder &Order,
Order.rewind();
while (unsigned PhysReg = Order.next()) {
+ // Discard bad candidates before we run out of interference cache cursors.
+ // This will only affect register classes with a lot of registers (>32).
+ if (NumCands == IntfCache.getMaxCursors()) {
+ unsigned WorstCount = ~0u;
+ unsigned Worst = 0;
+ for (unsigned i = 0; i != NumCands; ++i) {
+ if (i == BestCand)
+ continue;
+ unsigned Count = GlobalCand[i].LiveBundles.count();
+ if (Count < WorstCount)
+ Worst = i, WorstCount = Count;
+ }
+ --NumCands;
+ GlobalCand[Worst] = GlobalCand[NumCands];
+ }
+
if (GlobalCand.size() <= NumCands)
GlobalCand.resize(NumCands+1);
GlobalSplitCandidate &Cand = GlobalCand[NumCands];