mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-21 02:24:22 +00:00
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
This commit is contained in:
@ -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);
|
const TargetRegisterClass* rc = mf_->getSSARegMap()->getRegClass(cur->reg);
|
||||||
|
|
||||||
|
unsigned freeReg = 0;
|
||||||
for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
|
for (TargetRegisterClass::iterator i = rc->allocation_order_begin(*mf_);
|
||||||
i != rc->allocation_order_end(*mf_); ++i) {
|
i != rc->allocation_order_end(*mf_); ++i) {
|
||||||
unsigned reg = *i;
|
unsigned reg = *i;
|
||||||
if (prt_->isRegAvail(reg))
|
if (prt_->isRegAvail(reg) &&
|
||||||
return reg;
|
(!freeReg || inactiveCounts[freeReg] < inactiveCounts[reg]))
|
||||||
|
freeReg = reg;
|
||||||
}
|
}
|
||||||
return 0;
|
return freeReg;
|
||||||
}
|
}
|
||||||
|
|
||||||
FunctionPass* llvm::createIterativeScanRegisterAllocator() {
|
FunctionPass* llvm::createIterativeScanRegisterAllocator() {
|
||||||
|
Reference in New Issue
Block a user