[llvm] c3028a2 - [RISCV] Don't exlude the frame pointer from the callee saved registers in RISCVRegisterInfo::needsFrameBaseReg.
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Mon May 13 12:59:47 PDT 2024
Author: Craig Topper
Date: 2024-05-13T12:58:30-07:00
New Revision: c3028a230557405b0f10bdd7d450f7f92747bbe3
URL: https://github.com/llvm/llvm-project/commit/c3028a230557405b0f10bdd7d450f7f92747bbe3
DIFF: https://github.com/llvm/llvm-project/commit/c3028a230557405b0f10bdd7d450f7f92747bbe3.diff
LOG: [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.
Added:
Modified:
llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp
llvm/test/CodeGen/RISCV/local-stack-slot-allocation.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp b/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp
index c3281e409653b..7ac73b59f36c7 100644
--- a/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp
@@ -609,13 +609,13 @@ bool RISCVRegisterInfo::needsFrameBaseReg(MachineInstr *MI,
const MachineRegisterInfo &MRI = MF.getRegInfo();
if (TFI->hasFP(MF) && !shouldRealignStack(MF)) {
+ auto &Subtarget = MF.getSubtarget<RISCVSubtarget>();
// Estimate the stack size used to store callee saved registers(
// excludes reserved registers).
unsigned CalleeSavedSize = 0;
- BitVector ReservedRegs = getReservedRegs(MF);
for (const MCPhysReg *R = MRI.getCalleeSavedRegs(); MCPhysReg Reg = *R;
++R) {
- if (!ReservedRegs.test(Reg))
+ if (!Subtarget.isRegisterReservedByUser(Reg))
CalleeSavedSize += getSpillSize(*getMinimalPhysRegClass(Reg));
}
diff --git a/llvm/test/CodeGen/RISCV/local-stack-slot-allocation.ll b/llvm/test/CodeGen/RISCV/local-stack-slot-allocation.ll
index 18e7992f30a3e..1d5487e19e894 100644
--- a/llvm/test/CodeGen/RISCV/local-stack-slot-allocation.ll
+++ b/llvm/test/CodeGen/RISCV/local-stack-slot-allocation.ll
@@ -111,3 +111,50 @@ define void @load_with_offset2() {
store volatile i8 %load, ptr %va_gep, align 4
ret void
}
+
+define void @frame_pointer() "frame-pointer"="all" {
+; RV32I-LABEL: frame_pointer:
+; RV32I: # %bb.0:
+; RV32I-NEXT: addi sp, sp, -2032
+; RV32I-NEXT: .cfi_def_cfa_offset 2032
+; RV32I-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s0, 2024(sp) # 4-byte Folded Spill
+; RV32I-NEXT: .cfi_offset ra, -4
+; RV32I-NEXT: .cfi_offset s0, -8
+; RV32I-NEXT: addi s0, sp, 2032
+; RV32I-NEXT: .cfi_def_cfa s0, 0
+; RV32I-NEXT: addi sp, sp, -480
+; RV32I-NEXT: lbu a0, -1960(s0)
+; RV32I-NEXT: sb a0, -1960(s0)
+; RV32I-NEXT: addi sp, sp, 480
+; RV32I-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s0, 2024(sp) # 4-byte Folded Reload
+; RV32I-NEXT: addi sp, sp, 2032
+; RV32I-NEXT: ret
+;
+; RV64I-LABEL: frame_pointer:
+; RV64I: # %bb.0:
+; RV64I-NEXT: addi sp, sp, -2032
+; RV64I-NEXT: .cfi_def_cfa_offset 2032
+; RV64I-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill
+; RV64I-NEXT: sd s0, 2016(sp) # 8-byte Folded Spill
+; RV64I-NEXT: .cfi_offset ra, -8
+; RV64I-NEXT: .cfi_offset s0, -16
+; RV64I-NEXT: addi s0, sp, 2032
+; RV64I-NEXT: .cfi_def_cfa s0, 0
+; RV64I-NEXT: addi sp, sp, -496
+; RV64I-NEXT: addi a0, s0, -1972
+; RV64I-NEXT: lbu a1, 0(a0)
+; RV64I-NEXT: sb a1, 0(a0)
+; RV64I-NEXT: addi sp, sp, 496
+; RV64I-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload
+; RV64I-NEXT: ld s0, 2016(sp) # 8-byte Folded Reload
+; RV64I-NEXT: addi sp, sp, 2032
+; RV64I-NEXT: ret
+
+ %va = alloca [2500 x i8], align 4
+ %va_gep = getelementptr [2000 x i8], ptr %va, i64 0, i64 552
+ %load = load volatile i8, ptr %va_gep, align 4
+ store volatile i8 %load, ptr %va_gep, align 4
+ ret void
+}
More information about the llvm-commits
mailing list