2727
2828using 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+
3088static 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
435493void 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 )));
0 commit comments