From 84f5bcb0139789010eb4a4509fddf811def8794e Mon Sep 17 00:00:00 2001 From: Alkis Evlogimenos Date: Thu, 2 Sep 2004 21:23:32 +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. This causes less spills and performes a bit better compared to gcc: Program | GCC/LLC (Before)| GCC/LLC (After) 164.gzip/164.gzip | 0.59 | 0.60 175.vpr/175.vpr | 0.57 | 0.58 176.gcc/176.gcc | 0.59 | 0.61 181.mcf/181.mcf | 0.94 | 0.95 186.crafty/186.crafty | 0.62 | 0.62 197.parser/197.parser | 0.89 | 0.88 252.eon/252.eon | 0.61 | 0.66 253.perlbmk/253.perlbmk | 0.79 | 0.84 254.gap/254.gap | 0.81 | 0.81 255.vortex/255.vortex | 0.92 | 0.93 256.bzip2/256.bzip2 | 0.69 | 0.69 300.twolf/300.twolf | 0.91 | 0.90 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16147 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/RegAllocLinearScan.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/CodeGen/RegAllocLinearScan.cpp b/lib/CodeGen/RegAllocLinearScan.cpp index 0204494fd65..00e4e8979e9 100644 --- a/lib/CodeGen/RegAllocLinearScan.cpp +++ b/lib/CodeGen/RegAllocLinearScan.cpp @@ -522,15 +522,26 @@ void RA::assignRegOrStackSlotAtInterval(LiveInterval* 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::createLinearScanRegisterAllocator() {