27
27
28
28
using namespace llvm ;
29
29
30
+ namespace {
31
+
32
+ class CFISaveRegisterEmitter {
33
+ MachineFunction &MF;
34
+ MachineFrameInfo &MFI;
35
+
36
+ public:
37
+ CFISaveRegisterEmitter (MachineFunction &MF)
38
+ : MF{MF}, 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 = MFI.getObjectOffset (FrameIdx);
45
+ Register Reg = CS.getReg ();
46
+ unsigned CFIIndex = 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 &MF;
56
+
57
+ public:
58
+ CFIRestoreRegisterEmitter (MachineFunction &MF) : 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 = 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
+
30
88
static Align getABIStackAlignment (RISCVABI::ABI ABI) {
31
89
if (ABI == RISCVABI::ABI_ILP32E)
32
90
return Align (4 );
@@ -426,18 +484,18 @@ getPushOrLibCallsSavedInfo(const MachineFunction &MF,
426
484
const std::vector<CalleeSavedInfo> &CSI) {
427
485
auto *RVFI = MF.getInfo <RISCVMachineFunctionInfo>();
428
486
429
- SmallVector<CalleeSavedInfo, 8 > PushPopOrLibCallsCSI ;
487
+ SmallVector<CalleeSavedInfo, 8 > PushOrLibCallsCSI ;
430
488
if (!RVFI->useSaveRestoreLibCalls (MF) && !RVFI->isPushable (MF))
431
- return PushPopOrLibCallsCSI ;
489
+ return PushOrLibCallsCSI ;
432
490
433
- for (auto &CS : CSI) {
491
+ for (const auto &CS : CSI) {
434
492
const auto *FII = llvm::find_if (
435
493
FixedCSRFIMap, [&](auto P) { return P.first == CS.getReg (); });
436
494
if (FII != std::end (FixedCSRFIMap))
437
- PushPopOrLibCallsCSI .push_back (CS);
495
+ PushOrLibCallsCSI .push_back (CS);
438
496
}
439
497
440
- return PushPopOrLibCallsCSI ;
498
+ return PushOrLibCallsCSI ;
441
499
}
442
500
443
501
void RISCVFrameLowering::adjustStackForRVV (MachineFunction &MF,
@@ -618,16 +676,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
618
676
.addCFIIndex (CFIIndex)
619
677
.setMIFlag (MachineInstr::FrameSetup);
620
678
621
- for (const auto &Entry : getPushOrLibCallsSavedInfo (MF, CSI)) {
622
- int FrameIdx = Entry.getFrameIdx ();
623
- int64_t Offset = MFI.getObjectOffset (FrameIdx);
624
- Register Reg = Entry.getReg ();
625
- unsigned CFIIndex = MF.addFrameInst (MCCFIInstruction::createOffset (
626
- nullptr , RI->getDwarfRegNum (Reg, true ), Offset));
627
- BuildMI (MBB, MBBI, DL, TII->get (TargetOpcode::CFI_INSTRUCTION))
628
- .addCFIIndex (CFIIndex)
629
- .setMIFlag (MachineInstr::FrameSetup);
630
- }
679
+ emitCFIForCSI<CFISaveRegisterEmitter>(MBB, MBBI,
680
+ getPushOrLibCallsSavedInfo (MF, CSI));
631
681
}
632
682
633
683
// FIXME (note copied from Lanai): This appears to be overallocating. Needs
@@ -659,7 +709,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
659
709
// stack space. Align the stack size down to a multiple of 16. This is
660
710
// needed for RVE.
661
711
// FIXME: Can we increase the stack size to a multiple of 16 instead?
662
- uint64_t Spimm = std::min (alignDown (StackSize, 16 ), (uint64_t )48 );
712
+ uint64_t Spimm =
713
+ std::min (alignDown (StackSize, 16 ), static_cast <uint64_t >(48 ));
663
714
FirstFrameSetup->getOperand (1 ).setImm (Spimm);
664
715
StackSize -= Spimm;
665
716
@@ -669,16 +720,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
669
720
.addCFIIndex (CFIIndex)
670
721
.setMIFlag (MachineInstr::FrameSetup);
671
722
672
- for (const auto &Entry : getPushOrLibCallsSavedInfo (MF, CSI)) {
673
- int FrameIdx = Entry.getFrameIdx ();
674
- int64_t Offset = MFI.getObjectOffset (FrameIdx);
675
- Register Reg = Entry.getReg ();
676
- unsigned CFIIndex = MF.addFrameInst (MCCFIInstruction::createOffset (
677
- nullptr , RI->getDwarfRegNum (Reg, true ), Offset));
678
- BuildMI (MBB, MBBI, DL, TII->get (TargetOpcode::CFI_INSTRUCTION))
679
- .addCFIIndex (CFIIndex)
680
- .setMIFlag (MachineInstr::FrameSetup);
681
- }
723
+ emitCFIForCSI<CFISaveRegisterEmitter>(MBB, MBBI,
724
+ getPushOrLibCallsSavedInfo (MF, CSI));
682
725
}
683
726
684
727
if (StackSize != 0 ) {
@@ -705,20 +748,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
705
748
706
749
// Iterate over list of callee-saved registers and emit .cfi_offset
707
750
// directives.
708
- for (const auto &Entry : getUnmanagedCSI (MF, CSI)) {
709
- int FrameIdx = Entry.getFrameIdx ();
710
- if (FrameIdx >= 0 &&
711
- MFI.getStackID (FrameIdx) == TargetStackID::ScalableVector)
712
- continue ;
713
-
714
- int64_t Offset = MFI.getObjectOffset (FrameIdx);
715
- Register Reg = Entry.getReg ();
716
- unsigned CFIIndex = MF.addFrameInst (MCCFIInstruction::createOffset (
717
- nullptr , RI->getDwarfRegNum (Reg, true ), Offset));
718
- BuildMI (MBB, MBBI, DL, TII->get (TargetOpcode::CFI_INSTRUCTION))
719
- .addCFIIndex (CFIIndex)
720
- .setMIFlag (MachineInstr::FrameSetup);
721
- }
751
+ emitCFIForCSI<CFISaveRegisterEmitter>(MBB, MBBI, getUnmanagedCSI (MF, CSI));
722
752
723
753
// Generate new FP.
724
754
if (hasFP (MF)) {
@@ -966,14 +996,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
966
996
}
967
997
968
998
// Recover callee-saved registers.
969
- for (const auto &Entry : getUnmanagedCSI (MF, CSI)) {
970
- Register Reg = Entry.getReg ();
971
- unsigned CFIIndex = MF.addFrameInst (MCCFIInstruction::createRestore (
972
- nullptr , RI->getDwarfRegNum (Reg, true )));
973
- BuildMI (MBB, MBBI, DL, TII->get (TargetOpcode::CFI_INSTRUCTION))
974
- .addCFIIndex (CFIIndex)
975
- .setMIFlag (MachineInstr::FrameDestroy);
976
- }
999
+ emitCFIForCSI<CFIRestoreRegisterEmitter>(MBB, MBBI, getUnmanagedCSI (MF, CSI));
977
1000
978
1001
bool ApplyPop = RVFI->isPushable (MF) && MBBI != MBB.end () &&
979
1002
MBBI->getOpcode () == RISCV::CM_POP;
@@ -982,7 +1005,8 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
982
1005
// space. Align the stack size down to a multiple of 16. This is needed for
983
1006
// RVE.
984
1007
// FIXME: Can we increase the stack size to a multiple of 16 instead?
985
- uint64_t Spimm = std::min (alignDown (StackSize, 16 ), (uint64_t )48 );
1008
+ uint64_t Spimm =
1009
+ std::min (alignDown (StackSize, 16 ), static_cast <uint64_t >(48 ));
986
1010
MBBI->getOperand (1 ).setImm (Spimm);
987
1011
StackSize -= Spimm;
988
1012
@@ -994,14 +1018,8 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
994
1018
if (NextI == MBB.end () || NextI->getOpcode () != RISCV::PseudoRET) {
995
1019
++MBBI;
996
1020
997
- for (const auto &Entry : getPushOrLibCallsSavedInfo (MF, CSI)) {
998
- Register Reg = Entry.getReg ();
999
- unsigned CFIIndex = MF.addFrameInst (MCCFIInstruction::createRestore (
1000
- nullptr , RI->getDwarfRegNum (Reg, true )));
1001
- BuildMI (MBB, MBBI, DL, TII->get (TargetOpcode::CFI_INSTRUCTION))
1002
- .addCFIIndex (CFIIndex)
1003
- .setMIFlag (MachineInstr::FrameDestroy);
1004
- }
1021
+ emitCFIForCSI<CFIRestoreRegisterEmitter>(
1022
+ MBB, MBBI, getPushOrLibCallsSavedInfo (MF, CSI));
1005
1023
1006
1024
// Update CFA offset. After CM_POP SP should be equal to CFA, so CFA
1007
1025
// offset should be a zero.
@@ -1701,7 +1719,7 @@ bool RISCVFrameLowering::spillCalleeSavedRegisters(
1701
1719
return true ;
1702
1720
}
1703
1721
1704
- static unsigned getCaleeSavedRVVNumRegs (const Register &BaseReg) {
1722
+ static unsigned getCalleeSavedRVVNumRegs (const Register &BaseReg) {
1705
1723
return RISCV::VRRegClass.contains (BaseReg) ? 1
1706
1724
: RISCV::VRM2RegClass.contains (BaseReg) ? 2
1707
1725
: RISCV::VRM4RegClass.contains (BaseReg) ? 4
@@ -1743,16 +1761,14 @@ void RISCVFrameLowering::emitCalleeSavedRVVPrologCFI(
1743
1761
for (auto &CS : RVVCSI) {
1744
1762
// Insert the spill to the stack frame.
1745
1763
int FI = CS.getFrameIdx ();
1746
- if (FI >= 0 && MFI.getStackID (FI) == TargetStackID::ScalableVector) {
1747
- MCRegister BaseReg = getRVVBaseRegister (TRI, CS.getReg ());
1748
- unsigned NumRegs = getCaleeSavedRVVNumRegs (CS.getReg ());
1749
- for (unsigned i = 0 ; i < NumRegs; ++i) {
1750
- unsigned CFIIndex = MF->addFrameInst (createDefCFAOffset (
1751
- TRI, BaseReg + i, -FixedSize, MFI.getObjectOffset (FI) / 8 + i));
1752
- BuildMI (MBB, MI, DL, TII.get (TargetOpcode::CFI_INSTRUCTION))
1753
- .addCFIIndex (CFIIndex)
1754
- .setMIFlag (MachineInstr::FrameSetup);
1755
- }
1764
+ MCRegister BaseReg = getRVVBaseRegister (TRI, CS.getReg ());
1765
+ unsigned NumRegs = getCalleeSavedRVVNumRegs (CS.getReg ());
1766
+ for (unsigned i = 0 ; i < NumRegs; ++i) {
1767
+ unsigned CFIIndex = MF->addFrameInst (createDefCFAOffset (
1768
+ TRI, BaseReg + i, -FixedSize, MFI.getObjectOffset (FI) / 8 + i));
1769
+ BuildMI (MBB, MI, DL, TII.get (TargetOpcode::CFI_INSTRUCTION))
1770
+ .addCFIIndex (CFIIndex)
1771
+ .setMIFlag (MachineInstr::FrameSetup);
1756
1772
}
1757
1773
}
1758
1774
}
@@ -1769,7 +1785,7 @@ void RISCVFrameLowering::emitCalleeSavedRVVEpilogCFI(
1769
1785
const auto &RVVCSI = getRVVCalleeSavedInfo (*MF, MFI.getCalleeSavedInfo ());
1770
1786
for (auto &CS : RVVCSI) {
1771
1787
MCRegister BaseReg = getRVVBaseRegister (TRI, CS.getReg ());
1772
- unsigned NumRegs = getCaleeSavedRVVNumRegs (CS.getReg ());
1788
+ unsigned NumRegs = getCalleeSavedRVVNumRegs (CS.getReg ());
1773
1789
for (unsigned i = 0 ; i < NumRegs; ++i) {
1774
1790
unsigned CFIIndex = MF->addFrameInst (MCCFIInstruction::createRestore (
1775
1791
nullptr , RI->getDwarfRegNum (BaseReg + i, true )));
0 commit comments