mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
Downwards growing stack allocation order reverses relative offsets
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111673 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -174,6 +174,7 @@ static inline bool
|
|||||||
lookupCandidateBaseReg(const SmallVector<std::pair<unsigned, int64_t>, 8> &Regs,
|
lookupCandidateBaseReg(const SmallVector<std::pair<unsigned, int64_t>, 8> &Regs,
|
||||||
std::pair<unsigned, int64_t> &RegOffset,
|
std::pair<unsigned, int64_t> &RegOffset,
|
||||||
int64_t LocalFrameOffset,
|
int64_t LocalFrameOffset,
|
||||||
|
bool StackGrowsDown,
|
||||||
const MachineInstr *MI,
|
const MachineInstr *MI,
|
||||||
const TargetRegisterInfo *TRI) {
|
const TargetRegisterInfo *TRI) {
|
||||||
unsigned e = Regs.size();
|
unsigned e = Regs.size();
|
||||||
@@ -182,6 +183,8 @@ lookupCandidateBaseReg(const SmallVector<std::pair<unsigned, int64_t>, 8> &Regs,
|
|||||||
// Check if the relative offset from the where the base register references
|
// Check if the relative offset from the where the base register references
|
||||||
// to the target address is in range for the instruction.
|
// to the target address is in range for the instruction.
|
||||||
int64_t Offset = LocalFrameOffset - RegOffset.second;
|
int64_t Offset = LocalFrameOffset - RegOffset.second;
|
||||||
|
if (StackGrowsDown)
|
||||||
|
Offset = -Offset;
|
||||||
if (TRI->isFrameOffsetLegal(MI, Offset))
|
if (TRI->isFrameOffsetLegal(MI, Offset))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -199,6 +202,9 @@ bool LocalStackSlotPass::insertFrameReferenceRegisters(MachineFunction &Fn) {
|
|||||||
|
|
||||||
MachineFrameInfo *MFI = Fn.getFrameInfo();
|
MachineFrameInfo *MFI = Fn.getFrameInfo();
|
||||||
const TargetRegisterInfo *TRI = Fn.getTarget().getRegisterInfo();
|
const TargetRegisterInfo *TRI = Fn.getTarget().getRegisterInfo();
|
||||||
|
const TargetFrameInfo &TFI = *Fn.getTarget().getFrameInfo();
|
||||||
|
bool StackGrowsDown =
|
||||||
|
TFI.getStackGrowthDirection() == TargetFrameInfo::StackGrowsDown;
|
||||||
|
|
||||||
for (MachineFunction::iterator BB = Fn.begin(),
|
for (MachineFunction::iterator BB = Fn.begin(),
|
||||||
E = Fn.end(); BB != E; ++BB) {
|
E = Fn.end(); BB != E; ++BB) {
|
||||||
@@ -245,12 +251,15 @@ bool LocalStackSlotPass::insertFrameReferenceRegisters(MachineFunction &Fn) {
|
|||||||
// register.
|
// register.
|
||||||
std::pair<unsigned, int64_t> RegOffset;
|
std::pair<unsigned, int64_t> RegOffset;
|
||||||
if (lookupCandidateBaseReg(BaseRegisters, RegOffset,
|
if (lookupCandidateBaseReg(BaseRegisters, RegOffset,
|
||||||
LocalOffsets[FrameIdx], MI, TRI)) {
|
LocalOffsets[FrameIdx],
|
||||||
|
StackGrowsDown, MI, TRI)) {
|
||||||
DEBUG(dbgs() << " Reusing base register " <<
|
DEBUG(dbgs() << " Reusing base register " <<
|
||||||
RegOffset.first << "\n");
|
RegOffset.first << "\n");
|
||||||
// We found a register to reuse.
|
// We found a register to reuse.
|
||||||
BaseReg = RegOffset.first;
|
BaseReg = RegOffset.first;
|
||||||
Offset = LocalOffsets[FrameIdx] - RegOffset.second;
|
Offset = LocalOffsets[FrameIdx] - RegOffset.second;
|
||||||
|
if (StackGrowsDown)
|
||||||
|
Offset = -Offset;
|
||||||
} else {
|
} else {
|
||||||
// No previously defined register was in range, so create a
|
// No previously defined register was in range, so create a
|
||||||
// new one.
|
// new one.
|
||||||
|
Reference in New Issue
Block a user