@@ -669,7 +669,8 @@ void RISCVFrameLowering::allocateStack(MachineBasicBlock &MBB,
669
669
// Simply allocate the stack if it's not big enough to require a probe.
670
670
if (!NeedProbe || Offset <= ProbeSize) {
671
671
RI->adjustReg (MBB, MBBI, DL, SPReg, SPReg, StackOffset::getFixed (-Offset),
672
- MachineInstr::FrameSetup, getStackAlign ());
672
+ MachineInstr::FrameSetup, getStackAlign (),
673
+ /* IsPrologueOrEpilogue*/ true );
673
674
674
675
if (EmitCFI) {
675
676
// Emit ".cfi_def_cfa_offset RealStackSize"
@@ -698,7 +699,7 @@ void RISCVFrameLowering::allocateStack(MachineBasicBlock &MBB,
698
699
while (CurrentOffset + ProbeSize <= Offset) {
699
700
RI->adjustReg (MBB, MBBI, DL, SPReg, SPReg,
700
701
StackOffset::getFixed (-ProbeSize), MachineInstr::FrameSetup,
701
- getStackAlign ());
702
+ getStackAlign (), /* IsPrologueOrEpilogue */ true );
702
703
// s[d|w] zero, 0(sp)
703
704
BuildMI (MBB, MBBI, DL, TII->get (IsRV64 ? RISCV::SD : RISCV::SW))
704
705
.addReg (RISCV::X0)
@@ -721,7 +722,7 @@ void RISCVFrameLowering::allocateStack(MachineBasicBlock &MBB,
721
722
if (Residual) {
722
723
RI->adjustReg (MBB, MBBI, DL, SPReg, SPReg,
723
724
StackOffset::getFixed (-Residual), MachineInstr::FrameSetup,
724
- getStackAlign ());
725
+ getStackAlign (), /* IsPrologueOrEpilogue */ true );
725
726
if (EmitCFI) {
726
727
// Emit ".cfi_def_cfa_offset Offset"
727
728
unsigned CFIIndex =
@@ -752,7 +753,7 @@ void RISCVFrameLowering::allocateStack(MachineBasicBlock &MBB,
752
753
// SUB TargetReg, SP, RoundedSize
753
754
RI->adjustReg (MBB, MBBI, DL, TargetReg, SPReg,
754
755
StackOffset::getFixed (-RoundedSize), MachineInstr::FrameSetup,
755
- getStackAlign ());
756
+ getStackAlign (), /* IsPrologueOrEpilogue */ true );
756
757
757
758
if (EmitCFI) {
758
759
// Set the CFA register to TargetReg.
@@ -781,7 +782,8 @@ void RISCVFrameLowering::allocateStack(MachineBasicBlock &MBB,
781
782
782
783
if (Residual) {
783
784
RI->adjustReg (MBB, MBBI, DL, SPReg, SPReg, StackOffset::getFixed (-Residual),
784
- MachineInstr::FrameSetup, getStackAlign ());
785
+ MachineInstr::FrameSetup, getStackAlign (),
786
+ /* IsPrologueOrEpilogue*/ true );
785
787
if (DynAllocation) {
786
788
// s[d|w] zero, 0(sp)
787
789
BuildMI (MBB, MBBI, DL, TII->get (IsRV64 ? RISCV::SD : RISCV::SW))
@@ -1014,7 +1016,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1014
1016
RI->adjustReg (
1015
1017
MBB, MBBI, DL, FPReg, SPReg,
1016
1018
StackOffset::getFixed (RealStackSize - RVFI->getVarArgsSaveSize ()),
1017
- MachineInstr::FrameSetup, getStackAlign ());
1019
+ MachineInstr::FrameSetup, getStackAlign (),
1020
+ /* IsPrologueOrEpilogue*/ true );
1018
1021
}
1019
1022
1020
1023
// Emit ".cfi_def_cfa $fp, RVFI->getVarArgsSaveSize()"
@@ -1047,7 +1050,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
1047
1050
// updates.
1048
1051
RI->adjustReg (MBB, MBBI, DL, SPReg, SPReg,
1049
1052
StackOffset::getScalable (-RVVStackSize),
1050
- MachineInstr::FrameSetup, getStackAlign ());
1053
+ MachineInstr::FrameSetup, getStackAlign (),
1054
+ /* IsPrologueOrEpilogue*/ true );
1051
1055
}
1052
1056
1053
1057
if (!hasFP (MF)) {
@@ -1125,7 +1129,8 @@ void RISCVFrameLowering::deallocateStack(MachineFunction &MF,
1125
1129
const RISCVInstrInfo *TII = STI.getInstrInfo ();
1126
1130
1127
1131
RI->adjustReg (MBB, MBBI, DL, SPReg, SPReg, StackOffset::getFixed (StackSize),
1128
- MachineInstr::FrameDestroy, getStackAlign ());
1132
+ MachineInstr::FrameDestroy, getStackAlign (),
1133
+ /* IsPrologueOrEpilogue*/ true );
1129
1134
StackSize = 0 ;
1130
1135
1131
1136
unsigned CFIIndex =
@@ -1189,7 +1194,8 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1189
1194
if (!RestoreSPFromFP)
1190
1195
RI->adjustReg (MBB, FirstScalarCSRRestoreInsn, DL, SPReg, SPReg,
1191
1196
StackOffset::getScalable (RVVStackSize),
1192
- MachineInstr::FrameDestroy, getStackAlign ());
1197
+ MachineInstr::FrameDestroy, getStackAlign (),
1198
+ /* IsPrologueOrEpilogue*/ true );
1193
1199
1194
1200
if (!hasFP (MF)) {
1195
1201
unsigned CFIIndex = MF.addFrameInst (MCCFIInstruction::cfiDefCfa (
@@ -1214,7 +1220,8 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1214
1220
if (!RestoreSPFromFP)
1215
1221
RI->adjustReg (MBB, FirstScalarCSRRestoreInsn, DL, SPReg, SPReg,
1216
1222
StackOffset::getFixed (SecondSPAdjustAmount),
1217
- MachineInstr::FrameDestroy, getStackAlign ());
1223
+ MachineInstr::FrameDestroy, getStackAlign (),
1224
+ /* IsPrologueOrEpilogue*/ true );
1218
1225
1219
1226
if (!hasFP (MF)) {
1220
1227
unsigned CFIIndex = MF.addFrameInst (
@@ -1240,7 +1247,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
1240
1247
assert (hasFP (MF) && " frame pointer should not have been eliminated" );
1241
1248
RI->adjustReg (MBB, FirstScalarCSRRestoreInsn, DL, SPReg, FPReg,
1242
1249
StackOffset::getFixed (-FPOffset), MachineInstr::FrameDestroy,
1243
- getStackAlign ());
1250
+ getStackAlign (), /* IsPrologueOrEpilogue */ true );
1244
1251
}
1245
1252
1246
1253
if (hasFP (MF)) {
@@ -1771,7 +1778,8 @@ MachineBasicBlock::iterator RISCVFrameLowering::eliminateCallFramePseudoInstr(
1771
1778
1772
1779
const RISCVRegisterInfo &RI = *STI.getRegisterInfo ();
1773
1780
RI.adjustReg (MBB, MI, DL, SPReg, SPReg, StackOffset::getFixed (Amount),
1774
- MachineInstr::NoFlags, getStackAlign ());
1781
+ MachineInstr::NoFlags, getStackAlign (),
1782
+ /* IsPrologueOrEpilogue*/ true );
1775
1783
}
1776
1784
}
1777
1785
@@ -2195,6 +2203,17 @@ bool RISCVFrameLowering::canUseAsPrologue(const MachineBasicBlock &MBB) const {
2195
2203
const MachineFunction *MF = MBB.getParent ();
2196
2204
const auto *RVFI = MF->getInfo <RISCVMachineFunctionInfo>();
2197
2205
2206
+ // Make sure VTYPE and VL are not live-in since we will use vsetvli in the
2207
+ // prologue to get the VLEN, and that will clobber these registers.
2208
+ //
2209
+ // We may do also check the stack has contain for the object with the
2210
+ // scalable vector type, but this will require iterating over all the stack
2211
+ // objects, but this may not worth since the situation is rare, we could do
2212
+ // further check in future if we find it is necessary.
2213
+ if (STI.preferVsetvliOverReadVLENB () &&
2214
+ (MBB.isLiveIn (RISCV::VTYPE) || MBB.isLiveIn (RISCV::VL)))
2215
+ return false ;
2216
+
2198
2217
if (!RVFI->useSaveRestoreLibCalls (*MF))
2199
2218
return true ;
2200
2219
0 commit comments