From 70619fae28414db54e00be2f9052a66cd245a9c8 Mon Sep 17 00:00:00 2001 From: Alkis Evlogimenos Date: Thu, 2 Sep 2004 21:24:33 +0000 Subject: [PATCH] Change the way we choose a free register: instead of picking the first 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 | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/RegAllocIterativeScan.cpp b/lib/CodeGen/RegAllocIterativeScan.cpp index 26fa7b7655b..4cdcc1d4dd2 100644 --- a/lib/CodeGen/RegAllocIterativeScan.cpp +++ b/lib/CodeGen/RegAllocIterativeScan.cpp @@ -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 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() { -- 2.34.1