mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-12 13:30:51 +00:00
Allow a target to choose whether to prefer the scavenger emergency spill slot
be next to the frame pointer or the stack pointer. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126956 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
24b17c6730
commit
0f657b156f
@ -631,6 +631,13 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// useFPForScavengingIndex - returns true if the target wants to use
|
||||||
|
/// frame pointer based accesses to spill to the scavenger emergency spill
|
||||||
|
/// slot.
|
||||||
|
virtual bool useFPForScavengingIndex(const MachineFunction &MF) const {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/// requiresFrameIndexScavenging - returns true if the target requires post
|
/// requiresFrameIndexScavenging - returns true if the target requires post
|
||||||
/// PEI scavenging of registers for materializing frame index constants.
|
/// PEI scavenging of registers for materializing frame index constants.
|
||||||
virtual bool requiresFrameIndexScavenging(const MachineFunction &MF) const {
|
virtual bool requiresFrameIndexScavenging(const MachineFunction &MF) const {
|
||||||
|
@ -559,7 +559,8 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
|
|||||||
// Make sure the special register scavenging spill slot is closest to the
|
// Make sure the special register scavenging spill slot is closest to the
|
||||||
// frame pointer if a frame pointer is required.
|
// frame pointer if a frame pointer is required.
|
||||||
const TargetRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
|
const TargetRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
|
||||||
if (RS && TFI.hasFP(Fn) && !RegInfo->needsStackRealignment(Fn)) {
|
if (RS && TFI.hasFP(Fn) && RegInfo->useFPForScavengingIndex(Fn) &&
|
||||||
|
!RegInfo->needsStackRealignment(Fn)) {
|
||||||
int SFI = RS->getScavengingFrameIndex();
|
int SFI = RS->getScavengingFrameIndex();
|
||||||
if (SFI >= 0)
|
if (SFI >= 0)
|
||||||
AdjustStackOffset(MFI, SFI, StackGrowsDown, Offset, MaxAlign);
|
AdjustStackOffset(MFI, SFI, StackGrowsDown, Offset, MaxAlign);
|
||||||
@ -641,7 +642,8 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
|
|||||||
|
|
||||||
// Make sure the special register scavenging spill slot is closest to the
|
// Make sure the special register scavenging spill slot is closest to the
|
||||||
// stack pointer.
|
// stack pointer.
|
||||||
if (RS && (!TFI.hasFP(Fn) || RegInfo->needsStackRealignment(Fn))) {
|
if (RS && (!TFI.hasFP(Fn) || RegInfo->needsStackRealignment(Fn) ||
|
||||||
|
!RegInfo->useFPForScavengingIndex(Fn))) {
|
||||||
int SFI = RS->getScavengingFrameIndex();
|
int SFI = RS->getScavengingFrameIndex();
|
||||||
if (SFI >= 0)
|
if (SFI >= 0)
|
||||||
AdjustStackOffset(MFI, SFI, StackGrowsDown, Offset, MaxAlign);
|
AdjustStackOffset(MFI, SFI, StackGrowsDown, Offset, MaxAlign);
|
||||||
@ -811,7 +813,6 @@ void PEI::scavengeFrameVirtualRegs(MachineFunction &Fn) {
|
|||||||
// directly.
|
// directly.
|
||||||
for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ) {
|
for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ) {
|
||||||
MachineInstr *MI = I;
|
MachineInstr *MI = I;
|
||||||
bool DoIncr = true;
|
|
||||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||||
if (MI->getOperand(i).isReg()) {
|
if (MI->getOperand(i).isReg()) {
|
||||||
MachineOperand &MO = MI->getOperand(i);
|
MachineOperand &MO = MI->getOperand(i);
|
||||||
@ -842,10 +843,8 @@ void PEI::scavengeFrameVirtualRegs(MachineFunction &Fn) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (DoIncr) {
|
RS->forward(I);
|
||||||
RS->forward(I);
|
++I;
|
||||||
++I;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user