From 06e2b44c46243a74ba5682aa3225d79e45038651 Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Fri, 18 Nov 2022 15:30:39 -0800 Subject: [PATCH] [RISCV] Optimize scalable frame setup when VLEN is precisely known If we know the exact value of VLEN, the frame offset adjustment for scalable stack slots becomes a fixed constant. This avoids the need to read vlenb, and may allow the offset to be folded into the immediate field of an add/sub. We could go further here, and fold the offset into a single larger frame adjustment - instead of having a separate scalable adjustment step - but that requires a bit more code reorganization. I may (or may not) return to that in a future patch. Differential Revision: https://reviews.llvm.org/D137593 --- llvm/lib/Target/RISCV/RISCVFrameLowering.cpp | 19 ++++++++++++++++++- llvm/test/CodeGen/RISCV/rvv/rv64-spill-vector-csr.ll | 8 ++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp index b7aefe1..4f79339 100644 --- a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp @@ -373,7 +373,24 @@ void RISCVFrameLowering::adjustStackForRVV(MachineFunction &MF, assert(Amount != 0 && "Did not need to adjust stack pointer for RVV."); const RISCVInstrInfo *TII = STI.getInstrInfo(); - Register SPReg = getSPReg(STI); + const Register SPReg = getSPReg(STI); + + // Optimize compile time offset case + if (STI.getRealMinVLen() == STI.getRealMaxVLen()) { + // 1. Multiply the number of v-slots by the (constant) length of register + const int64_t VLENB = STI.getRealMinVLen() / 8; + assert(Amount % 8 == 0 && + "Reserve the stack by the multiple of one vector size."); + const int64_t NumOfVReg = Amount / 8; + const int64_t Offset = NumOfVReg * VLENB; + if (!isInt<32>(Offset)) { + report_fatal_error( + "Frame size outside of the signed 32-bit range not supported"); + } + adjustReg(MBB, MBBI, DL, SPReg, SPReg, Offset, Flag); + return; + } + unsigned Opc = RISCV::ADD; if (Amount < 0) { Amount = -Amount; diff --git a/llvm/test/CodeGen/RISCV/rvv/rv64-spill-vector-csr.ll b/llvm/test/CodeGen/RISCV/rvv/rv64-spill-vector-csr.ll index d640e22..23e8277 100644 --- a/llvm/test/CodeGen/RISCV/rvv/rv64-spill-vector-csr.ll +++ b/llvm/test/CodeGen/RISCV/rvv/rv64-spill-vector-csr.ll @@ -87,9 +87,7 @@ define @foo( %a, @foo( %a,