mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Teach the register scavenger to take subregs into account when finding a free register.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127049 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
515c67ee77
commit
27ea9999e8
@ -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.
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user