Skip to content

Commit 5fc8062

Browse files
authored
[llvm][RISCV] Set ScalableVector stack id in proper place (#117862)
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.
1 parent 1d4453a commit 5fc8062

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

llvm/lib/Target/RISCV/RISCVFrameLowering.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1727,6 +1727,8 @@ bool RISCVFrameLowering::assignCalleeSavedSpillSlots(
17271727
if ((unsigned)FrameIdx > MaxCSFrameIndex)
17281728
MaxCSFrameIndex = FrameIdx;
17291729
CS.setFrameIdx(FrameIdx);
1730+
if (RISCVRegisterInfo::isRVVRegClass(RC))
1731+
MFI.setStackID(FrameIdx, TargetStackID::ScalableVector);
17301732
}
17311733

17321734
// Allocate a fixed object that covers the full push or libcall size.

0 commit comments

Comments
 (0)