If a function has a non-zero sized frame, use an add to adjust the stack
pointer in the epilog, not a load.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25229 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/PowerPC/PPCRegisterInfo.cpp b/lib/Target/PowerPC/PPCRegisterInfo.cpp
index ae136cb..febbb47 100644
--- a/lib/Target/PowerPC/PPCRegisterInfo.cpp
+++ b/lib/Target/PowerPC/PPCRegisterInfo.cpp
@@ -370,23 +370,34 @@
void PPCRegisterInfo::emitEpilogue(MachineFunction &MF,
MachineBasicBlock &MBB) const {
- const MachineFrameInfo *MFI = MF.getFrameInfo();
MachineBasicBlock::iterator MBBI = prior(MBB.end());
- MachineInstr *MI;
assert(MBBI->getOpcode() == PPC::BLR &&
"Can only insert epilog into returning blocks");
- // Get the number of bytes allocated from the FrameInfo...
- unsigned NumBytes = MFI->getStackSize();
- unsigned GPRSize = 4;
+ // Get the number of bytes allocated from the FrameInfo.
+ unsigned NumBytes = MF.getFrameInfo()->getStackSize();
+ unsigned GPRSize = 4;
if (NumBytes != 0) {
+ // If this function has a frame pointer, load the saved stack pointer from
+ // its stack slot.
if (hasFP(MF)) {
- MI = BuildMI(PPC::LWZ, 2, PPC::R31).addSImm(GPRSize).addReg(PPC::R31);
- MBB.insert(MBBI, MI);
+ BuildMI(MBB, MBBI, PPC::LWZ, 2, PPC::R31)
+ .addSImm(GPRSize).addReg(PPC::R31);
}
- MI = BuildMI(PPC::LWZ, 2, PPC::R1).addSImm(0).addReg(PPC::R1);
- MBB.insert(MBBI, MI);
+
+ // The loaded (or persistent) stack pointer value is offseted by the 'stwu'
+ // on entry to the function. Add this offset back now.
+ if (NumBytes <= 32768) {
+ BuildMI(MBB, MBBI, PPC::ADDI, 2, PPC::R1)
+ .addReg(PPC::R1).addSImm(NumBytes);
+ } else {
+ BuildMI(MBB, MBBI, PPC::LIS, 1, PPC::R0).addSImm(NumBytes >> 16);
+ BuildMI(MBB, MBBI, PPC::ORI, 2, PPC::R0)
+ .addReg(PPC::R0).addImm(NumBytes & 0xFFFF);
+ BuildMI(MBB, MBBI, PPC::ADD4, 2, PPC::R1)
+ .addReg(PPC::R0).addReg(PPC::R1);
+ }
}
}