diff --git a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp @@ -749,9 +749,12 @@ // RVV->getRVVPadding() and it can be zero. It allows us to align the RVV // objects to 8 bytes. if (MFI.getStackID(FI) == TargetStackID::Default) { - Offset += StackOffset::getFixed(MFI.getStackSize()); - if (FI < 0) - Offset += StackOffset::getFixed(RVFI->getLibCallStackSize()); + if (MFI.isFixedObjectIndex(FI)) { + Offset += StackOffset::get(MFI.getStackSize() + RVFI->getRVVPadding() + + RVFI->getLibCallStackSize(), RVFI->getRVVStackSize()); + } else { + Offset += StackOffset::getFixed(MFI.getStackSize()); + } } else if (MFI.getStackID(FI) == TargetStackID::ScalableVector) { Offset += StackOffset::get( alignTo(MFI.getStackSize() - RVFI->getCalleeSavedStackSize(), 8), diff --git a/llvm/test/CodeGen/RISCV/rvv/localvar.ll b/llvm/test/CodeGen/RISCV/rvv/localvar.ll --- a/llvm/test/CodeGen/RISCV/rvv/localvar.ll +++ b/llvm/test/CodeGen/RISCV/rvv/localvar.ll @@ -294,7 +294,10 @@ ; RV64IV-NEXT: csrr a0, vlenb ; RV64IV-NEXT: slli a0, a0, 3 ; RV64IV-NEXT: sub sp, sp, a0 -; RV64IV-NEXT: ld a0, 32(sp) +; RV64IV-NEXT: csrr a0, vlenb +; RV64IV-NEXT: slli a0, a0, 3 +; RV64IV-NEXT: add a0, sp, a0 +; RV64IV-NEXT: ld a0, 32(a0) ; RV64IV-NEXT: csrr a1, vlenb ; RV64IV-NEXT: slli a1, a1, 3 ; RV64IV-NEXT: add sp, sp, a1