Skip to content

Commit ee917b4

Browse files
committed
Emit CFI to FP but don't move FP
1 parent 35800f2 commit ee917b4

File tree

3 files changed

+78
-5
lines changed

3 files changed

+78
-5
lines changed

llvm/lib/Target/RISCV/RISCVFrameLowering.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -974,17 +974,20 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
974974
emitCFIForCSI<CFISaveRegisterEmitter>(MBB, MBBI, getUnmanagedCSI(MF, CSI));
975975

976976
// Generate new FP.
977-
if (hasFP(MF) && RVFI->getPushPopKind(MF) !=
978-
RISCVMachineFunctionInfo::PushPopKind::VendorXqccmp) {
977+
if (hasFP(MF)) {
979978
if (STI.isRegisterReservedByUser(FPReg))
980979
MF.getFunction().getContext().diagnose(DiagnosticInfoUnsupported{
981980
MF.getFunction(), "Frame pointer required, but has been reserved."});
982981
// The frame pointer does need to be reserved from register allocation.
983982
assert(MF.getRegInfo().isReserved(FPReg) && "FP not reserved");
984983

985-
RI->adjustReg(MBB, MBBI, DL, FPReg, SPReg,
986-
StackOffset::getFixed(RealStackSize - RVFI->getVarArgsSaveSize()),
987-
MachineInstr::FrameSetup, getStackAlign());
984+
// Xqxxmp with hasFP will update FP using `qc.cm.pushfp`, so we don't need
985+
// to update it again, but we do need to emit the `.cfi_def_cfa` below.
986+
if (RVFI->getPushPopKind(MF) != RISCVMachineFunctionInfo::PushPopKind::VendorXqccmp) {
987+
RI->adjustReg(MBB, MBBI, DL, FPReg, SPReg,
988+
StackOffset::getFixed(RealStackSize - RVFI->getVarArgsSaveSize()),
989+
MachineInstr::FrameSetup, getStackAlign());
990+
}
988991

989992
// Emit ".cfi_def_cfa $fp, RVFI->getVarArgsSaveSize()"
990993
unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::cfiDefCfa(

llvm/test/CodeGen/RISCV/xqccmp-callee-saved-gprs.ll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ define void @callee() {
128128
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_offset s9, -44
129129
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_offset s10, -48
130130
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_offset s11, -52
131+
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 0
131132
; RV32IXQCCMP-WITH-FP-NEXT: lui t1, %hi(var)
132133
; RV32IXQCCMP-WITH-FP-NEXT: lw a0, %lo(var)(t1)
133134
; RV32IXQCCMP-WITH-FP-NEXT: sw a0, -56(s0) # 4-byte Folded Spill
@@ -325,6 +326,7 @@ define void @callee() {
325326
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_offset s9, -88
326327
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_offset s10, -96
327328
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_offset s11, -104
329+
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 0
328330
; RV64IXQCCMP-WITH-FP-NEXT: lui t1, %hi(var)
329331
; RV64IXQCCMP-WITH-FP-NEXT: lw a0, %lo(var)(t1)
330332
; RV64IXQCCMP-WITH-FP-NEXT: sd a0, -112(s0) # 8-byte Folded Spill
@@ -569,6 +571,7 @@ define void @caller() {
569571
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_offset s11, -52
570572
; RV32IXQCCMP-WITH-FP-NEXT: addi sp, sp, -32
571573
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_def_cfa_offset 144
574+
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 0
572575
; RV32IXQCCMP-WITH-FP-NEXT: lui s6, %hi(var)
573576
; RV32IXQCCMP-WITH-FP-NEXT: lw a0, %lo(var)(s6)
574577
; RV32IXQCCMP-WITH-FP-NEXT: sw a0, -56(s0) # 4-byte Folded Spill
@@ -840,6 +843,7 @@ define void @caller() {
840843
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_offset s11, -104
841844
; RV64IXQCCMP-WITH-FP-NEXT: addi sp, sp, -128
842845
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_def_cfa_offset 288
846+
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 0
843847
; RV64IXQCCMP-WITH-FP-NEXT: lui s6, %hi(var)
844848
; RV64IXQCCMP-WITH-FP-NEXT: lw a0, %lo(var)(s6)
845849
; RV64IXQCCMP-WITH-FP-NEXT: sd a0, -112(s0) # 8-byte Folded Spill
@@ -983,6 +987,7 @@ define void @foo() {
983987
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_offset ra, -4
984988
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_offset s0, -8
985989
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_offset s4, -24
990+
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 0
986991
; RV32IXQCCMP-WITH-FP-NEXT: #APP
987992
; RV32IXQCCMP-WITH-FP-NEXT: li s4, 0
988993
; RV32IXQCCMP-WITH-FP-NEXT: #NO_APP
@@ -1006,6 +1011,7 @@ define void @foo() {
10061011
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_offset ra, -8
10071012
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_offset s0, -16
10081013
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_offset s4, -48
1014+
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 0
10091015
; RV64IXQCCMP-WITH-FP-NEXT: #APP
10101016
; RV64IXQCCMP-WITH-FP-NEXT: li s4, 0
10111017
; RV64IXQCCMP-WITH-FP-NEXT: #NO_APP
@@ -1035,6 +1041,7 @@ define void @bar() {
10351041
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_offset ra, -4
10361042
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_offset s0, -8
10371043
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_offset s11, -52
1044+
; RV32IXQCCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 0
10381045
; RV32IXQCCMP-WITH-FP-NEXT: #APP
10391046
; RV32IXQCCMP-WITH-FP-NEXT: li s11, 0
10401047
; RV32IXQCCMP-WITH-FP-NEXT: #NO_APP
@@ -1058,6 +1065,7 @@ define void @bar() {
10581065
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_offset ra, -8
10591066
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_offset s0, -16
10601067
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_offset s11, -104
1068+
; RV64IXQCCMP-WITH-FP-NEXT: .cfi_def_cfa s0, 0
10611069
; RV64IXQCCMP-WITH-FP-NEXT: #APP
10621070
; RV64IXQCCMP-WITH-FP-NEXT: li s11, 0
10631071
; RV64IXQCCMP-WITH-FP-NEXT: #NO_APP

0 commit comments

Comments
 (0)