Skip to content

Commit 19465c4

Browse files
committed
[RISCV] Guard CFI emission code with MF.needsFrameMoves()
Currently, AsmPrinter skips CFI instructions if they are not needed. I'd like to change that so that it prints/encodes CFI instructions unconditionally. If a backend doesn't want them to be printed/encoded, it shouldn't create them. Apart from that, this change should slightly improve compile time as post-PEI passes no longer need to skip over these instructions in no-exceptions no-debug builds. The changes in a test seem to be caused by slightly different post-RA scheduling in the absence of CFI instructions.
1 parent 6553753 commit 19465c4

File tree

3 files changed

+91
-88
lines changed

3 files changed

+91
-88
lines changed

llvm/lib/Target/RISCV/RISCVFrameLowering.cpp

Lines changed: 75 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ static const std::pair<MCPhysReg, int8_t> FixedCSRFIQCIInterruptMap[] = {
9595
/* -21, -22, -23, -24 are reserved */
9696
};
9797

98+
/// Returns true if DWARF CFI instructions ("frame moves") should be emitted.
99+
static bool needsDwarfCFI(const MachineFunction &MF) {
100+
return MF.needsFrameMoves();
101+
}
102+
98103
// For now we use x3, a.k.a gp, as pointer to shadow call stack.
99104
// User should not use x3 in their asm.
100105
static void emitSCSPrologue(MachineFunction &MF, MachineBasicBlock &MBB,
@@ -141,6 +146,9 @@ static void emitSCSPrologue(MachineFunction &MF, MachineBasicBlock &MBB,
141146
.addImm(-SlotSize)
142147
.setMIFlag(MachineInstr::FrameSetup);
143148

149+
if (!needsDwarfCFI(MF))
150+
return;
151+
144152
// Emit a CFI instruction that causes SlotSize to be subtracted from the value
145153
// of the shadow stack pointer when unwinding past this frame.
146154
char DwarfSCSReg = TRI->getDwarfRegNum(SCSPReg, /*IsEH*/ true);
@@ -199,8 +207,10 @@ static void emitSCSEpilogue(MachineFunction &MF, MachineBasicBlock &MBB,
199207
.addReg(SCSPReg)
200208
.addImm(-SlotSize)
201209
.setMIFlag(MachineInstr::FrameDestroy);
202-
// Restore the SCS pointer
203-
CFIInstBuilder(MBB, MI, MachineInstr::FrameDestroy).buildRestore(SCSPReg);
210+
if (needsDwarfCFI(MF)) {
211+
// Restore the SCS pointer
212+
CFIInstBuilder(MBB, MI, MachineInstr::FrameDestroy).buildRestore(SCSPReg);
213+
}
204214
}
205215

206216
// Insert instruction to swap mscratchsw with sp
@@ -937,6 +947,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
937947
MBBI = std::prev(MBBI, getRVVCalleeSavedInfo(MF, CSI).size() +
938948
getUnmanagedCSI(MF, CSI).size());
939949
CFIInstBuilder CFIBuilder(MBB, MBBI, MachineInstr::FrameSetup);
950+
bool NeedsDwarfCFI = needsDwarfCFI(MF);
940951

941952
// If libcalls are used to spill and restore callee-saved registers, the frame
942953
// has two sections; the opaque section managed by the libcalls, and the
@@ -964,10 +975,12 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
964975
alignTo((STI.getXLen() / 8) * LibCallRegs, getStackAlign());
965976
RVFI->setLibCallStackSize(LibCallFrameSize);
966977

967-
CFIBuilder.buildDefCFAOffset(LibCallFrameSize);
968-
for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo(MF, CSI))
969-
CFIBuilder.buildOffset(CS.getReg(),
970-
MFI.getObjectOffset(CS.getFrameIdx()));
978+
if (NeedsDwarfCFI) {
979+
CFIBuilder.buildDefCFAOffset(LibCallFrameSize);
980+
for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo(MF, CSI))
981+
CFIBuilder.buildOffset(CS.getReg(),
982+
MFI.getObjectOffset(CS.getFrameIdx()));
983+
}
971984
}
972985

