mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 04:38:24 +00:00
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
This commit is contained in:
@ -14,6 +14,7 @@
|
||||
#define DEBUG_TYPE "regalloc"
|
||||
#include "InterferenceCache.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
@ -40,9 +41,18 @@ InterferenceCache::Entry *InterferenceCache::get(unsigned PhysReg) {
|
||||
E = RoundRobin;
|
||||
if (++RoundRobin == CacheEntries)
|
||||
RoundRobin = 0;
|
||||
Entries[E].reset(PhysReg, LIUArray, TRI, MF);
|
||||
PhysRegEntries[PhysReg] = E;
|
||||
return &Entries[E];
|
||||
for (unsigned i = 0; i != CacheEntries; ++i) {
|
||||
// Skip entries that are in use.
|
||||
if (Entries[E].hasRefs()) {
|
||||
if (++E == CacheEntries)
|
||||
E = 0;
|
||||
continue;
|
||||
}
|
||||
Entries[E].reset(PhysReg, LIUArray, TRI, MF);
|
||||
PhysRegEntries[PhysReg] = E;
|
||||
return &Entries[E];
|
||||
}
|
||||
llvm_unreachable("Ran out of interference cache entries.");
|
||||
}
|
||||
|
||||
/// revalidate - LIU contents have changed, update tags.
|
||||
@ -59,6 +69,7 @@ void InterferenceCache::Entry::reset(unsigned physReg,
|
||||
LiveIntervalUnion *LIUArray,
|
||||
const TargetRegisterInfo *TRI,
|
||||
const MachineFunction *MF) {
|
||||
assert(!hasRefs() && "Cannot reset cache entry with references");
|
||||
// LIU's changed, invalidate cache.
|
||||
++Tag;
|
||||
PhysReg = physReg;
|
||||
|
Reference in New Issue
Block a user