diff options
author | Bill Wendling <isanbard@gmail.com> | 2022-04-27 15:37:08 -0700 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2022-04-27 15:37:28 -0700 |
commit | 8f2ec974d1cf0ecde8b1b047db2e1bf0cb3a6c7f (patch) | |
tree | 7000b02e6878713b4952c7b81de5a5e82090fbfb /llvm/lib/CodeGen/PrologEpilogInserter.cpp | |
parent | e39e9d339c94cb7f421403a2980998b4a4b6a1a1 (diff) | |
download | llvm-8f2ec974d1cf0ecde8b1b047db2e1bf0cb3a6c7f.zip llvm-8f2ec974d1cf0ecde8b1b047db2e1bf0cb3a6c7f.tar.gz llvm-8f2ec974d1cf0ecde8b1b047db2e1bf0cb3a6c7f.tar.bz2 |
[X86] Move target-generic code into CodeGen [NFC]
This code is the same for all platforms.
Differential Revision: https://reviews.llvm.org/D124566
Diffstat (limited to 'llvm/lib/CodeGen/PrologEpilogInserter.cpp')
-rw-r--r-- | llvm/lib/CodeGen/PrologEpilogInserter.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp index bc45450..f222b4a 100644 --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -1227,7 +1227,7 @@ void PEI::insertZeroCallUsedRegs(MachineFunction &MF) { 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 @@ void PEI::insertZeroCallUsedRegs(MachineFunction &MF) { } } + // 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()) |