27
27
28
28
using namespace llvm ;
29
29
30
- static unsigned getCaleeSavedRVVNumRegs (const Register &BaseReg) {
31
- return RISCV::VRRegClass.contains (BaseReg) ? 1
32
- : RISCV::VRM2RegClass.contains (BaseReg) ? 2
33
- : RISCV::VRM4RegClass.contains (BaseReg) ? 4
34
- : 8 ;
35
- }
36
-
37
- static MCRegister getRVVBaseRegister (const RISCVRegisterInfo &TRI,
38
- const Register &Reg) {
39
- MCRegister BaseReg = TRI.getSubReg (Reg, RISCV::sub_vrm1_0);
40
- // If it's not a grouped vector register, it doesn't have subregister, so
41
- // the base register is just itself.
42
- if (BaseReg == RISCV::NoRegister)
43
- BaseReg = Reg;
44
- return BaseReg;
45
- }
46
-
47
30
namespace {
48
31
49
- struct CFIRestoreRegisterEmitter {
50
- CFIRestoreRegisterEmitter (MachineFunction &, const RISCVSubtarget &) {};
51
-
52
- void emit (MachineFunction &MF, MachineBasicBlock &MBB,
53
- MachineBasicBlock::iterator MBBI, const RISCVRegisterInfo &RI,
54
- const RISCVInstrInfo &TII, const DebugLoc &DL,
55
- const CalleeSavedInfo &CS) const {
56
- Register Reg = CS.getReg ();
57
- unsigned CFIIndex = MF.addFrameInst (
58
- MCCFIInstruction::createRestore (nullptr , RI.getDwarfRegNum (Reg, true )));
59
- BuildMI (MBB, MBBI, DL, TII.get (TargetOpcode::CFI_INSTRUCTION))
60
- .addCFIIndex (CFIIndex)
61
- .setMIFlag (MachineInstr::FrameDestroy);
62
- }
63
- };
64
-
65
- class CFIStoreRegisterEmitter {
66
- MachineFrameInfo &MFI;
32
+ class CFISaveRegisterEmitter {
33
+ MachineFunction &m_MF;
34
+ MachineFrameInfo &m_MFI;
67
35
68
36
public:
69
- CFIStoreRegisterEmitter (MachineFunction &MF, const RISCVSubtarget & )
70
- : MFI {MF.getFrameInfo ()} {};
37
+ CFISaveRegisterEmitter (MachineFunction &MF)
38
+ : m_MF{MF}, m_MFI {MF.getFrameInfo ()} {};
71
39
72
- void emit (MachineFunction &MF, MachineBasicBlock &MBB,
73
- MachineBasicBlock::iterator MBBI, const RISCVRegisterInfo &RI,
74
- const RISCVInstrInfo &TII, const DebugLoc &DL,
75
- const CalleeSavedInfo &CS) const {
40
+ void emit (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
41
+ const RISCVRegisterInfo &RI, const RISCVInstrInfo &TII,
42
+ const DebugLoc &DL, const CalleeSavedInfo &CS) const {
76
43
int FrameIdx = CS.getFrameIdx ();
77
- int64_t Offset = MFI .getObjectOffset (FrameIdx);
44
+ int64_t Offset = m_MFI .getObjectOffset (FrameIdx);
78
45
Register Reg = CS.getReg ();
79
- unsigned CFIIndex = MF .addFrameInst (MCCFIInstruction::createOffset (
46
+ unsigned CFIIndex = m_MF .addFrameInst (MCCFIInstruction::createOffset (
80
47
nullptr , RI.getDwarfRegNum (Reg, true ), Offset));
81
48
BuildMI (MBB, MBBI, DL, TII.get (TargetOpcode::CFI_INSTRUCTION))
82
49
.addCFIIndex (CFIIndex)
83
50
.setMIFlag (MachineInstr::FrameSetup);
84
51
}
85
52
};
86
53
87
- class CFIRestoreRVVRegisterEmitter {
88
- const llvm::RISCVRegisterInfo *TRI ;
54
+ class CFIRestoreRegisterEmitter {
55
+ MachineFunction &m_MF ;
89
56
90
57
public:
91
- CFIRestoreRVVRegisterEmitter (MachineFunction &, const RISCVSubtarget &STI)
92
- : TRI{STI.getRegisterInfo ()} {};
93
-
94
- void emit (MachineFunction &MF, MachineBasicBlock &MBB,
95
- MachineBasicBlock::iterator MBBI, const RISCVRegisterInfo &RI,
96
- const RISCVInstrInfo &TII, const DebugLoc &DL,
97
- const CalleeSavedInfo &CS) const {
98
- MCRegister BaseReg = getRVVBaseRegister (*TRI, CS.getReg ());
99
- unsigned NumRegs = getCaleeSavedRVVNumRegs (CS.getReg ());
100
- for (unsigned i = 0 ; i < NumRegs; ++i) {
101
- unsigned CFIIndex = MF.addFrameInst (MCCFIInstruction::createRestore (
102
- nullptr , RI.getDwarfRegNum (BaseReg + i, true )));
103
- BuildMI (MBB, MBBI, DL, TII.get (TargetOpcode::CFI_INSTRUCTION))
104
- .addCFIIndex (CFIIndex)
105
- .setMIFlag (MachineInstr::FrameDestroy);
106
- }
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);
107
69
}
108
70
};
109
71
@@ -118,9 +80,9 @@ void RISCVFrameLowering::emitCFIForCSI(
118
80
const RISCVInstrInfo *TII = STI.getInstrInfo ();
119
81
DebugLoc DL = MBB.findDebugLoc (MBBI);
120
82
121
- Emitter E{*MF, STI };
83
+ Emitter E{*MF};
122
84
for (const auto &CS : CSI)
123
- E.emit (*MF, MBB, MBBI, *RI, *TII, DL, CS);
85
+ E.emit (MBB, MBBI, *RI, *TII, DL, CS);
124
86
}
125
87
126
88
static Align getABIStackAlignment (RISCVABI::ABI ABI) {
@@ -514,18 +476,18 @@ getPushOrLibCallsSavedInfo(const MachineFunction &MF,
514
476
const std::vector<CalleeSavedInfo> &CSI) {
515
477
auto *RVFI = MF.getInfo <RISCVMachineFunctionInfo>();
516
478
517
- SmallVector<CalleeSavedInfo, 8 > PushPopOrLibCallsCSI ;
479
+ SmallVector<CalleeSavedInfo, 8 > PushOrLibCallsCSI ;
518
480
if (!RVFI->useSaveRestoreLibCalls (MF) && !RVFI->isPushable (MF))
519
- return PushPopOrLibCallsCSI ;
481
+ return PushOrLibCallsCSI ;
520
482
521
- for (auto &CS : CSI) {
483
+ for (const auto &CS : CSI) {
522
484
const auto *FII = llvm::find_if (
523
485
FixedCSRFIMap, [&](auto P) { return P.first == CS.getReg (); });
524
486
if (FII != std::end (FixedCSRFIMap))
525
- PushPopOrLibCallsCSI .push_back (CS);
487
+ PushOrLibCallsCSI .push_back (CS);
526
488
}
527
489
528
- return PushPopOrLibCallsCSI ;
490
+ return PushOrLibCallsCSI ;
529
491
}
530
492
531
493
void RISCVFrameLowering::adjustStackForRVV (MachineFunction &MF,
@@ -706,8 +668,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
706
668
.addCFIIndex (CFIIndex)
707
669
.setMIFlag (MachineInstr::FrameSetup);
708
670
709
- emitCFIForCSI<CFIStoreRegisterEmitter >(MBB, MBBI,
710
- getPushOrLibCallsSavedInfo (MF, CSI));
671
+ emitCFIForCSI<CFISaveRegisterEmitter >(MBB, MBBI,
672
+ getPushOrLibCallsSavedInfo (MF, CSI));
711
673
}
712
674
713
675
// FIXME (note copied from Lanai): This appears to be overallocating. Needs
@@ -739,7 +701,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
739
701
// stack space. Align the stack size down to a multiple of 16. This is
740
702
// needed for RVE.
741
703
// FIXME: Can we increase the stack size to a multiple of 16 instead?
742
- uint64_t Spimm = std::min (alignDown (StackSize, 16 ), ( uint64_t ) 48 );
704
+ uint64_t Spimm = std::min (alignDown (StackSize, 16 ), static_cast < uint64_t >( 48 ) );
743
705
FirstFrameSetup->getOperand (1 ).setImm (Spimm);
744
706
StackSize -= Spimm;
745
707
@@ -749,8 +711,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
749
711
.addCFIIndex (CFIIndex)
750
712
.setMIFlag (MachineInstr::FrameSetup);
751
713
752
- emitCFIForCSI<CFIStoreRegisterEmitter >(MBB, MBBI,
753
- getPushOrLibCallsSavedInfo (MF, CSI));
714
+ emitCFIForCSI<CFISaveRegisterEmitter >(MBB, MBBI,
715
+ getPushOrLibCallsSavedInfo (MF, CSI));
754
716
}
755
717
756
718
if (StackSize != 0 ) {
@@ -777,7 +739,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
777
739
778
740
// Iterate over list of callee-saved registers and emit .cfi_offset
779
741
// directives.
780
- emitCFIForCSI<CFIStoreRegisterEmitter >(MBB, MBBI, getUnmanagedCSI (MF, CSI));
742
+ emitCFIForCSI<CFISaveRegisterEmitter >(MBB, MBBI, getUnmanagedCSI (MF, CSI));
781
743
782
744
// Generate new FP.
783
745
if (hasFP (MF)) {
@@ -962,8 +924,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
962
924
.setMIFlag (MachineInstr::FrameDestroy);
963
925
}
964
926
965
- emitCFIForCSI<CFIRestoreRVVRegisterEmitter>(MBB, LastFrameDestroy,
966
- getRVVCalleeSavedInfo (MF, CSI));
927
+ emitCalleeSavedRVVEpilogCFI (MBB, LastFrameDestroy);
967
928
}
968
929
969
930
if (FirstSPAdjustAmount) {
@@ -1751,6 +1712,23 @@ bool RISCVFrameLowering::spillCalleeSavedRegisters(
1751
1712
return true ;
1752
1713
}
1753
1714
1715
+ static unsigned getCalleeSavedRVVNumRegs (const Register &BaseReg) {
1716
+ return RISCV::VRRegClass.contains (BaseReg) ? 1
1717
+ : RISCV::VRM2RegClass.contains (BaseReg) ? 2
1718
+ : RISCV::VRM4RegClass.contains (BaseReg) ? 4
1719
+ : 8 ;
1720
+ }
1721
+
1722
+ static MCRegister getRVVBaseRegister (const RISCVRegisterInfo &TRI,
1723
+ const Register &Reg) {
1724
+ MCRegister BaseReg = TRI.getSubReg (Reg, RISCV::sub_vrm1_0);
1725
+ // If it's not a grouped vector register, it doesn't have subregister, so
1726
+ // the base register is just itself.
1727
+ if (BaseReg == RISCV::NoRegister)
1728
+ BaseReg = Reg;
1729
+ return BaseReg;
1730
+ }
1731
+
1754
1732
void RISCVFrameLowering::emitCalleeSavedRVVPrologCFI (
1755
1733
MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, bool HasFP) const {
1756
1734
MachineFunction *MF = MBB.getParent ();
@@ -1777,7 +1755,7 @@ void RISCVFrameLowering::emitCalleeSavedRVVPrologCFI(
1777
1755
// Insert the spill to the stack frame.
1778
1756
int FI = CS.getFrameIdx ();
1779
1757
MCRegister BaseReg = getRVVBaseRegister (TRI, CS.getReg ());
1780
- unsigned NumRegs = getCaleeSavedRVVNumRegs (CS.getReg ());
1758
+ unsigned NumRegs = getCalleeSavedRVVNumRegs (CS.getReg ());
1781
1759
for (unsigned i = 0 ; i < NumRegs; ++i) {
1782
1760
unsigned CFIIndex = MF->addFrameInst (createDefCFAOffset (
1783
1761
TRI, BaseReg + i, -FixedSize, MFI.getObjectOffset (FI) / 8 + i));
@@ -1788,6 +1766,29 @@ void RISCVFrameLowering::emitCalleeSavedRVVPrologCFI(
1788
1766
}
1789
1767
}
1790
1768
1769
+ void RISCVFrameLowering::emitCalleeSavedRVVEpilogCFI (
1770
+ MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const {
1771
+ MachineFunction *MF = MBB.getParent ();
1772
+ const MachineFrameInfo &MFI = MF->getFrameInfo ();
1773
+ const RISCVRegisterInfo *RI = STI.getRegisterInfo ();
1774
+ const TargetInstrInfo &TII = *STI.getInstrInfo ();
1775
+ const RISCVRegisterInfo &TRI = *STI.getRegisterInfo ();
1776
+ DebugLoc DL = MBB.findDebugLoc (MI);
1777
+
1778
+ const auto &RVVCSI = getRVVCalleeSavedInfo (*MF, MFI.getCalleeSavedInfo ());
1779
+ for (auto &CS : RVVCSI) {
1780
+ MCRegister BaseReg = getRVVBaseRegister (TRI, CS.getReg ());
1781
+ unsigned NumRegs = getCalleeSavedRVVNumRegs (CS.getReg ());
1782
+ for (unsigned i = 0 ; i < NumRegs; ++i) {
1783
+ unsigned CFIIndex = MF->addFrameInst (MCCFIInstruction::createRestore (
1784
+ nullptr , RI->getDwarfRegNum (BaseReg + i, true )));
1785
+ BuildMI (MBB, MI, DL, TII.get (TargetOpcode::CFI_INSTRUCTION))
1786
+ .addCFIIndex (CFIIndex)
1787
+ .setMIFlag (MachineInstr::FrameDestroy);
1788
+ }
1789
+ }
1790
+ }
1791
+
1791
1792
bool RISCVFrameLowering::restoreCalleeSavedRegisters (
1792
1793
MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
1793
1794
MutableArrayRef<CalleeSavedInfo> CSI, const TargetRegisterInfo *TRI) const {
0 commit comments