diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-09-26 19:14:21 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-09-26 19:14:21 +0000 |
commit | a67f32abb5392981dbcb4de4e25bdedb046a8566 (patch) | |
tree | a32ad6b69b8b49839781c68887ad36cc41f50f0b /lib/Target/X86 | |
parent | 082d35136105fd061ed66182bd76cd96ffeda18d (diff) | |
download | external_llvm-a67f32abb5392981dbcb4de4e25bdedb046a8566.zip external_llvm-a67f32abb5392981dbcb4de4e25bdedb046a8566.tar.gz external_llvm-a67f32abb5392981dbcb4de4e25bdedb046a8566.tar.bz2 |
Avoid spilling EBP / RBP twice in the prologue.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56675 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86')
-rw-r--r-- | lib/Target/X86/X86InstrInfo.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/lib/Target/X86/X86InstrInfo.cpp b/lib/Target/X86/X86InstrInfo.cpp index 0864fa0..c19628b 100644 --- a/lib/Target/X86/X86InstrInfo.cpp +++ b/lib/Target/X86/X86InstrInfo.cpp @@ -1832,39 +1832,49 @@ void X86InstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg, } bool X86InstrInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB, - MachineBasicBlock::iterator MI, + MachineBasicBlock::iterator MI, const std::vector<CalleeSavedInfo> &CSI) const { if (CSI.empty()) return false; - bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit(); - unsigned SlotSize = is64Bit ? 8 : 4; - MachineFunction &MF = *MBB.getParent(); - X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>(); - X86FI->setCalleeSavedFrameSize(CSI.size() * SlotSize); - + bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit(); + unsigned FrameReg = is64Bit ? X86::RBP : X86::EBP; unsigned Opc = is64Bit ? X86::PUSH64r : X86::PUSH32r; + unsigned CSSize = 0; for (unsigned i = CSI.size(); i != 0; --i) { unsigned Reg = CSI[i-1].getReg(); + if (Reg == FrameReg && RI.hasFP(MF)) + // It will be saved as part of the prologue. + continue; // Add the callee-saved register as live-in. It's killed at the spill. MBB.addLiveIn(Reg); BuildMI(MBB, MI, get(Opc)).addReg(Reg); + ++CSSize; } + + X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>(); + unsigned SlotSize = is64Bit ? 8 : 4; + X86FI->setCalleeSavedFrameSize(CSSize * SlotSize); return true; } bool X86InstrInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB, - MachineBasicBlock::iterator MI, + MachineBasicBlock::iterator MI, const std::vector<CalleeSavedInfo> &CSI) const { if (CSI.empty()) return false; + MachineFunction &MF = *MBB.getParent(); bool is64Bit = TM.getSubtarget<X86Subtarget>().is64Bit(); + unsigned FrameReg = is64Bit ? X86::RBP : X86::EBP; unsigned Opc = is64Bit ? X86::POP64r : X86::POP32r; for (unsigned i = 0, e = CSI.size(); i != e; ++i) { unsigned Reg = CSI[i].getReg(); + if (Reg == FrameReg && RI.hasFP(MF)) + // It will be restored as part of the epilogue. + continue; BuildMI(MBB, MI, get(Opc), Reg); } return true; |