mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
Move estimateStackSize from ARM into MachineFrameInfo
This is a generic function (derived from PEI); moving it into MachineFrameInfo eliminates a current redundancy between the ARM and AArch64 backends, and will allow it to be used by the PowerPC target code. No functionality change intended. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177111 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -419,6 +419,9 @@ public:
|
|||||||
///
|
///
|
||||||
void setStackSize(uint64_t Size) { StackSize = Size; }
|
void setStackSize(uint64_t Size) { StackSize = Size; }
|
||||||
|
|
||||||
|
/// Estimate and return the size of the stack frame.
|
||||||
|
unsigned estimateStackSize(const MachineFunction &MF) const;
|
||||||
|
|
||||||
/// getOffsetAdjustment - Return the correction for frame offsets.
|
/// getOffsetAdjustment - Return the correction for frame offsets.
|
||||||
///
|
///
|
||||||
int getOffsetAdjustment() const { return OffsetAdjustment; }
|
int getOffsetAdjustment() const { return OffsetAdjustment; }
|
||||||
|
@ -574,6 +574,54 @@ MachineFrameInfo::getPristineRegs(const MachineBasicBlock *MBB) const {
|
|||||||
return BV;
|
return BV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned MachineFrameInfo::estimateStackSize(const MachineFunction &MF) const {
|
||||||
|
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
|
||||||
|
const TargetRegisterInfo *RegInfo = MF.getTarget().getRegisterInfo();
|
||||||
|
unsigned MaxAlign = getMaxAlignment();
|
||||||
|
int Offset = 0;
|
||||||
|
|
||||||
|
// This code is very, very similar to PEI::calculateFrameObjectOffsets().
|
||||||
|
// It really should be refactored to share code. Until then, changes
|
||||||
|
// should keep in mind that there's tight coupling between the two.
|
||||||
|
|
||||||
|
for (int i = getObjectIndexBegin(); i != 0; ++i) {
|
||||||
|
int FixedOff = -getObjectOffset(i);
|
||||||
|
if (FixedOff > Offset) Offset = FixedOff;
|
||||||
|
}
|
||||||
|
for (unsigned i = 0, e = getObjectIndexEnd(); i != e; ++i) {
|
||||||
|
if (isDeadObjectIndex(i))
|
||||||
|
continue;
|
||||||
|
Offset += getObjectSize(i);
|
||||||
|
unsigned Align = getObjectAlignment(i);
|
||||||
|
// Adjust to alignment boundary
|
||||||
|
Offset = (Offset+Align-1)/Align*Align;
|
||||||
|
|
||||||
|
MaxAlign = std::max(Align, MaxAlign);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adjustsStack() && TFI->hasReservedCallFrame(MF))
|
||||||
|
Offset += getMaxCallFrameSize();
|
||||||
|
|
||||||
|
// Round up the size to a multiple of the alignment. If the function has
|
||||||
|
// any calls or alloca's, align to the target's StackAlignment value to
|
||||||
|
// ensure that the callee's frame or the alloca data is suitably aligned;
|
||||||
|
// otherwise, for leaf functions, align to the TransientStackAlignment
|
||||||
|
// value.
|
||||||
|
unsigned StackAlign;
|
||||||
|
if (adjustsStack() || hasVarSizedObjects() ||
|
||||||
|
(RegInfo->needsStackRealignment(MF) && getObjectIndexEnd() != 0))
|
||||||
|
StackAlign = TFI->getStackAlignment();
|
||||||
|
else
|
||||||
|
StackAlign = TFI->getTransientStackAlignment();
|
||||||
|
|
||||||
|
// If the frame pointer is eliminated, all frame offsets will be relative to
|
||||||
|
// SP not FP. Align to MaxAlign so this works.
|
||||||
|
StackAlign = std::max(StackAlign, MaxAlign);
|
||||||
|
unsigned AlignMask = StackAlign - 1;
|
||||||
|
Offset = (Offset + AlignMask) & ~uint64_t(AlignMask);
|
||||||
|
|
||||||
|
return (unsigned)Offset;
|
||||||
|
}
|
||||||
|
|
||||||
void MachineFrameInfo::print(const MachineFunction &MF, raw_ostream &OS) const{
|
void MachineFrameInfo::print(const MachineFunction &MF, raw_ostream &OS) const{
|
||||||
if (Objects.empty()) return;
|
if (Objects.empty()) return;
|
||||||
|
@ -349,59 +349,6 @@ AArch64FrameLowering::resolveFrameIndexReference(MachineFunction &MF,
|
|||||||
return TopOfFrameOffset - FrameRegPos;
|
return TopOfFrameOffset - FrameRegPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Estimate and return the size of the frame.
|
|
||||||
static unsigned estimateStackSize(MachineFunction &MF) {
|
|
||||||
// FIXME: Make generic? Really consider after upstreaming. This code is now
|
|
||||||
// shared between PEI, ARM *and* here.
|
|
||||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
|
||||||
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
|
|
||||||
const TargetRegisterInfo *RegInfo = MF.getTarget().getRegisterInfo();
|
|
||||||
unsigned MaxAlign = MFI->getMaxAlignment();
|
|
||||||
int Offset = 0;
|
|
||||||
|
|
||||||
// This code is very, very similar to PEI::calculateFrameObjectOffsets().
|
|
||||||
// It really should be refactored to share code. Until then, changes
|
|
||||||
// should keep in mind that there's tight coupling between the two.
|
|
||||||
|
|
||||||
for (int i = MFI->getObjectIndexBegin(); i != 0; ++i) {
|
|
||||||
int FixedOff = -MFI->getObjectOffset(i);
|
|
||||||
if (FixedOff > Offset) Offset = FixedOff;
|
|
||||||
}
|
|
||||||
for (unsigned i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) {
|
|
||||||
if (MFI->isDeadObjectIndex(i))
|
|
||||||
continue;
|
|
||||||
Offset += MFI->getObjectSize(i);
|
|
||||||
unsigned Align = MFI->getObjectAlignment(i);
|
|
||||||
// Adjust to alignment boundary
|
|
||||||
Offset = (Offset+Align-1)/Align*Align;
|
|
||||||
|
|
||||||
MaxAlign = std::max(Align, MaxAlign);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MFI->adjustsStack() && TFI->hasReservedCallFrame(MF))
|
|
||||||
Offset += MFI->getMaxCallFrameSize();
|
|
||||||
|
|
||||||
// Round up the size to a multiple of the alignment. If the function has
|
|
||||||
// any calls or alloca's, align to the target's StackAlignment value to
|
|
||||||
// ensure that the callee's frame or the alloca data is suitably aligned;
|
|
||||||
// otherwise, for leaf functions, align to the TransientStackAlignment
|
|
||||||
// value.
|
|
||||||
unsigned StackAlign;
|
|
||||||
if (MFI->adjustsStack() || MFI->hasVarSizedObjects() ||
|
|
||||||
(RegInfo->needsStackRealignment(MF) && MFI->getObjectIndexEnd() != 0))
|
|
||||||
StackAlign = TFI->getStackAlignment();
|
|
||||||
else
|
|
||||||
StackAlign = TFI->getTransientStackAlignment();
|
|
||||||
|
|
||||||
// If the frame pointer is eliminated, all frame offsets will be relative to
|
|
||||||
// SP not FP. Align to MaxAlign so this works.
|
|
||||||
StackAlign = std::max(StackAlign, MaxAlign);
|
|
||||||
unsigned AlignMask = StackAlign - 1;
|
|
||||||
Offset = (Offset + AlignMask) & ~uint64_t(AlignMask);
|
|
||||||
|
|
||||||
return (unsigned)Offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
AArch64FrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
AArch64FrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
||||||
RegScavenger *RS) const {
|
RegScavenger *RS) const {
|
||||||
@ -422,7 +369,7 @@ AArch64FrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
|||||||
// callee-save register for this purpose or allocate an extra spill slot.
|
// callee-save register for this purpose or allocate an extra spill slot.
|
||||||
|
|
||||||
bool BigStack =
|
bool BigStack =
|
||||||
(RS && estimateStackSize(MF) >= TII.estimateRSStackLimit(MF))
|
(RS && MFI->estimateStackSize(MF) >= TII.estimateRSStackLimit(MF))
|
||||||
|| MFI->hasVarSizedObjects() // Access will be from X29: messes things up
|
|| MFI->hasVarSizedObjects() // Access will be from X29: messes things up
|
||||||
|| (MFI->adjustsStack() && !hasReservedCallFrame(MF));
|
|| (MFI->adjustsStack() && !hasReservedCallFrame(MF));
|
||||||
|
|
||||||
|
@ -1038,58 +1038,6 @@ static unsigned GetFunctionSizeInBytes(const MachineFunction &MF,
|
|||||||
return FnSize;
|
return FnSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// estimateStackSize - Estimate and return the size of the frame.
|
|
||||||
/// FIXME: Make generic?
|
|
||||||
static unsigned estimateStackSize(MachineFunction &MF) {
|
|
||||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
|
||||||
const TargetFrameLowering *TFI = MF.getTarget().getFrameLowering();
|
|
||||||
const TargetRegisterInfo *RegInfo = MF.getTarget().getRegisterInfo();
|
|
||||||
unsigned MaxAlign = MFI->getMaxAlignment();
|
|
||||||
int Offset = 0;
|
|
||||||
|
|
||||||
// This code is very, very similar to PEI::calculateFrameObjectOffsets().
|
|
||||||
// It really should be refactored to share code. Until then, changes
|
|
||||||
// should keep in mind that there's tight coupling between the two.
|
|
||||||
|
|
||||||
for (int i = MFI->getObjectIndexBegin(); i != 0; ++i) {
|
|
||||||
int FixedOff = -MFI->getObjectOffset(i);
|
|
||||||
if (FixedOff > Offset) Offset = FixedOff;
|
|
||||||
}
|
|
||||||
for (unsigned i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) {
|
|
||||||
if (MFI->isDeadObjectIndex(i))
|
|
||||||
continue;
|
|
||||||
Offset += MFI->getObjectSize(i);
|
|
||||||
unsigned Align = MFI->getObjectAlignment(i);
|
|
||||||
// Adjust to alignment boundary
|
|
||||||
Offset = (Offset+Align-1)/Align*Align;
|
|
||||||
|
|
||||||
MaxAlign = std::max(Align, MaxAlign);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MFI->adjustsStack() && TFI->hasReservedCallFrame(MF))
|
|
||||||
Offset += MFI->getMaxCallFrameSize();
|
|
||||||
|
|
||||||
// Round up the size to a multiple of the alignment. If the function has
|
|
||||||
// any calls or alloca's, align to the target's StackAlignment value to
|
|
||||||
// ensure that the callee's frame or the alloca data is suitably aligned;
|
|
||||||
// otherwise, for leaf functions, align to the TransientStackAlignment
|
|
||||||
// value.
|
|
||||||
unsigned StackAlign;
|
|
||||||
if (MFI->adjustsStack() || MFI->hasVarSizedObjects() ||
|
|
||||||
(RegInfo->needsStackRealignment(MF) && MFI->getObjectIndexEnd() != 0))
|
|
||||||
StackAlign = TFI->getStackAlignment();
|
|
||||||
else
|
|
||||||
StackAlign = TFI->getTransientStackAlignment();
|
|
||||||
|
|
||||||
// If the frame pointer is eliminated, all frame offsets will be relative to
|
|
||||||
// SP not FP. Align to MaxAlign so this works.
|
|
||||||
StackAlign = std::max(StackAlign, MaxAlign);
|
|
||||||
unsigned AlignMask = StackAlign - 1;
|
|
||||||
Offset = (Offset + AlignMask) & ~uint64_t(AlignMask);
|
|
||||||
|
|
||||||
return (unsigned)Offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// estimateRSStackSizeLimit - Look at each instruction that references stack
|
/// estimateRSStackSizeLimit - Look at each instruction that references stack
|
||||||
/// frames and return the stack size limit beyond which some of these
|
/// frames and return the stack size limit beyond which some of these
|
||||||
/// instructions will require a scratch register during their expansion later.
|
/// instructions will require a scratch register during their expansion later.
|
||||||
@ -1235,7 +1183,7 @@ ARMFrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
|||||||
// we've used all the registers and so R4 is already used, so not marking
|
// we've used all the registers and so R4 is already used, so not marking
|
||||||
// it here will be OK.
|
// it here will be OK.
|
||||||
// FIXME: It will be better just to find spare register here.
|
// FIXME: It will be better just to find spare register here.
|
||||||
unsigned StackSize = estimateStackSize(MF);
|
unsigned StackSize = MFI->estimateStackSize(MF);
|
||||||
if (MFI->hasVarSizedObjects() || StackSize > 508)
|
if (MFI->hasVarSizedObjects() || StackSize > 508)
|
||||||
MRI.setPhysRegUsed(ARM::R4);
|
MRI.setPhysRegUsed(ARM::R4);
|
||||||
}
|
}
|
||||||
@ -1330,7 +1278,8 @@ ARMFrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
|||||||
// worth the effort and added fragility?
|
// worth the effort and added fragility?
|
||||||
bool BigStack =
|
bool BigStack =
|
||||||
(RS &&
|
(RS &&
|
||||||
(estimateStackSize(MF) + ((hasFP(MF) && AFI->hasStackFrame()) ? 4:0) >=
|
(MFI->estimateStackSize(MF) +
|
||||||
|
((hasFP(MF) && AFI->hasStackFrame()) ? 4:0) >=
|
||||||
estimateRSStackSizeLimit(MF, this)))
|
estimateRSStackSizeLimit(MF, this)))
|
||||||
|| MFI->hasVarSizedObjects()
|
|| MFI->hasVarSizedObjects()
|
||||||
|| (MFI->adjustsStack() && !canSimplifyCallFramePseudos(MF));
|
|| (MFI->adjustsStack() && !canSimplifyCallFramePseudos(MF));
|
||||||
|
Reference in New Issue
Block a user