Skip to content

Commit ff13b27

Browse files
committed
[RISCV][NFC] refactor CFI emitting
1 parent b8ac87f commit ff13b27

File tree

2 files changed

+88
-69
lines changed

2 files changed

+88
-69
lines changed

llvm/lib/Target/RISCV/RISCVFrameLowering.cpp

Lines changed: 85 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,64 @@
2727

2828
using namespace llvm;
2929

30+
namespace {
31+
32+
class CFISaveRegisterEmitter {
33+
MachineFunction &m_MF;
34+
MachineFrameInfo &m_MFI;
35+
36+
public:
37+
CFISaveRegisterEmitter(MachineFunction &MF)
38+
: m_MF{MF}, m_MFI{MF.getFrameInfo()} {};
39+
40+
void emit(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
41+
const RISCVRegisterInfo &RI, const RISCVInstrInfo &TII,
42+
const DebugLoc &DL, const CalleeSavedInfo &CS) const {
43+
int FrameIdx = CS.getFrameIdx();
44+
int64_t Offset = m_MFI.getObjectOffset(FrameIdx);
45+
Register Reg = CS.getReg();
46+
unsigned CFIIndex = m_MF.addFrameInst(MCCFIInstruction::createOffset(
47+
nullptr, RI.getDwarfRegNum(Reg, true), Offset));
48+
BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
49+
.addCFIIndex(CFIIndex)
50+
.setMIFlag(MachineInstr::FrameSetup);
51+
}
52+
};
53+
54+
class CFIRestoreRegisterEmitter {
55+
MachineFunction &m_MF;
56+
57+
public:
58+
CFIRestoreRegisterEmitter(MachineFunction &MF) : m_MF{MF} {};
59+
60+
void emit(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
61+
const RISCVRegisterInfo &RI, const RISCVInstrInfo &TII,
62+
const DebugLoc &DL, const CalleeSavedInfo &CS) const {
63+
Register Reg = CS.getReg();
64+
unsigned CFIIndex = m_MF.addFrameInst(
65+
MCCFIInstruction::createRestore(nullptr, RI.getDwarfRegNum(Reg, true)));
66+
BuildMI(MBB, MBBI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
67+
.addCFIIndex(CFIIndex)
68+
.setMIFlag(MachineInstr::FrameDestroy);
69+
}
70+
};
71+
72+
} // namespace
73+
74+
template <typename Emitter>
75+
void RISCVFrameLowering::emitCFIForCSI(
76+
MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
77+
const SmallVector<CalleeSavedInfo, 8> &CSI) const {
78+
MachineFunction *MF = MBB.getParent();
79+
const RISCVRegisterInfo *RI = STI.getRegisterInfo();
80+
const RISCVInstrInfo *TII = STI.getInstrInfo();
81+
DebugLoc DL = MBB.findDebugLoc(MBBI);
82+
83+
Emitter E{*MF};
84+
for (const auto &CS : CSI)
85+
E.emit(MBB, MBBI, *RI, *TII, DL, CS);
86+
}
87+
3088
static Align getABIStackAlignment(RISCVABI::ABI ABI) {
3189
if (ABI == RISCVABI::ABI_ILP32E)
3290
return Align(4);
@@ -418,18 +476,18 @@ getPushOrLibCallsSavedInfo(const MachineFunction &MF,
418476
const std::vector<CalleeSavedInfo> &CSI) {
419477
auto *RVFI = MF.getInfo<RISCVMachineFunctionInfo>();
420478

421-
SmallVector<CalleeSavedInfo, 8> PushPopOrLibCallsCSI;
479+
SmallVector<CalleeSavedInfo, 8> PushOrLibCallsCSI;
422480
if (!RVFI->useSaveRestoreLibCalls(MF) && !RVFI->isPushable(MF))
423-
return PushPopOrLibCallsCSI;
481+
return PushOrLibCallsCSI;
424482

425-
for (auto &CS : CSI) {
483+
for (const auto &CS : CSI) {
426484
const auto *FII = llvm::find_if(
427485
FixedCSRFIMap, [&](auto P) { return P.first == CS.getReg(); });
428486
if (FII != std::end(FixedCSRFIMap))
429-
PushPopOrLibCallsCSI.push_back(CS);
487+
PushOrLibCallsCSI.push_back(CS);
430488
}
431489

432-
return PushPopOrLibCallsCSI;
490+
return PushOrLibCallsCSI;
433491
}
434492

435493
void RISCVFrameLowering::adjustStackForRVV(MachineFunction &MF,
@@ -610,16 +668,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
610668
.addCFIIndex(CFIIndex)
611669
.setMIFlag(MachineInstr::FrameSetup);
612670

613-
for (const auto &Entry : getPushOrLibCallsSavedInfo(MF, CSI)) {
614-
int FrameIdx = Entry.getFrameIdx();
615-
int64_t Offset = MFI.getObjectOffset(FrameIdx);
616-
Register Reg = Entry.getReg();
617-
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createOffset(
618-
nullptr, RI->getDwarfRegNum(Reg, true), Offset));
619-
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
620-
.addCFIIndex(CFIIndex)
621-
.setMIFlag(MachineInstr::FrameSetup);
622-
}
671+
emitCFIForCSI<CFISaveRegisterEmitter>(MBB, MBBI,
672+
getPushOrLibCallsSavedInfo(MF, CSI));
623673
}
624674

625675
// FIXME (note copied from Lanai): This appears to be overallocating. Needs
@@ -651,7 +701,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
651701
// stack space. Align the stack size down to a multiple of 16. This is
652702
// needed for RVE.
653703
// FIXME: Can we increase the stack size to a multiple of 16 instead?
654-
uint64_t Spimm = std::min(alignDown(StackSize, 16), (uint64_t)48);
704+
uint64_t Spimm =
705+
std::min(alignDown(StackSize, 16), static_cast<uint64_t>(48));
655706
FirstFrameSetup->getOperand(1).setImm(Spimm);
656707
StackSize -= Spimm;
657708

@@ -661,16 +712,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
661712
.addCFIIndex(CFIIndex)
662713
.setMIFlag(MachineInstr::FrameSetup);
663714

664-
for (const auto &Entry : getPushOrLibCallsSavedInfo(MF, CSI)) {
665-
int FrameIdx = Entry.getFrameIdx();
666-
int64_t Offset = MFI.getObjectOffset(FrameIdx);
667-
Register Reg = Entry.getReg();
668-
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createOffset(
669-
nullptr, RI->getDwarfRegNum(Reg, true), Offset));
670-
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
671-
.addCFIIndex(CFIIndex)
672-
.setMIFlag(MachineInstr::FrameSetup);
673-
}
715+
emitCFIForCSI<CFISaveRegisterEmitter>(MBB, MBBI,
716+
getPushOrLibCallsSavedInfo(MF, CSI));
674717
}
675718