973986
// FIXME (note copied from Lanai): This appears to be overallocating. Needs
@@ -998,14 +1011,17 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
9981011
// could only be the next instruction.
9991012
++PossiblePush;
10001013

1001-
// Insert the CFI metadata before where we think the `(QC.)CM.PUSH(FP)`
1002-
// could be. The PUSH will also get its own CFI metadata for its own
1003-
// modifications, which should come after the PUSH.
1004-
CFIInstBuilder PushCFIBuilder(MBB, PossiblePush, MachineInstr::FrameSetup);
1005-
PushCFIBuilder.buildDefCFAOffset(QCIInterruptPushAmount);
1006-
for (const CalleeSavedInfo &CS : getQCISavedInfo(MF, CSI))
1007-
PushCFIBuilder.buildOffset(CS.getReg(),
1008-
MFI.getObjectOffset(CS.getFrameIdx()));
1014+
if (NeedsDwarfCFI) {
1015+
// Insert the CFI metadata before where we think the `(QC.)CM.PUSH(FP)`
1016+
// could be. The PUSH will also get its own CFI metadata for its own
1017+
// modifications, which should come after the PUSH.
1018+
CFIInstBuilder PushCFIBuilder(MBB, PossiblePush,
1019+
MachineInstr::FrameSetup);
1020+
PushCFIBuilder.buildDefCFAOffset(QCIInterruptPushAmount);
1021+
for (const CalleeSavedInfo &CS : getQCISavedInfo(MF, CSI))
1022+
PushCFIBuilder.buildOffset(CS.getReg(),
1023+
MFI.getObjectOffset(CS.getFrameIdx()));
1024+
}
10091025
}
10101026

10111027
if (RVFI->isPushable(MF) && PossiblePush != MBB.end() &&
@@ -1019,10 +1035,12 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
10191035
PossiblePush->getOperand(1).setImm(StackAdj);
10201036
StackSize -= StackAdj;
10211037

1022-
CFIBuilder.buildDefCFAOffset(RealStackSize - StackSize);
1023-
for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo(MF, CSI))
1024-
CFIBuilder.buildOffset(CS.getReg(),
1025-
MFI.getObjectOffset(CS.getFrameIdx()));
1038+
if (NeedsDwarfCFI) {
1039+
CFIBuilder.buildDefCFAOffset(RealStackSize - StackSize);
1040+
for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo(MF, CSI))
1041+
CFIBuilder.buildOffset(CS.getReg(),
1042+
MFI.getObjectOffset(CS.getFrameIdx()));
1043+
}
10261044
}
10271045

10281046
// Allocate space on the stack if necessary.
@@ -1033,7 +1051,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
10331051
bool DynAllocation =
10341052
MF.getInfo<RISCVMachineFunctionInfo>()->hasDynamicAllocation();
10351053
if (StackSize != 0)
1036-
allocateStack(MBB, MBBI, MF, StackSize, RealStackSize, /*EmitCFI=*/true,
1054+
allocateStack(MBB, MBBI, MF, StackSize, RealStackSize, NeedsDwarfCFI,
10371055
NeedProbe, ProbeSize, DynAllocation);
10381056

10391057
// Save SiFive CLIC CSRs into Stack
@@ -1050,8 +1068,10 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
10501068

10511069
// Iterate over list of callee-saved registers and emit .cfi_offset
10521070
// directives.
1053-
for (const CalleeSavedInfo &CS : getUnmanagedCSI(MF, CSI))
1054-
CFIBuilder.buildOffset(CS.getReg(), MFI.getObjectOffset(CS.getFrameIdx()));
1071+
if (NeedsDwarfCFI)
1072+
for (const CalleeSavedInfo &CS : getUnmanagedCSI(MF, CSI))
1073+
CFIBuilder.buildOffset(CS.getReg(),
1074+
MFI.getObjectOffset(CS.getFrameIdx()));
10551075

10561076
// Generate new FP.
10571077
if (hasFP(MF)) {
@@ -1070,7 +1090,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
10701090
MachineInstr::FrameSetup, getStackAlign());
10711091
}
10721092

