Skip to content

Commit

Permalink
[X86] Move target-generic code into CodeGen [NFC]
Browse files Browse the repository at this point in the history
This code is the same for all platforms.

Differential Revision: https://reviews.llvm.org/D124566
  • Loading branch information
isanbard committed Apr 27, 2022
1 parent e39e9d3 commit 8f2ec97
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 17 deletions.
27 changes: 26 additions & 1 deletion llvm/lib/CodeGen/PrologEpilogInserter.cpp
Expand Up @@ -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())
Expand All @@ -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())
Expand Down
16 changes: 0 additions & 16 deletions llvm/lib/Target/X86/X86FrameLowering.cpp
Expand Up @@ -500,25 +500,9 @@ void X86FrameLowering::emitZeroCallUsedRegs(BitVector RegsToZero,
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())
Expand Down

0 comments on commit 8f2ec97

Please sign in to comment.