676719
if (StackSize != 0) {
@@ -697,20 +740,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
697740

698741
// Iterate over list of callee-saved registers and emit .cfi_offset
699742
// directives.
700-
for (const auto &Entry : getUnmanagedCSI(MF, CSI)) {
701-
int FrameIdx = Entry.getFrameIdx();
702-
if (FrameIdx >= 0 &&
703-
MFI.getStackID(FrameIdx) == TargetStackID::ScalableVector)
704-
continue;
705-
706-
int64_t Offset = MFI.getObjectOffset(FrameIdx);
707-
Register Reg = Entry.getReg();
708-
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createOffset(
709-
nullptr, RI->getDwarfRegNum(Reg, true), Offset));
710-
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
711-
.addCFIIndex(CFIIndex)
712-
.setMIFlag(MachineInstr::FrameSetup);
713-
}
743+
emitCFIForCSI<CFISaveRegisterEmitter>(MBB, MBBI, getUnmanagedCSI(MF, CSI));
714744

715745
// Generate new FP.
716746
if (hasFP(MF)) {
@@ -960,14 +990,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
960990
}
961991

962992
// Recover callee-saved registers.
963-
for (const auto &Entry : getUnmanagedCSI(MF, CSI)) {
964-
Register Reg = Entry.getReg();
965-
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createRestore(
966-
nullptr, RI->getDwarfRegNum(Reg, true)));
967-
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
968-
.addCFIIndex(CFIIndex)
969-
.setMIFlag(MachineInstr::FrameDestroy);
970-
}
993+
emitCFIForCSI<CFIRestoreRegisterEmitter>(MBB, MBBI, getUnmanagedCSI(MF, CSI));
971994

972995
bool ApplyPop = RVFI->isPushable(MF) && MBBI != MBB.end() &&
973996
MBBI->getOpcode() == RISCV::CM_POP;
@@ -976,7 +999,8 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
976999
// space. Align the stack size down to a multiple of 16. This is needed for
9771000
// RVE.
9781001
// FIXME: Can we increase the stack size to a multiple of 16 instead?
979-
uint64_t Spimm = std::min(alignDown(StackSize, 16), (uint64_t)48);
1002+
uint64_t Spimm =
1003+
std::min(alignDown(StackSize, 16), static_cast<uint64_t>(48));
9801004
MBBI->getOperand(1).setImm(Spimm);
9811005
StackSize -= Spimm;
9821006

