mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-16 11:24:39 +00:00
In Thumb1, the register scavenger is not always able to use an emergency
spill slot. When frame references are via the frame pointer, they will be negative, but Thumb1 load/store instructions only allow positive immediate offsets. Instead, Thumb1 will spill to R12. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83336 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -268,9 +268,6 @@ unsigned RegScavenger::findSurvivorReg(MachineBasicBlock::iterator MI,
|
||||
unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
|
||||
MachineBasicBlock::iterator I,
|
||||
int SPAdj) {
|
||||
assert(ScavengingFrameIndex >= 0 &&
|
||||
"Cannot scavenge a register without an emergency spill slot!");
|
||||
|
||||
// Mask off the registers which are not in the TargetRegisterClass.
|
||||
BitVector Candidates(NumPhysRegs, false);
|
||||
CreateRegClassMask(RC, Candidates);
|
||||
@@ -301,14 +298,23 @@ unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
|
||||
// Avoid infinite regress
|
||||
ScavengedReg = SReg;
|
||||
|
||||
// Spill the scavenged register before I.
|
||||
TII->storeRegToStackSlot(*MBB, I, SReg, true, ScavengingFrameIndex, RC);
|
||||
MachineBasicBlock::iterator II = prior(I);
|
||||
TRI->eliminateFrameIndex(II, SPAdj, this);
|
||||
// If the target knows how to save/restore the register, let it do so;
|
||||
// otherwise, use the emergency stack spill slot.
|
||||
if (!TRI->saveScavengerRegister(*MBB, I, RC, SReg)) {
|
||||
// Spill the scavenged register before I.
|
||||
assert(ScavengingFrameIndex >= 0 &&
|
||||
"Cannot scavenging register without an emergency spill slot!");
|
||||
TII->storeRegToStackSlot(*MBB, I, SReg, true, ScavengingFrameIndex, RC);
|
||||
MachineBasicBlock::iterator II = prior(I);
|
||||
TRI->eliminateFrameIndex(II, SPAdj, this);
|
||||
|
||||
// Restore the scavenged register before its use (or first terminator).
|
||||
TII->loadRegFromStackSlot(*MBB, UseMI, SReg, ScavengingFrameIndex, RC);
|
||||
} else
|
||||
TRI->restoreScavengerRegister(*MBB, UseMI, RC, SReg);
|
||||
|
||||
// Restore the scavenged register before its use (or first terminator).
|
||||
TII->loadRegFromStackSlot(*MBB, UseMI, SReg, ScavengingFrameIndex, RC);
|
||||
ScavengeRestore = prior(UseMI);
|
||||
|
||||
// Doing this here leads to infinite regress.
|
||||
// ScavengedReg = SReg;
|
||||
ScavengedRC = RC;
|
||||
|
Reference in New Issue
Block a user