mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 05:00:26 +00:00
Keep track of how many times a live range has been dequeued, and prioritize new ranges.
When a large live range is evicted, it will usually be split when it comes around again. By deferring evicted live ranges, the splitting happens at a time when the interference pattern is more realistic. This prevents repeated splitting and evictions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126282 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
417df01291
commit
d2a5073423
@ -74,6 +74,7 @@ class RAGreedy : public MachineFunctionPass, public RegAllocBase {
|
||||
std::auto_ptr<Spiller> SpillerInstance;
|
||||
std::auto_ptr<SplitAnalysis> SA;
|
||||
std::priority_queue<std::pair<unsigned, unsigned> > Queue;
|
||||
IndexedMap<unsigned, VirtReg2IndexFunctor> Generation;
|
||||
|
||||
// splitting state.
|
||||
|
||||
@ -186,6 +187,7 @@ void RAGreedy::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
|
||||
void RAGreedy::releaseMemory() {
|
||||
SpillerInstance.reset(0);
|
||||
Generation.clear();
|
||||
RegAllocBase::releaseMemory();
|
||||
}
|
||||
|
||||
@ -202,6 +204,11 @@ void RAGreedy::enqueue(LiveInterval *LI) {
|
||||
if (TargetRegisterInfo::isPhysicalRegister(Hint))
|
||||
Size |= (1u << 30);
|
||||
|
||||
// Boost ranges that we see for the first time.
|
||||
Generation.grow(Reg);
|
||||
if (++Generation[Reg] == 1)
|
||||
Size |= (1u << 31);
|
||||
|
||||
Queue.push(std::make_pair(Size, Reg));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user