diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/CodeGen/MachineFrameInfo.h | 3 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MachineFunction.cpp | 48 | ||||
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64FrameLowering.cpp | 55 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMFrameLowering.cpp | 57 | 
4 files changed, 55 insertions, 108 deletions
diff --git a/llvm/include/llvm/CodeGen/MachineFrameInfo.h b/llvm/include/llvm/CodeGen/MachineFrameInfo.h index 93d77287d7c..cdec7e66370 100644 --- a/llvm/include/llvm/CodeGen/MachineFrameInfo.h +++ b/llvm/include/llvm/CodeGen/MachineFrameInfo.h @@ -419,6 +419,9 @@ public:    ///    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.    ///    int getOffsetAdjustment() const { return OffsetAdjustment; } diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp index 5e04f2d8a30..04321f32928 100644 --- a/llvm/lib/CodeGen/MachineFunction.cpp +++ b/llvm/lib/CodeGen/MachineFunction.cpp @@ -574,6 +574,54 @@ MachineFrameInfo::getPristineRegs(const MachineBasicBlock *MBB) const {    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{    if (Objects.empty()) return; diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp index cca6d12e166..572617cc078 100644 --- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp @@ -349,59 +349,6 @@ AArch64FrameLowering::resolveFrameIndexReference(MachineFunction &MF,    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  AArch64FrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,                                                         RegScavenger *RS) const { @@ -422,7 +369,7 @@ AArch64FrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,    // callee-save register for this purpose or allocate an extra spill slot.    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->adjustsStack() && !hasReservedCallFrame(MF)); diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.cpp b/llvm/lib/Target/ARM/ARMFrameLowering.cpp index 0ca6450e2b0..3b124087683 100644 --- a/llvm/lib/Target/ARM/ARMFrameLowering.cpp +++ b/llvm/lib/Target/ARM/ARMFrameLowering.cpp @@ -1038,58 +1038,6 @@ static unsigned GetFunctionSizeInBytes(const MachineFunction &MF,    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  /// frames and return the stack size limit beyond which some of these  /// 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      // it here will be OK.      // 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)        MRI.setPhysRegUsed(ARM::R4);    } @@ -1330,7 +1278,8 @@ ARMFrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF,    //        worth the effort and added fragility?    bool BigStack =      (RS && -     (estimateStackSize(MF) + ((hasFP(MF) && AFI->hasStackFrame()) ? 4:0) >= +     (MFI->estimateStackSize(MF) + +      ((hasFP(MF) && AFI->hasStackFrame()) ? 4:0) >=        estimateRSStackSizeLimit(MF, this)))      || MFI->hasVarSizedObjects()      || (MFI->adjustsStack() && !canSimplifyCallFramePseudos(MF));  | 

