diff options
author | Akira Hatanaka <ahatanaka@mips.com> | 2012-07-11 00:53:32 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@mips.com> | 2012-07-11 00:53:32 +0000 |
commit | ba584fe8feb840a82ad5966cb9eca6df0eeaafc2 (patch) | |
tree | 268af3d1949025309d0dd67d6cc63d0d28de9fa7 /lib/Target/Mips/MipsFrameLowering.cpp | |
parent | bb78930489aceab797eecffe6771c6e52ff0c80c (diff) | |
download | llvm-ba584fe8feb840a82ad5966cb9eca6df0eeaafc2.tar.gz llvm-ba584fe8feb840a82ad5966cb9eca6df0eeaafc2.tar.bz2 llvm-ba584fe8feb840a82ad5966cb9eca6df0eeaafc2.tar.xz |
Lower RETURNADDR node in Mips backend.
Patch by Sasa Stankovic.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160031 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Mips/MipsFrameLowering.cpp')
-rw-r--r-- | lib/Target/Mips/MipsFrameLowering.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/lib/Target/Mips/MipsFrameLowering.cpp b/lib/Target/Mips/MipsFrameLowering.cpp index 95e2357dd7..cb55995404 100644 --- a/lib/Target/Mips/MipsFrameLowering.cpp +++ b/lib/Target/Mips/MipsFrameLowering.cpp @@ -273,14 +273,21 @@ spillCalleeSavedRegisters(MachineBasicBlock &MBB, const TargetInstrInfo &TII = *MF->getTarget().getInstrInfo(); for (unsigned i = 0, e = CSI.size(); i != e; ++i) { - // Add the callee-saved register as live-in. - // It's killed at the spill. - EntryBlock->addLiveIn(CSI[i].getReg()); + // Add the callee-saved register as live-in. Do not add if the register is + // RA and return address is taken, because it has already been added in + // method MipsTargetLowering::LowerRETURNADDR. + // It's killed at the spill, unless the register is RA and return address + // is taken. + unsigned Reg = CSI[i].getReg(); + bool IsRAAndRetAddrIsTaken = (Reg == Mips::RA || Reg == Mips::RA_64) + && MF->getFrameInfo()->isReturnAddressTaken(); + if (!IsRAAndRetAddrIsTaken) + EntryBlock->addLiveIn(Reg); // Insert the spill to the stack frame. - unsigned Reg = CSI[i].getReg(); + bool IsKill = !IsRAAndRetAddrIsTaken; const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg); - TII.storeRegToStackSlot(*EntryBlock, MI, Reg, true, + TII.storeRegToStackSlot(*EntryBlock, MI, Reg, IsKill, CSI[i].getFrameIdx(), RC, TRI); } |