1073-
CFIBuilder.buildDefCFA(FPReg, RVFI->getVarArgsSaveSize());
1093+
if (NeedsDwarfCFI)
1094+
CFIBuilder.buildDefCFA(FPReg, RVFI->getVarArgsSaveSize());
10741095
}
10751096

10761097
uint64_t SecondSPAdjustAmount = 0;
@@ -1081,15 +1102,15 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
10811102
"SecondSPAdjustAmount should be greater than zero");
10821103

10831104
allocateStack(MBB, MBBI, MF, SecondSPAdjustAmount,
1084-
getStackSizeWithRVVPadding(MF), !hasFP(MF), NeedProbe,
1085-
ProbeSize, DynAllocation);
1105+
getStackSizeWithRVVPadding(MF), NeedsDwarfCFI && !hasFP(MF),
1106+
NeedProbe, ProbeSize, DynAllocation);
10861107
}
10871108

10881109
if (RVVStackSize) {
10891110
if (NeedProbe) {
10901111
allocateAndProbeStackForRVV(MF, MBB, MBBI, DL, RVVStackSize,
1091-
MachineInstr::FrameSetup, !hasFP(MF),
1092-
DynAllocation);
1112+
MachineInstr::FrameSetup,
1113+
NeedsDwarfCFI && !hasFP(MF), DynAllocation);
10931114
} else {
10941115
// We must keep the stack pointer aligned through any intermediate
10951116
// updates.
@@ -1098,14 +1119,15 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
10981119
MachineInstr::FrameSetup, getStackAlign());
10991120
}
11001121

1101-
if (!hasFP(MF)) {
1122+
if (NeedsDwarfCFI && !hasFP(MF)) {
11021123
// Emit .cfi_def_cfa_expression "sp + StackSize + RVVStackSize * vlenb".
11031124
CFIBuilder.insertCFIInst(createDefCFAExpression(
11041125
*RI, SPReg, getStackSizeWithRVVPadding(MF), RVVStackSize / 8));
11051126
}
11061127

11071128
std::advance(MBBI, getRVVCalleeSavedInfo(MF, CSI).size());
1108-
emitCalleeSavedRVVPrologCFI(MBB, MBBI, hasFP(MF));
1129+
if (NeedsDwarfCFI)
1130+
emitCalleeSavedRVVPrologCFI(MBB, MBBI, hasFP(MF));
11091131
}
11101132

11111133
if (hasFP(MF)) {
@@ -1172,8 +1194,9 @@ void RISCVFrameLowering::deallocateStack(MachineFunction &MF,
11721194
MachineInstr::FrameDestroy, getStackAlign());
11731195
StackSize = 0;
11741196

1175-
CFIInstBuilder(MBB, MBBI, MachineInstr::FrameDestroy)
1176-
.buildDefCFAOffset(CFAOffset);
1197+
if (needsDwarfCFI(MF))
1198+
CFIInstBuilder(MBB, MBBI, MachineInstr::FrameDestroy)
1199+
.buildDefCFAOffset(CFAOffset);
11771200
}
11781201

11791202
void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
@@ -1213,6 +1236,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
12131236
std::next(MBBI, getRVVCalleeSavedInfo(MF, CSI).size());
12141237
CFIInstBuilder CFIBuilder(MBB, FirstScalarCSRRestoreInsn,
12151238
MachineInstr::FrameDestroy);
1239+
bool NeedsDwarfCFI = needsDwarfCFI(MF);
12161240

12171241
uint64_t FirstSPAdjustAmount = getFirstSPAdjustAmount(MF);
12181242
uint64_t RealStackSize = FirstSPAdjustAmount ? FirstSPAdjustAmount
@@ -1233,10 +1257,11 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
12331257
StackOffset::getScalable(RVVStackSize),
12341258
MachineInstr::FrameDestroy, getStackAlign());
12351259

