diff options
Diffstat (limited to 'lib/Target/PowerPC/PPCFrameLowering.cpp')
| -rw-r--r-- | lib/Target/PowerPC/PPCFrameLowering.cpp | 23 | 
1 files changed, 14 insertions, 9 deletions
diff --git a/lib/Target/PowerPC/PPCFrameLowering.cpp b/lib/Target/PowerPC/PPCFrameLowering.cpp index 40bfe3a449f7..57a1d373c88c 100644 --- a/lib/Target/PowerPC/PPCFrameLowering.cpp +++ b/lib/Target/PowerPC/PPCFrameLowering.cpp @@ -1765,31 +1765,36 @@ void PPCFrameLowering::processFunctionBeforeFrameFinalized(MachineFunction &MF,    // Check whether the frame pointer register is allocated. If so, make sure it    // is spilled to the correct offset.    if (needsFP(MF)) { -    HasGPSaveArea = true; -      int FI = PFI->getFramePointerSaveIndex();      assert(FI && "No Frame Pointer Save Slot!"); -      MFI.setObjectOffset(FI, LowerBound + MFI.getObjectOffset(FI)); +    // FP is R31/X31, so no need to update MinGPR/MinG8R. +    HasGPSaveArea = true;    }    if (PFI->usesPICBase()) { -    HasGPSaveArea = true; -      int FI = PFI->getPICBasePointerSaveIndex();      assert(FI && "No PIC Base Pointer Save Slot!"); -      MFI.setObjectOffset(FI, LowerBound + MFI.getObjectOffset(FI)); + +    MinGPR = std::min<unsigned>(MinGPR, PPC::R30); +    HasGPSaveArea = true;    }    const PPCRegisterInfo *RegInfo = Subtarget.getRegisterInfo();    if (RegInfo->hasBasePointer(MF)) { -    HasGPSaveArea = true; -      int FI = PFI->getBasePointerSaveIndex();      assert(FI && "No Base Pointer Save Slot!"); -      MFI.setObjectOffset(FI, LowerBound + MFI.getObjectOffset(FI)); + +    unsigned BP = RegInfo->getBaseRegister(MF); +    if (PPC::G8RCRegClass.contains(BP)) { +      MinG8R = std::min<unsigned>(MinG8R, BP); +      HasG8SaveArea = true; +    } else if (PPC::GPRCRegClass.contains(BP)) { +      MinGPR = std::min<unsigned>(MinGPR, BP); +      HasGPSaveArea = true; +    }    }    // General register save area starts right below the Floating-point  | 
