diff options
author | Chris Lattner <sabre@nondot.org> | 2005-08-22 16:55:22 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-08-22 16:55:22 +0000 |
commit | f8355d9846ab9b24d052870ca19c23b332c95d1e (patch) | |
tree | c081036759f9635b41edfe43eaa9e4ee429c1ada /lib/CodeGen/RegAllocLinearScan.cpp | |
parent | ce5fcc30ae71ee965dbde2da31e47e05b47ff248 (diff) |
Speed up this loop a bit, based on some observations that Nate made, and
add some comments. This loop really needs to be reevaluated!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22966 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/RegAllocLinearScan.cpp')
-rw-r--r-- | lib/CodeGen/RegAllocLinearScan.cpp | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/lib/CodeGen/RegAllocLinearScan.cpp b/lib/CodeGen/RegAllocLinearScan.cpp index 61cc11e413..e85826c047 100644 --- a/lib/CodeGen/RegAllocLinearScan.cpp +++ b/lib/CodeGen/RegAllocLinearScan.cpp @@ -603,6 +603,8 @@ void RA::assignRegOrStackSlotAtInterval(LiveInterval* cur) unsigned RA::getFreePhysReg(LiveInterval* cur) { std::vector<unsigned> inactiveCounts(mri_->getNumRegs(), 0); + unsigned MaxInactiveCount = 0; + for (IntervalPtrs::iterator i = inactive_.begin(), e = inactive_.end(); i != e; ++i) { unsigned reg = i->first->reg; @@ -610,19 +612,43 @@ unsigned RA::getFreePhysReg(LiveInterval* cur) "Can only allocate virtual registers!"); reg = vrm_->getPhys(reg); ++inactiveCounts[reg]; + MaxInactiveCount = std::max(MaxInactiveCount, inactiveCounts[reg]); } const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg); - unsigned freeReg = 0; - for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_), - e = rc->allocation_order_end(*mf_); i != e; ++i) { - unsigned reg = *i; - if (prt_->isRegAvail(reg) && - (!freeReg || inactiveCounts[freeReg] < inactiveCounts[reg])) - freeReg = reg; + unsigned FreeReg = 0; + unsigned FreeRegInactiveCount = 0; + + // Scan for the first available register. + TargetRegisterClass::iterator I = rc->allocation_order_begin(*mf_); + TargetRegisterClass::iterator E = rc->allocation_order_end(*mf_); + for (; I != E; ++I) + if (prt_->isRegAvail(*I)) { + FreeReg = *I; + FreeRegInactiveCount = inactiveCounts[FreeReg]; + break; + } + + // If there are no free regs, or if this reg has the max inactive count, + // return this register. + if (FreeReg == 0 || FreeRegInactiveCount == MaxInactiveCount) return FreeReg; + + // Continue scanning the registers, looking for the one with the highest + // inactive count. Alkis found that this reduced register pressure very + // slightly on X86 (in rev 1.94 of this file), though this should probably be + // reevaluated now. + for (; I != E; ++I) { + unsigned Reg = *I; + if (prt_->isRegAvail(Reg) && FreeRegInactiveCount < inactiveCounts[Reg]) { + FreeReg = Reg; + FreeRegInactiveCount = inactiveCounts[Reg]; + if (FreeRegInactiveCount == MaxInactiveCount) + break; // We found the one with the max inactive count. + } } - return freeReg; + + return FreeReg; } FunctionPass* llvm::createLinearScanRegisterAllocator() { |