From 9c93dd29bcee6299ab5c9ae42b5d187c6bb15be9 Mon Sep 17 00:00:00 2001 From: ens-sc Date: Mon, 11 Nov 2024 12:18:55 +0300 Subject: [PATCH 1/2] [llvm] Set ScalableVector stack id in proper place Without this patch ScalableVector frame index property is used before assignment. More precisely, let's take a look at RISCVFrameLowering::assignCalleeSavedSpillSlots. In this function we divide callee saved registers on scalar and vector ones, based on ScalableVector property of their frame indexes: ``` ... const auto &UnmanagedCSI = getUnmanagedCSI(*MF, CSI); const auto &RVVCSI = getRVVCalleeSavedInfo(*MF, CSI); ... ``` But we assign ScalableVector property several lines below: ``` ... auto storeRegToStackSlot = [&](decltype(UnmanagedCSI) CSInfo) { for (auto &CS : CSInfo) { // Insert the spill to the stack frame. Register Reg = CS.getReg(); const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg); TII.storeRegToStackSlot(MBB, MI, Reg, !MBB.isLiveIn(Reg), CS.getFrameIdx(), RC, TRI, Register()); } }; storeRegToStackSlot(UnmanagedCSI); ... ``` Due to it, list of RVV callee saved registers will always be empty. Currently this problem doesn't appear, but if you slightly change the code and, for example, put some instructions between scalar and vector spills, the resulting code will be ill formed. --- llvm/lib/Target/RISCV/RISCVFrameLowering.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp index deb0b627225c6..0de1f1d821a6e 100644 --- a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp @@ -1607,6 +1607,8 @@ bool RISCVFrameLowering::assignCalleeSavedSpillSlots( int FrameIdx = MFI.CreateFixedSpillStackObject(Size, Offset); assert(FrameIdx < 0); CS.setFrameIdx(FrameIdx); + if (RISCVRegisterInfo::isRVVRegClass(RC)) + MFI.setStackID(FrameIdx, TargetStackID::ScalableVector); continue; } } @@ -1623,6 +1625,8 @@ bool RISCVFrameLowering::assignCalleeSavedSpillSlots( if ((unsigned)FrameIdx > MaxCSFrameIndex) MaxCSFrameIndex = FrameIdx; CS.setFrameIdx(FrameIdx); + if (RISCVRegisterInfo::isRVVRegClass(RC)) + MFI.setStackID(FrameIdx, TargetStackID::ScalableVector); } // Allocate a fixed object that covers the full push or libcall size. From aed8c91718c2b13005a29e3b2f23ad69838a4f1b Mon Sep 17 00:00:00 2001 From: ens-sc Date: Wed, 11 Dec 2024 12:50:50 +0300 Subject: [PATCH 2/2] remove unnecessary check --- llvm/lib/Target/RISCV/RISCVFrameLowering.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp index 0de1f1d821a6e..b5b01afb0692d 100644 --- a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp @@ -1607,8 +1607,6 @@ bool RISCVFrameLowering::assignCalleeSavedSpillSlots( int FrameIdx = MFI.CreateFixedSpillStackObject(Size, Offset); assert(FrameIdx < 0); CS.setFrameIdx(FrameIdx); - if (RISCVRegisterInfo::isRVVRegClass(RC)) - MFI.setStackID(FrameIdx, TargetStackID::ScalableVector); continue; } }