diff --git a/lib/Target/X86/X86InstrInfo.cpp b/lib/Target/X86/X86InstrInfo.cpp index 6a1d1669e87..87c866a286a 100644 --- a/lib/Target/X86/X86InstrInfo.cpp +++ b/lib/Target/X86/X86InstrInfo.cpp @@ -1833,49 +1833,39 @@ void X86InstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg, } bool X86InstrInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB, - MachineBasicBlock::iterator MI, + MachineBasicBlock::iterator MI, const std::vector &CSI) const { if (CSI.empty()) return false; - MachineFunction &MF = *MBB.getParent(); bool is64Bit = TM.getSubtarget().is64Bit(); - unsigned FrameReg = is64Bit ? X86::RBP : X86::EBP; + unsigned SlotSize = is64Bit ? 8 : 4; + + MachineFunction &MF = *MBB.getParent(); + X86MachineFunctionInfo *X86FI = MF.getInfo(); + X86FI->setCalleeSavedFrameSize(CSI.size() * SlotSize); + 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(); - 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 &CSI) const { if (CSI.empty()) return false; - MachineFunction &MF = *MBB.getParent(); bool is64Bit = TM.getSubtarget().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; diff --git a/test/CodeGen/X86/2008-08-31-EH_RETURN32.ll b/test/CodeGen/X86/2008-08-31-EH_RETURN32.ll index 8aa330e7b1a..e22b647a13f 100644 --- a/test/CodeGen/X86/2008-08-31-EH_RETURN32.ll +++ b/test/CodeGen/X86/2008-08-31-EH_RETURN32.ll @@ -1,5 +1,5 @@ ; Check that eh_return & unwind_init were properly lowered -; RUN: llvm-as < %s | llc | grep %ebp | count 7 +; RUN: llvm-as < %s | llc | grep %ebp | count 9 ; RUN: llvm-as < %s | llc | grep %ecx | count 5 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64" diff --git a/test/CodeGen/X86/2008-08-31-EH_RETURN64.ll b/test/CodeGen/X86/2008-08-31-EH_RETURN64.ll index 80eeba7e1ea..7d01824400c 100644 --- a/test/CodeGen/X86/2008-08-31-EH_RETURN64.ll +++ b/test/CodeGen/X86/2008-08-31-EH_RETURN64.ll @@ -1,5 +1,5 @@ ; Check that eh_return & unwind_init were properly lowered -; RUN: llvm-as < %s | llc | grep %rbp | count 5 +; RUN: llvm-as < %s | llc | grep %rbp | count 7 ; RUN: llvm-as < %s | llc | grep %rcx | count 3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"