Change the way we choose a free register: instead of picking the first
[oota-llvm.git] / 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() {