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
+ namespace {
48
+
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;
67
+
68
+ public:
69
+ CFIStoreRegisterEmitter (MachineFunction &MF, const RISCVSubtarget &)
70
+ : MFI{MF.getFrameInfo ()} {};
71
+
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 {
76
+ int FrameIdx = CS.getFrameIdx ();
77
+ int64_t Offset = MFI.getObjectOffset (FrameIdx);
78
+ Register Reg = CS.getReg ();
79
+ unsigned CFIIndex = MF.addFrameInst (MCCFIInstruction::createOffset (
80
+ nullptr , RI.getDwarfRegNum (Reg, true ), Offset));
81
+ BuildMI (MBB, MBBI, DL, TII.get (TargetOpcode::CFI_INSTRUCTION))
82
+ .addCFIIndex (CFIIndex)
83
+ .setMIFlag (MachineInstr::FrameSetup);
84
+ }
85
+ };
86
+
87
+ class CFIRestoreRVVRegisterEmitter {
88
+ const llvm::RISCVRegisterInfo *TRI;
89
+
90
+ 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
+ }
107
+ }
108
+ };
109
+
110
+ } // namespace
111
+
112
+ template <typename Emitter>
113
+ void RISCVFrameLowering::emitCFIForCSI (
114
+ MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
115
+ const SmallVector<CalleeSavedInfo, 8 > &CSI) const {
116
+ MachineFunction *MF = MBB.getParent ();
117
+ const RISCVRegisterInfo *RI = STI.getRegisterInfo ();
118
+ const RISCVInstrInfo *TII = STI.getInstrInfo ();
119
+ DebugLoc DL = MBB.findDebugLoc (MBBI);
120
+
121
+ Emitter E{*MF, STI};
122
+ for (const auto &CS : CSI)
123
+ E.emit (*MF, MBB, MBBI, *RI, *TII, DL, CS);
124
+ }
125
+
30
126
static Align getABIStackAlignment (RISCVABI::ABI ABI) {
31
127
if (ABI == RISCVABI::ABI_ILP32E)
32
128
return Align (4 );
@@ -610,16 +706,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
610
706
.addCFIIndex (CFIIndex)
611
707
.setMIFlag (MachineInstr::FrameSetup);
612
708
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
- }
709
+ emitCFIForCSI<CFIStoreRegisterEmitter>(MBB, MBBI,
710
+ getPushOrLibCallsSavedInfo (MF, CSI));
623
711
}
624
712
625
713
// FIXME (note copied from Lanai): This appears to be overallocating. Needs
@@ -661,16 +749,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
661
749
.addCFIIndex (CFIIndex)
662
750
.setMIFlag (MachineInstr::FrameSetup);
663
751
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
- }
752
+ emitCFIForCSI<CFIStoreRegisterEmitter>(MBB, MBBI,
753
+ getPushOrLibCallsSavedInfo (MF, CSI));
674
754
}
675
755
676
756
if (StackSize != 0 ) {
@@ -697,20 +777,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
697
777
698
778
// Iterate over list of callee-saved registers and emit .cfi_offset
699
779
// 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
- }
780
+ emitCFIForCSI<CFIStoreRegisterEmitter>(MBB, MBBI, getUnmanagedCSI (MF, CSI));
714
781
715
782
// Generate new FP.
716
783
if (hasFP (MF)) {
@@ -895,7 +962,8 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
895
962
.setMIFlag (MachineInstr::FrameDestroy);
896
963
}
897
964
898
- emitCalleeSavedRVVEpilogCFI (MBB, LastFrameDestroy);
965
+ emitCFIForCSI<CFIRestoreRVVRegisterEmitter>(MBB, LastFrameDestroy,
966
+ getRVVCalleeSavedInfo (MF, CSI));
899
967
}
900
968
901
969
if (FirstSPAdjustAmount) {
@@ -960,14 +1028,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
960
1028
}
961
1029
962
1030
// 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
- }
1031
+ emitCFIForCSI<CFIRestoreRegisterEmitter>(MBB, MBBI, getUnmanagedCSI (MF, CSI));
971
1032
972
1033
bool ApplyPop = RVFI->isPushable (MF) && MBBI != MBB.end () &&
973
1034
MBBI->getOpcode () == RISCV::CM_POP;
@@ -976,7 +1037,8 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
976
1037
// space. Align the stack size down to a multiple of 16. This is needed for
977
1038
// RVE.
978
1039
// 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 );
1040
+ uint64_t Spimm =
1041
+ std::min (alignDown (StackSize, 16 ), static_cast <uint64_t >(48 ));
980
1042
MBBI->getOperand (1 ).setImm (Spimm);
981
1043
StackSize -= Spimm;
982
1044
@@ -988,14 +1050,8 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
988
1050
if (NextI == MBB.end () || NextI->getOpcode () != RISCV::PseudoRET) {
989
1051
++MBBI;
990
1052
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
- }
1053
+ emitCFIForCSI<CFIRestoreRegisterEmitter>(
1054
+ MBB, MBBI, getPushOrLibCallsSavedInfo (MF, CSI));
999
1055
1000
1056
// Update CFA offset. After CM_POP SP should be equal to CFA, so CFA
1001
1057
// offset should be a zero.
@@ -1695,23 +1751,6 @@ bool RISCVFrameLowering::spillCalleeSavedRegisters(
1695
1751
return true ;
1696
1752
}
1697
1753
1698
- static unsigned getCaleeSavedRVVNumRegs (const Register &BaseReg) {
1699
- return RISCV::VRRegClass.contains (BaseReg) ? 1
1700
- : RISCV::VRM2RegClass.contains (BaseReg) ? 2
1701
- : RISCV::VRM4RegClass.contains (BaseReg) ? 4
1702
- : 8 ;
1703
- }
1704
-
1705
- static MCRegister getRVVBaseRegister (const RISCVRegisterInfo &TRI,
1706
- const Register &Reg) {
1707
- MCRegister BaseReg = TRI.getSubReg (Reg, RISCV::sub_vrm1_0);
1708
- // If it's not a grouped vector register, it doesn't have subregister, so
1709
- // the base register is just itself.
1710
- if (BaseReg == RISCV::NoRegister)
1711
- BaseReg = Reg;
1712
- return BaseReg;
1713
- }
1714
-
1715
1754
void RISCVFrameLowering::emitCalleeSavedRVVPrologCFI (
1716
1755
MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, bool HasFP) const {
1717
1756
MachineFunction *MF = MBB.getParent ();
@@ -1737,39 +1776,14 @@ void RISCVFrameLowering::emitCalleeSavedRVVPrologCFI(
1737
1776
for (auto &CS : RVVCSI) {
1738
1777
// Insert the spill to the stack frame.
1739
1778
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
- }
1750
- }
1751
- }
1752
- }
1753
-
1754
- void RISCVFrameLowering::emitCalleeSavedRVVEpilogCFI (
1755
- MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const {
1756
- MachineFunction *MF = MBB.getParent ();
1757
- const MachineFrameInfo &MFI = MF->getFrameInfo ();
1758
- const RISCVRegisterInfo *RI = STI.getRegisterInfo ();
1759
- const TargetInstrInfo &TII = *STI.getInstrInfo ();
1760
- const RISCVRegisterInfo &TRI = *STI.getRegisterInfo ();
1761
- DebugLoc DL = MBB.findDebugLoc (MI);
1762
-
1763
- const auto &RVVCSI = getRVVCalleeSavedInfo (*MF, MFI.getCalleeSavedInfo ());
1764
- for (auto &CS : RVVCSI) {
1765
1779
MCRegister BaseReg = getRVVBaseRegister (TRI, CS.getReg ());
1766
1780
unsigned NumRegs = getCaleeSavedRVVNumRegs (CS.getReg ());
1767
1781
for (unsigned i = 0 ; i < NumRegs; ++i) {
1768
- unsigned CFIIndex = MF->addFrameInst (MCCFIInstruction::createRestore (
1769
- nullptr , RI-> getDwarfRegNum ( BaseReg + i, true ) ));
1782
+ unsigned CFIIndex = MF->addFrameInst (createDefCFAOffset (
1783
+ TRI, BaseReg + i, -FixedSize, MFI. getObjectOffset (FI) / 8 + i ));
1770
1784
BuildMI (MBB, MI, DL, TII.get (TargetOpcode::CFI_INSTRUCTION))
1771
1785
.addCFIIndex (CFIIndex)
1772
- .setMIFlag (MachineInstr::FrameDestroy );
1786
+ .setMIFlag (MachineInstr::FrameSetup );
1773
1787
}
1774
1788
}
1775
1789
}
0 commit comments