Change the way we choose a free register: instead of picking the first
authorAlkis Evlogimenos <alkis@evlogimenos.com>
Thu, 2 Sep 2004 21:24:33 +0000 (21:24 +0000)
committerAlkis Evlogimenos <alkis@evlogimenos.com>
Thu, 2 Sep 2004 21:24:33 +0000 (21:24 +0000)
free allocatable register, we prefer the a free one with the most uses
of inactive intervals.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16148 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocIterativeScan.cpp

index 26fa7b7655b86c40fbdf05dd63a8cf02541f2187..4cdcc1d4dd221da849f71dd4e0947cbb5510cc29 100644 (file)
@@ -463,17 +463,28 @@ void RA::assignRegOrSpillAtInterval(IntervalPtrs::value_type cur)
 
 }
 
-unsigned RA::getFreePhysReg(IntervalPtrs::value_type cur)
+unsigned RA::getFreePhysReg(LiveInterval* cur)
 {
+  std::vector<unsigned> inactiveCounts(mri_->getNumRegs(), 0);
+  for (IntervalPtrs::iterator i = inactive_.begin(), e = inactive_.end();
+       i != e; ++i) {
+    unsigned reg = (*i)->reg;
+    if (MRegisterInfo::isVirtualRegister(reg))
+      reg = vrm_->getPhys(reg);
+    ++inactiveCounts[reg];
+  }
+
   const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
 
+  unsigned freeReg = 0;
   for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
        i != rc->allocation_order_end(*mf_); ++i) {
     unsigned reg = *i;
-    if (prt_->isRegAvail(reg))
-      return reg;
+    if (prt_->isRegAvail(reg) &&
+        (!freeReg || inactiveCounts[freeReg] < inactiveCounts[reg]))
+        freeReg = reg;
   }
-  return 0;
+  return freeReg;
 }
 
 FunctionPass* llvm::createIterativeScanRegisterAllocator() {