1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

Teach the register scavenger to take subregs into account when finding a free register.

llvm-svn: 127049
This commit is contained in:
Jim Grosbach 2011-03-05 00:20:19 +00:00
parent d779c4197b
commit 372394916e
2 changed files with 11 additions and 6 deletions

View File

@ -100,7 +100,7 @@ public:
/// getRegsAvailable - Return all available registers in the register class
/// in Mask.
void getRegsAvailable(const TargetRegisterClass *RC, BitVector &Mask);
BitVector getRegsAvailable(const TargetRegisterClass *RC);
/// FindUnusedReg - Find a unused register of the specified register class.
/// Return 0 if none is found.

View File

@ -241,12 +241,13 @@ unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RC) const {
/// getRegsAvailable - Return all available registers in the register class
/// in Mask.
void RegScavenger::getRegsAvailable(const TargetRegisterClass *RC,
BitVector &Mask) {
BitVector RegScavenger::getRegsAvailable(const TargetRegisterClass *RC) {
BitVector Mask(TRI->getNumRegs());
for (TargetRegisterClass::iterator I = RC->begin(), E = RC->end();
I != E; ++I)
if (!isAliasUsed(*I))
Mask.set(*I);
return Mask;
}
/// findSurvivorReg - Return the candidate register that is unused for the
@ -335,9 +336,13 @@ unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
}
// Try to find a register that's unused if there is one, as then we won't
// have to spill.
if ((Candidates & RegsAvailable).any())
Candidates &= RegsAvailable;
// have to spill. Search explicitly rather than masking out based on
// RegsAvailable, as RegsAvailable does not take aliases into account.
// That's what getRegsAvailable() is for.
BitVector Available = getRegsAvailable(RC);
if ((Candidates & Available).any())
Candidates &= Available;
// Find the register whose use is furthest away.
MachineBasicBlock::iterator UseMI;