Skip to content

Commit c3028a2

Browse files
committed
[RISCV] Don't exlude the frame pointer from the callee saved registers in RISCVRegisterInfo::needsFrameBaseReg.
Instead of using getReservedRegs, just check the subtarget reserved list. getReservedRegs considers the frame pointer to be reserved when it is being used, but we do need to save/restore it so it should be counted as a callee saved register. AArch64 hardcodes their callee saved size, but the comment mentions the Frame Pointer being counted.
1 parent a6d7828 commit c3028a2

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -609,13 +609,13 @@ bool RISCVRegisterInfo::needsFrameBaseReg(MachineInstr *MI,
609609
const MachineRegisterInfo &MRI = MF.getRegInfo();
610610

611611
if (TFI->hasFP(MF) && !shouldRealignStack(MF)) {
612+
auto &Subtarget = MF.getSubtarget<RISCVSubtarget>();
612613
// Estimate the stack size used to store callee saved registers(
613614
// excludes reserved registers).
614615
unsigned CalleeSavedSize = 0;
615-
BitVector ReservedRegs = getReservedRegs(MF);
616616
for (const MCPhysReg *R = MRI.getCalleeSavedRegs(); MCPhysReg Reg = *R;
617617
++R) {
618-
if (!ReservedRegs.test(Reg))
618+
if (!Subtarget.isRegisterReservedByUser(Reg))
619619
CalleeSavedSize += getSpillSize(*getMinimalPhysRegClass(Reg));
620620
}
621621

llvm/test/CodeGen/RISCV/local-stack-slot-allocation.ll

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,50 @@ define void @load_with_offset2() {
111111
store volatile i8 %load, ptr %va_gep, align 4
112112
ret void
113113
}
114+
115+
define void @frame_pointer() "frame-pointer"="all" {
116+
; RV32I-LABEL: frame_pointer:
117+
; RV32I: # %bb.0:
118+
; RV32I-NEXT: addi sp, sp, -2032
119+
; RV32I-NEXT: .cfi_def_cfa_offset 2032
120+
; RV32I-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill
121+
; RV32I-NEXT: sw s0, 2024(sp) # 4-byte Folded Spill
122+
; RV32I-NEXT: .cfi_offset ra, -4
123+
; RV32I-NEXT: .cfi_offset s0, -8
124+
; RV32I-NEXT: addi s0, sp, 2032
125+
; RV32I-NEXT: .cfi_def_cfa s0, 0
126+
; RV32I-NEXT: addi sp, sp, -480
127+
; RV32I-NEXT: lbu a0, -1960(s0)
128+
; RV32I-NEXT: sb a0, -1960(s0)
129+
; RV32I-NEXT: addi sp, sp, 480
130+
; RV32I-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload
131+
; RV32I-NEXT: lw s0, 2024(sp) # 4-byte Folded Reload
132+
; RV32I-NEXT: addi sp, sp, 2032
133+
; RV32I-NEXT: ret
134+
;
135+
; RV64I-LABEL: frame_pointer:
136+
; RV64I: # %bb.0:
137+
; RV64I-NEXT: addi sp, sp, -2032
138+
; RV64I-NEXT: .cfi_def_cfa_offset 2032
139+
; RV64I-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill
140+
; RV64I-NEXT: sd s0, 2016(sp) # 8-byte Folded Spill
141+
; RV64I-NEXT: .cfi_offset ra, -8
142+
; RV64I-NEXT: .cfi_offset s0, -16
143+
; RV64I-NEXT: addi s0, sp, 2032
144+
; RV64I-NEXT: .cfi_def_cfa s0, 0
145+
; RV64I-NEXT: addi sp, sp, -496
146+
; RV64I-NEXT: addi a0, s0, -1972
147+
; RV64I-NEXT: lbu a1, 0(a0)
148+
; RV64I-NEXT: sb a1, 0(a0)
149+
; RV64I-NEXT: addi sp, sp, 496
150+
; RV64I-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload
151+
; RV64I-NEXT: ld s0, 2016(sp) # 8-byte Folded Reload
152+
; RV64I-NEXT: addi sp, sp, 2032
153+
; RV64I-NEXT: ret
154+
155+
%va = alloca [2500 x i8], align 4
156+
%va_gep = getelementptr [2000 x i8], ptr %va, i64 0, i64 552
157+
%load = load volatile i8, ptr %va_gep, align 4
158+
store volatile i8 %load, ptr %va_gep, align 4
159+
ret void
160+
}

0 commit comments

Comments
 (0)