Skip to content

Commit 71d85ca

Browse files
authored
[RISCV][CFI] Emit cfi_offset for every callee-saved vector registers (#100455)
The grouped vector register is modeled as a single register, e.g. V2M2, which is actually V2 and V3. We need to decompose the grouped vector register(if any) to individual vector register when emitting CFIs in prologue. Fixed #94500
1 parent ad8cc88 commit 71d85ca

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

llvm/lib/Target/RISCV/RISCVFrameLowering.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1535,6 +1535,7 @@ void RISCVFrameLowering::emitCalleeSavedRVVPrologCFI(
15351535
const MachineFrameInfo &MFI = MF->getFrameInfo();
15361536
RISCVMachineFunctionInfo *RVFI = MF->getInfo<RISCVMachineFunctionInfo>();
15371537
const TargetInstrInfo &TII = *STI.getInstrInfo();
1538+
const RISCVRegisterInfo &TRI = *STI.getRegisterInfo();
15381539
DebugLoc DL = MBB.findDebugLoc(MI);
15391540

15401541
const auto &RVVCSI = getRVVCalleeSavedInfo(*MF, MFI.getCalleeSavedInfo());
@@ -1554,12 +1555,22 @@ void RISCVFrameLowering::emitCalleeSavedRVVPrologCFI(
15541555
// Insert the spill to the stack frame.
15551556
int FI = CS.getFrameIdx();
15561557
if (FI >= 0 && MFI.getStackID(FI) == TargetStackID::ScalableVector) {
1557-
unsigned CFIIndex = MF->addFrameInst(
1558-
createDefCFAOffset(*STI.getRegisterInfo(), CS.getReg(), -FixedSize,
1559-
MFI.getObjectOffset(FI) / 8));
1560-
BuildMI(MBB, MI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
1561-
.addCFIIndex(CFIIndex)
1562-
.setMIFlag(MachineInstr::FrameSetup);
1558+
MCRegister BaseReg = TRI.getSubReg(CS.getReg(), RISCV::sub_vrm1_0);
1559+
// If it's not a grouped vector register, it doesn't have subregister, so
1560+
// the base register is just itself.
1561+
if (BaseReg == RISCV::NoRegister)
1562+
BaseReg = CS.getReg();
1563+
unsigned NumRegs = RISCV::VRRegClass.contains(CS.getReg()) ? 1
1564+
: RISCV::VRM2RegClass.contains(CS.getReg()) ? 2
1565+
: RISCV::VRM4RegClass.contains(CS.getReg()) ? 4
1566+
: 8;
1567+
for (unsigned i = 0; i < NumRegs; ++i) {
1568+
unsigned CFIIndex = MF->addFrameInst(createDefCFAOffset(
1569+
TRI, BaseReg + i, -FixedSize, MFI.getObjectOffset(FI) / 8 + i));
1570+
BuildMI(MBB, MI, DL, TII.get(TargetOpcode::CFI_INSTRUCTION))
1571+
.addCFIIndex(CFIIndex)
1572+
.setMIFlag(MachineInstr::FrameSetup);
1573+
}
15631574
}
15641575
}
15651576
}

llvm/test/CodeGen/RISCV/rvv-cfi-info.ll

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,12 @@ define riscv_vector_cc <vscale x 1 x i32> @test_vector_callee_cfi(<vscale x 1 x
2727
; OMIT-FP-NEXT: addi a0, sp, 16
2828
; OMIT-FP-NEXT: vs4r.v v4, (a0) # Unknown-size Folded Spill
2929
; OMIT-FP-NEXT: .cfi_escape 0x10, 0x61, 0x08, 0x11, 0x7e, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v1 @ cfa - 2 * vlenb
30-
; OMIT-FP-NEXT: .cfi_escape 0x10, 0x62, 0x08, 0x11, 0x7c, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v2m2 @ cfa - 4 * vlenb
31-
; OMIT-FP-NEXT: .cfi_escape 0x10, 0x64, 0x08, 0x11, 0x78, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v4m4 @ cfa - 8 * vlenb
30+
; OMIT-FP-NEXT: .cfi_escape 0x10, 0x62, 0x08, 0x11, 0x7c, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v2 @ cfa - 4 * vlenb
31+
; OMIT-FP-NEXT: .cfi_escape 0x10, 0x63, 0x08, 0x11, 0x7d, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v3 @ cfa - 3 * vlenb
32+
; OMIT-FP-NEXT: .cfi_escape 0x10, 0x64, 0x08, 0x11, 0x78, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v4 @ cfa - 8 * vlenb
33+
; OMIT-FP-NEXT: .cfi_escape 0x10, 0x65, 0x08, 0x11, 0x79, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v5 @ cfa - 7 * vlenb
34+
; OMIT-FP-NEXT: .cfi_escape 0x10, 0x66, 0x08, 0x11, 0x7a, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v6 @ cfa - 6 * vlenb
35+
; OMIT-FP-NEXT: .cfi_escape 0x10, 0x67, 0x08, 0x11, 0x7b, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v7 @ cfa - 5 * vlenb
3236
; OMIT-FP-NEXT: #APP
3337
; OMIT-FP-NEXT: #NO_APP
3438
; OMIT-FP-NEXT: csrr a0, vlenb
@@ -79,8 +83,12 @@ define riscv_vector_cc <vscale x 1 x i32> @test_vector_callee_cfi(<vscale x 1 x
7983
; NO-OMIT-FP-NEXT: addi a0, a0, -32
8084
; NO-OMIT-FP-NEXT: vs4r.v v4, (a0) # Unknown-size Folded Spill
8185
; NO-OMIT-FP-NEXT: .cfi_escape 0x10, 0x61, 0x0b, 0x11, 0x60, 0x22, 0x11, 0x7e, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v1 @ cfa - 32 - 2 * vlenb
82-
; NO-OMIT-FP-NEXT: .cfi_escape 0x10, 0x62, 0x0b, 0x11, 0x60, 0x22, 0x11, 0x7c, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v2m2 @ cfa - 32 - 4 * vlenb
83-
; NO-OMIT-FP-NEXT: .cfi_escape 0x10, 0x64, 0x0b, 0x11, 0x60, 0x22, 0x11, 0x78, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v4m4 @ cfa - 32 - 8 * vlenb
86+
; NO-OMIT-FP-NEXT: .cfi_escape 0x10, 0x62, 0x0b, 0x11, 0x60, 0x22, 0x11, 0x7c, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v2 @ cfa - 32 - 4 * vlenb
87+
; NO-OMIT-FP-NEXT: .cfi_escape 0x10, 0x63, 0x0b, 0x11, 0x60, 0x22, 0x11, 0x7d, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v3 @ cfa - 32 - 3 * vlenb
88+
; NO-OMIT-FP-NEXT: .cfi_escape 0x10, 0x64, 0x0b, 0x11, 0x60, 0x22, 0x11, 0x78, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v4 @ cfa - 32 - 8 * vlenb
89+
; NO-OMIT-FP-NEXT: .cfi_escape 0x10, 0x65, 0x0b, 0x11, 0x60, 0x22, 0x11, 0x79, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v5 @ cfa - 32 - 7 * vlenb
90+
; NO-OMIT-FP-NEXT: .cfi_escape 0x10, 0x66, 0x0b, 0x11, 0x60, 0x22, 0x11, 0x7a, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v6 @ cfa - 32 - 6 * vlenb
91+
; NO-OMIT-FP-NEXT: .cfi_escape 0x10, 0x67, 0x0b, 0x11, 0x60, 0x22, 0x11, 0x7b, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # $v7 @ cfa - 32 - 5 * vlenb
8492
; NO-OMIT-FP-NEXT: #APP
8593
; NO-OMIT-FP-NEXT: #NO_APP
8694
; NO-OMIT-FP-NEXT: csrr a0, vlenb

0 commit comments

Comments
 (0)