1236-
if (!hasFP(MF))
1237-
CFIBuilder.buildDefCFA(SPReg, RealStackSize);
1238-
1239-
emitCalleeSavedRVVEpilogCFI(MBB, FirstScalarCSRRestoreInsn);
1260+
if (NeedsDwarfCFI) {
1261+
if (!hasFP(MF))
1262+
CFIBuilder.buildDefCFA(SPReg, RealStackSize);
1263+
emitCalleeSavedRVVEpilogCFI(MBB, FirstScalarCSRRestoreInsn);
1264+
}
12401265
}
12411266

12421267
if (FirstSPAdjustAmount) {
@@ -1252,7 +1277,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
12521277
StackOffset::getFixed(SecondSPAdjustAmount),
12531278
MachineInstr::FrameDestroy, getStackAlign());
12541279

1255-
if (!hasFP(MF))
1280+
if (NeedsDwarfCFI && !hasFP(MF))
12561281
CFIBuilder.buildDefCFAOffset(FirstSPAdjustAmount);
12571282
}
12581283

@@ -1273,7 +1298,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
12731298
getStackAlign());
12741299
}
12751300

1276-
if (hasFP(MF))
1301+
if (NeedsDwarfCFI && hasFP(MF))
12771302
CFIBuilder.buildDefCFA(SPReg, RealStackSize);
12781303

12791304
// Skip to after the restores of scalar callee-saved registers
@@ -1296,8 +1321,9 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
12961321
}
12971322

12981323
// Recover callee-saved registers.
1299-
for (const CalleeSavedInfo &CS : getUnmanagedCSI(MF, CSI))
1300-
CFIBuilder.buildRestore(CS.getReg());
1324+
if (NeedsDwarfCFI)
1325+
for (const CalleeSavedInfo &CS : getUnmanagedCSI(MF, CSI))
1326+
CFIBuilder.buildRestore(CS.getReg());
13011327

13021328
if (RVFI->isPushable(MF) && MBBI != MBB.end() && isPop(MBBI->getOpcode())) {
13031329
// Use available stack adjustment in pop instruction to deallocate stack
@@ -1316,15 +1342,17 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
13161342
auto NextI = next_nodbg(MBBI, MBB.end());
13171343
if (NextI == MBB.end() || NextI->getOpcode() != RISCV::PseudoRET) {
13181344
++MBBI;
1319-
CFIBuilder.setInsertPoint(MBBI);
1345+
if (NeedsDwarfCFI) {
1346+
CFIBuilder.setInsertPoint(MBBI);
13201347

1321-
for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo(MF, CSI))
1322-
CFIBuilder.buildRestore(CS.getReg());
1348+
for (const CalleeSavedInfo &CS : getPushOrLibCallsSavedInfo(MF, CSI))
1349+
CFIBuilder.buildRestore(CS.getReg());
13231350

1324-
// Update CFA Offset. If this is a QCI interrupt function, there will be a
1325-
// leftover offset which is deallocated by `QC.C.MILEAVERET`, otherwise
1326-
// getQCIInterruptStackSize() will be 0.
1327-
CFIBuilder.buildDefCFAOffset(RVFI->getQCIInterruptStackSize());
1351+
// Update CFA Offset. If this is a QCI interrupt function, there will
1352+
// be a leftover offset which is deallocated by `QC.C.MILEAVERET`,
1353+
// otherwise getQCIInterruptStackSize() will be 0.
1354+
CFIBuilder.buildDefCFAOffset(RVFI->getQCIInterruptStackSize());
1355+
}
13281356
}
13291357
}
13301358