@@ -988,14 +1012,8 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
9881012
if (NextI == MBB.end() || NextI->getOpcode() != RISCV::PseudoRET) {
9891013
++MBBI;
9901014

991-
for (const auto &Entry : getPushOrLibCallsSavedInfo(MF, CSI)) {
992-
Register Reg = Entry.getReg();
993-
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createRestore(
994-
nullptr, RI->getDwarfRegNum(Reg, true)));
995-
BuildMI(MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION))
996-
.addCFIIndex(CFIIndex)
997-
.setMIFlag(MachineInstr::FrameDestroy);
998-
}
1015+
emitCFIForCSI<CFIRestoreRegisterEmitter>(
1016+
MBB, MBBI, getPushOrLibCallsSavedInfo(MF, CSI));
9991017

10001018
// Update CFA offset. After CM_POP SP should be equal to CFA, so CFA
10011019
// offset should be a zero.
@@ -1695,7 +1713,7 @@ bool RISCVFrameLowering::spillCalleeSavedRegisters(
16951713
return true;
16961714
}
16971715

1698-
static unsigned getCaleeSavedRVVNumRegs(const Register &BaseReg) {
1716+
static unsigned getCalleeSavedRVVNumRegs(const Register &BaseReg) {
16991717
return RISCV::VRRegClass.contains(BaseReg) ? 1
17001718
: RISCV::VRM2RegClass.contains(BaseReg) ? 2
17011719
: RISCV::VRM4RegClass.contains(BaseReg) ? 4
@@ -1737,16 +1755,14 @@ void RISCVFrameLowering::emitCalleeSavedRVVPrologCFI(
17371755
for (auto &CS : RVVCSI) {
17381756
// Insert the spill to the stack frame.
17391757
int FI = CS.getFrameIdx();
1740-
if (FI >= 0 && MFI.getStackID(FI) == TargetStackID::ScalableVector) {
1741-
MCRegister BaseReg = getRVVBaseRegister(TRI, CS.getReg());
1742-
unsigned NumRegs = getCaleeSavedRVVNumRegs(CS.getReg());
1743-
for (unsigned i = 0; i < NumRegs; ++i) {
1744-
unsigned CFIIndex = MF->addFrameInst(createDefCFAOffset(
1745-
TRI, BaseReg + i, -FixedSize, MFI.getObjectOffset(FI) / 8 + i));
1746-
BuildMI(MBB, MI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
1747-
.addCFIIndex(CFIIndex)
1748-
.setMIFlag(MachineInstr::FrameSetup);
1749-
}
1758+
MCRegister BaseReg = getRVVBaseRegister(TRI, CS.getReg());
1759+
unsigned NumRegs = getCalleeSavedRVVNumRegs(CS.getReg());
1760+
for (unsigned i = 0; i < NumRegs; ++i) {
1761+
unsigned CFIIndex = MF->addFrameInst(createDefCFAOffset(
1762+
TRI, BaseReg + i, -FixedSize, MFI.getObjectOffset(FI) / 8 + i));
1763+
BuildMI(MBB, MI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
1764+
.addCFIIndex(CFIIndex)
1765+
.setMIFlag(MachineInstr::FrameSetup);
17501766
}
17511767
}
17521768
}
@@ -1763,7 +1779,7 @@ void RISCVFrameLowering::emitCalleeSavedRVVEpilogCFI(
17631779
const auto &RVVCSI = getRVVCalleeSavedInfo(*MF, MFI.getCalleeSavedInfo());
17641780
for (auto &CS : RVVCSI) {
17651781
MCRegister BaseReg = getRVVBaseRegister(TRI, CS.getReg());
1766-
unsigned NumRegs = getCaleeSavedRVVNumRegs(CS.getReg());
1782+
unsigned NumRegs = getCalleeSavedRVVNumRegs(CS.getReg());
17671783
for (unsigned i = 0; i < NumRegs; ++i) {
17681784
unsigned CFIIndex = MF->addFrameInst(MCCFIInstruction::createRestore(
17691785
nullptr, RI->getDwarfRegNum(BaseReg + i, true)));

llvm/lib/Target/RISCV/RISCVFrameLowering.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ class RISCVFrameLowering : public TargetFrameLowering {
9393
bool HasFP) const;
9494
void emitCalleeSavedRVVEpilogCFI(MachineBasicBlock &MBB,
9595
MachineBasicBlock::iterator MI) const;
96+
template <typename Emitter>
97+
void emitCFIForCSI(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
98+
const SmallVector<CalleeSavedInfo, 8> &CSI) const;
9699
void deallocateStack(MachineFunction &MF, MachineBasicBlock &MBB,
97100
MachineBasicBlock::iterator MBBI, const DebugLoc &DL,
98101
uint64_t &StackSize, int64_t CFAOffset) const;

0 commit comments

Comments
 (0)