Keep track of how many times a live range has been dequeued, and prioritize new ranges.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 23 Feb 2011 00:56:56 +0000 (00:56 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Wed, 23 Feb 2011 00:56:56 +0000 (00:56 +0000)
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

lib/CodeGen/RegAllocGreedy.cpp

index 59d4fc6180eb3edafd9dc3e2ee550232bb65fa0e..03886195404a8557f38cb067960f41e54a61e08a 100644 (file)
@@ -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));
 }