diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -1227,7 +1227,7 @@ RegsToZero.set(Reg); } - // Remove registers that are live when leaving the function. + // Don't clear registers that are live when leaving the function. for (const MachineBasicBlock &MBB : MF) for (const MachineInstr &MI : MBB.terminators()) { if (!MI.isReturn()) @@ -1242,6 +1242,31 @@ } } + // Don't need to clear registers that are used/clobbered by terminating + // instructions. + for (const MachineBasicBlock &MBB : MF) { + if (!MBB.isReturnBlock()) + continue; + + MachineBasicBlock::const_iterator MBBI = MBB.getFirstTerminator(); + for (MachineBasicBlock::const_iterator I = MBBI, E = MBB.end(); I != E; + ++I) { + for (const MachineOperand &MO : I->operands()) { + if (!MO.isReg()) + continue; + + for (const MCPhysReg &Reg : + TRI.sub_and_superregs_inclusive(MO.getReg())) + RegsToZero.reset(Reg); + } + } + } + + // Don't clear registers that are reset before exiting. + for (const CalleeSavedInfo &CSI : MF.getFrameInfo().getCalleeSavedInfo()) + for (MCRegister Reg : TRI.sub_and_superregs_inclusive(CSI.getReg())) + RegsToZero.reset(Reg); + const TargetFrameLowering &TFI = *MF.getSubtarget().getFrameLowering(); for (MachineBasicBlock &MBB : MF) if (MBB.isReturnBlock()) diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp --- a/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -500,25 +500,9 @@ MachineBasicBlock &MBB) const { const MachineFunction &MF = *MBB.getParent(); - // Don't clear registers that will just be reset before exiting. - for (const CalleeSavedInfo &CSI : MF.getFrameInfo().getCalleeSavedInfo()) - for (MCRegister Reg : TRI->sub_and_superregs_inclusive(CSI.getReg())) - RegsToZero.reset(Reg); - // Insertion point. MachineBasicBlock::iterator MBBI = MBB.getFirstTerminator(); - // We don't need to zero out registers that are clobbered by "pop" - // instructions. - for (MachineBasicBlock::iterator I = MBBI, E = MBB.end(); I != E; ++I) - for (const MachineOperand &MO : I->operands()) { - if (!MO.isReg()) - continue; - - for (const MCPhysReg &Reg : TRI->sub_and_superregs_inclusive(MO.getReg())) - RegsToZero.reset(Reg); - } - // Fake a debug loc. DebugLoc DL; if (MBBI != MBB.end())