@@ -1813,7 +1841,8 @@ MachineBasicBlock::iterator RISCVFrameLowering::eliminateCallFramePseudoInstr(
18131841
// allocateStack.
18141842
bool DynAllocation =
18151843
MF.getInfo<RISCVMachineFunctionInfo>()->hasDynamicAllocation();
1816-
allocateStack(MBB, MI, MF, -Amount, -Amount, !hasFP(MF),
1844+
allocateStack(MBB, MI, MF, -Amount, -Amount,
1845+
needsDwarfCFI(MF) && !hasFP(MF),
18171846
/*NeedProbe=*/true, ProbeSize, DynAllocation);
18181847
} else {
18191848
const RISCVRegisterInfo &RI = *STI.getRegisterInfo();

llvm/test/CodeGen/RISCV/short-forward-branch-opt.ll

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -798,12 +798,12 @@ define void @sextw_removal_ccor(i1 %c, i32 signext %arg, i32 signext %arg1, i32
798798
; RV64SFBSIFIVEU74-LABEL: sextw_removal_ccor:
799799
; RV64SFBSIFIVEU74: # %bb.0: # %bb
800800
; RV64SFBSIFIVEU74-NEXT: addi sp, sp, -32
801-
; RV64SFBSIFIVEU74-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
802801
; RV64SFBSIFIVEU74-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
803-
; RV64SFBSIFIVEU74-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
804802
; RV64SFBSIFIVEU74-NEXT: mv s0, a3
803+
; RV64SFBSIFIVEU74-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
805804
; RV64SFBSIFIVEU74-NEXT: andi a0, a0, 1
806805
; RV64SFBSIFIVEU74-NEXT: mv s1, a2
806+
; RV64SFBSIFIVEU74-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
807807
; RV64SFBSIFIVEU74-NEXT: beqz a0, .LBB15_4
808808
; RV64SFBSIFIVEU74-NEXT: # %bb.3: # %bb
809809
; RV64SFBSIFIVEU74-NEXT: or s0, a3, a1
@@ -824,11 +824,11 @@ define void @sextw_removal_ccor(i1 %c, i32 signext %arg, i32 signext %arg1, i32
824824
; RV64SFBANDESAX45-LABEL: sextw_removal_ccor:
825825
; RV64SFBANDESAX45: # %bb.0: # %bb
826826
; RV64SFBANDESAX45-NEXT: addi sp, sp, -32
827-
; RV64SFBANDESAX45-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
828827
; RV64SFBANDESAX45-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
829-
; RV64SFBANDESAX45-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
830828
; RV64SFBANDESAX45-NEXT: mv s0, a3
829+
; RV64SFBANDESAX45-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
831830
; RV64SFBANDESAX45-NEXT: mv s1, a2
831+
; RV64SFBANDESAX45-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
832832
; RV64SFBANDESAX45-NEXT: nds.bbc a0, 0, .LBB15_2
833833
; RV64SFBANDESAX45-NEXT: # %bb.1:
834834
; RV64SFBANDESAX45-NEXT: or s0, s0, a1
@@ -848,12 +848,12 @@ define void @sextw_removal_ccor(i1 %c, i32 signext %arg, i32 signext %arg1, i32
848848
; ZICOND-LABEL: sextw_removal_ccor:
849849
; ZICOND: # %bb.0: # %bb
850850
; ZICOND-NEXT: addi sp, sp, -32
851-
; ZICOND-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
852851
; ZICOND-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
853-
; ZICOND-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
854852
; ZICOND-NEXT: mv s0, a3
853+
; ZICOND-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
855854
; ZICOND-NEXT: andi a0, a0, 1
856855
; ZICOND-NEXT: mv s1, a2
856+
; ZICOND-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
857857
; ZICOND-NEXT: beqz a0, .LBB15_4
858858
; ZICOND-NEXT: # %bb.3: # %bb
859859
; ZICOND-NEXT: or s0, a3, a1
@@ -874,12 +874,12 @@ define void @sextw_removal_ccor(i1 %c, i32 signext %arg, i32 signext %arg1, i32
874874
; RV32SFB-LABEL: sextw_removal_ccor:
875875
; RV32SFB: # %bb.0: # %bb
876876
; RV32SFB-NEXT: addi sp, sp, -16
877-
; RV32SFB-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
878877
; RV32SFB-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
879-
; RV32SFB-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
880878
; RV32SFB-NEXT: mv s0, a3
879+
; RV32SFB-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
881880
; RV32SFB-NEXT: andi a0, a0, 1
882881
; RV32SFB-NEXT: mv s1, a2
882+
; RV32SFB-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
883883
; RV32SFB-NEXT: beqz a0, .LBB15_4
884884
; RV32SFB-NEXT: # %bb.3: # %bb
885885
; RV32SFB-NEXT: or s0, a3, a1
@@ -941,11 +941,11 @@ define void @sextw_removal_ccaddw(i1 %c, i32 signext %arg, i32 signext %arg1, i3
941941
; RV64SFBSIFIVEU74-LABEL: sextw_removal_ccaddw:
942942
; RV64SFBSIFIVEU74: # %bb.0: # %bb
943943
; RV64SFBSIFIVEU74-NEXT: addi sp, sp, -32
944-
; RV64SFBSIFIVEU74-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
945-
; RV64SFBSIFIVEU74-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
946944
; RV64SFBSIFIVEU74-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
947945
; RV64SFBSIFIVEU74-NEXT: mv s1, a1
948946
; RV64SFBSIFIVEU74-NEXT: andi a0, a0, 1
947+
; RV64SFBSIFIVEU74-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
948+
; RV64SFBSIFIVEU74-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
949949
; RV64SFBSIFIVEU74-NEXT: mv s0, a2
950950
; RV64SFBSIFIVEU74-NEXT: beqz a0, .LBB16_4
951951
; RV64SFBSIFIVEU74-NEXT: # %bb.3: # %bb
@@ -967,11 +967,11 @@ define void @sextw_removal_ccaddw(i1 %c, i32 signext %arg, i32 signext %arg1, i3
967967
; RV64SFBANDESAX45-LABEL: sextw_removal_ccaddw:
968968
; RV64SFBANDESAX45: # %bb.0: # %bb
969969
; RV64SFBANDESAX45-NEXT: addi sp, sp, -32
970-
; RV64SFBANDESAX45-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
971970
; RV64SFBANDESAX45-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
972-
; RV64SFBANDESAX45-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
973971
; RV64SFBANDESAX45-NEXT: mv s0, a2
972+
; RV64SFBANDESAX45-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
974973
; RV64SFBANDESAX45-NEXT: mv s1, a1
974+
; RV64SFBANDESAX45-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
975975
; RV64SFBANDESAX45-NEXT: nds.bbc a0, 0, .LBB16_2
976976
; RV64SFBANDESAX45-NEXT: # %bb.1:
977977
; RV64SFBANDESAX45-NEXT: addw s1, s1, a3
@@ -991,11 +991,11 @@ define void @sextw_removal_ccaddw(i1 %c, i32 signext %arg, i32 signext %arg1, i3
991991
; ZICOND-LABEL: sextw_removal_ccaddw:
992992
; ZICOND: # %bb.0: # %bb
993993
; ZICOND-NEXT: addi sp, sp, -32
994-
; ZICOND-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
995-
; ZICOND-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
996994
; ZICOND-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
997995
; ZICOND-NEXT: mv s1, a1
998996
; ZICOND-NEXT: andi a0, a0, 1
997+
; ZICOND-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
998+
; ZICOND-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
999999
; ZICOND-NEXT: mv s0, a2
10001000
; ZICOND-NEXT: beqz a0, .LBB16_4
10011001
; ZICOND-NEXT: # %bb.3: # %bb
@@ -1017,11 +1017,11 @@ define void @sextw_removal_ccaddw(i1 %c, i32 signext %arg, i32 signext %arg1, i3
10171017
; RV32SFB-LABEL: sextw_removal_ccaddw:
10181018
; RV32SFB: # %bb.0: # %bb
10191019
; RV32SFB-NEXT: addi sp, sp, -16
1020-
; RV32SFB-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1021-
; RV32SFB-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
10221020
; RV32SFB-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
10231021
; RV32SFB-NEXT: mv s1, a1
10241022
; RV32SFB-NEXT: andi a0, a0, 1
1023+
; RV32SFB-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
1024+
; RV32SFB-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
10251025
; RV32SFB-NEXT: mv s0, a2
10261026
; RV32SFB-NEXT: beqz a0, .LBB16_4
10271027
; RV32SFB-NEXT: # %bb.3: # %bb

0 commit comments

Comments
 (0)