[llvm] [PEI] Materialize registers before calling insertZeroCallUsedRegs (PR #214147)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 5 00:34:57 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-risc-v
Author: Lucas Chollet (LucasChollet)
<details>
<summary>Changes</summary>
As insertZeroCallUsedRegs only supports physical registers, force the materialization of any virtual registers by calling scavengeFrameVirtualRegs.
Virtual registers can be added during the pass by
emit{Prologue,Epilogue}. For example, RISC-V uses a virtual register to store the size of a large alloca.
---
Full diff: https://github.com/llvm/llvm-project/pull/214147.diff
2 Files Affected:
- (modified) llvm/lib/CodeGen/PrologEpilogInserter.cpp (+5)
- (modified) llvm/test/CodeGen/RISCV/zero-call-used-regs.ll (+17)
``````````diff
diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp
index 4cfce20465e21..20ccaedd1f5c8 100644
--- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp
+++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp
@@ -1166,6 +1166,7 @@ void PEIImpl::calculateFrameObjectOffsets(MachineFunction &MF) {
/// prolog and epilog code to the function.
void PEIImpl::insertPrologEpilogCode(MachineFunction &MF) {
const TargetFrameLowering &TFI = *MF.getSubtarget().getFrameLowering();
+ const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
// Add prologue to the function...
for (MachineBasicBlock *SaveBlock : SaveBlocks)
@@ -1175,6 +1176,10 @@ void PEIImpl::insertPrologEpilogCode(MachineFunction &MF) {
for (MachineBasicBlock *RestoreBlock : RestoreBlocks)
TFI.emitEpilogue(MF, *RestoreBlock);
+ // Force the materialization of any virtual registers as insertZeroCallRegs
+ // only handles physical registers.
+ if (TRI.requiresRegisterScavenging(MF) && FrameIndexVirtualScavenging)
+ scavengeFrameVirtualRegs(MF, *RS);
// Zero call used registers before restoring callee-saved registers.
insertZeroCallUsedRegs(MF);
diff --git a/llvm/test/CodeGen/RISCV/zero-call-used-regs.ll b/llvm/test/CodeGen/RISCV/zero-call-used-regs.ll
index 46b0cba76194b..78198b4876cd5 100644
--- a/llvm/test/CodeGen/RISCV/zero-call-used-regs.ll
+++ b/llvm/test/CodeGen/RISCV/zero-call-used-regs.ll
@@ -335,5 +335,22 @@ entry:
ret double %mul2
}
+define void @huge_stack() #0 "zero-call-used-regs"="used-gpr" {
+; CHECK-LABEL: huge_stack:
+; CHECK: # %bb.0:
+; CHECK-NEXT: lui a0, 10
+; CHECK-NEXT: addi a0, a0, -944
+; CHECK-NEXT: sub sp, sp, a0
+; CHECK-NEXT: .cfi_def_cfa_offset 40016
+; CHECK-NEXT: lui a0, 10
+; CHECK-NEXT: addi a0, a0, -944
+; CHECK-NEXT: add sp, sp, a0
+; CHECK-NEXT: .cfi_def_cfa_offset 0
+; CHECK-NEXT: li a0, 0
+; CHECK-NEXT: ret
+ %1 = alloca [10000 x i32], align 4
+ ret void
+}
+
attributes #0 = { "target-cpu"="generic" "target-features"="+m,+f,+d" }
attributes #1 = { "target-cpu"="generic" "target-features"="+m,+zdinx" }
``````````
</details>
https://github.com/llvm/llvm-project/pull/214147
More information about the llvm-commits
mailing list