diff --git a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp index 8bac41372b5a8..39f2b3f62a9a0 100644 --- a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp @@ -554,8 +554,10 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF, if (RVFI->isPushable(MF) && FirstFrameSetup != MBB.end() && FirstFrameSetup->getOpcode() == RISCV::CM_PUSH) { // Use available stack adjustment in push instruction to allocate additional - // stack space. - uint64_t Spimm = std::min(StackSize, (uint64_t)48); + // stack space. Align the stack size down to a multiple of 16. This is + // needed for RVE. + // FIXME: Can we increase the stack size to a multiple of 16 instead? + uint64_t Spimm = std::min(alignDown(StackSize, 16), (uint64_t)48); FirstFrameSetup->getOperand(1).setImm(Spimm); StackSize -= Spimm; } @@ -776,8 +778,10 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF, if (RVFI->isPushable(MF) && MBBI != MBB.end() && MBBI->getOpcode() == RISCV::CM_POP) { // Use available stack adjustment in pop instruction to deallocate stack - // space. - uint64_t Spimm = std::min(StackSize, (uint64_t)48); + // space. Align the stack size down to a multiple of 16. This is needed for + // RVE. + // FIXME: Can we increase the stack size to a multiple of 16 instead? + uint64_t Spimm = std::min(alignDown(StackSize, 16), (uint64_t)48); MBBI->getOperand(1).setImm(Spimm); StackSize -= Spimm; } diff --git a/llvm/test/CodeGen/RISCV/zcmp-additional-stack.ll b/llvm/test/CodeGen/RISCV/zcmp-additional-stack.ll index e5c2e0180ee0a..73ace20339850 100644 --- a/llvm/test/CodeGen/RISCV/zcmp-additional-stack.ll +++ b/llvm/test/CodeGen/RISCV/zcmp-additional-stack.ll @@ -3,7 +3,8 @@ define ptr @func(ptr %s, i32 %_c, ptr %incdec.ptr, i1 %0, i8 %conv14) #0 { ; RV32-LABEL: func: ; RV32: # %bb.0: # %entry -; RV32-NEXT: cm.push {ra, s0-s1}, -24 +; RV32-NEXT: cm.push {ra, s0-s1}, -16 +; RV32-NEXT: addi sp, sp, -8 ; RV32-NEXT: .cfi_def_cfa_offset 24 ; RV32-NEXT: .cfi_offset ra, -12 ; RV32-NEXT: .cfi_offset s0, -8 @@ -31,7 +32,8 @@ define ptr @func(ptr %s, i32 %_c, ptr %incdec.ptr, i1 %0, i8 %conv14) #0 { ; RV32-NEXT: lw a0, 4(sp) # 4-byte Folded Reload ; RV32-NEXT: sb a0, 0(s0) ; RV32-NEXT: mv a0, s1 -; RV32-NEXT: cm.popret {ra, s0-s1}, 24 +; RV32-NEXT: addi sp, sp, 8 +; RV32-NEXT: cm.popret {ra, s0-s1}, 16 entry: br label %while.body