Skip to content

Commit 7931bae

Browse files
committed
[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.
1 parent 7e312c3 commit 7931bae

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

llvm/lib/Target/RISCV/RISCVFrameLowering.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1610,6 +1610,8 @@ bool RISCVFrameLowering::assignCalleeSavedSpillSlots(
16101610
int FrameIdx = MFI.CreateFixedSpillStackObject(Size, Offset);
16111611
assert(FrameIdx < 0);
16121612
CS.setFrameIdx(FrameIdx);
1613+
if (RISCVRegisterInfo::isRVVRegClass(RC))
1614+
MFI.setStackID(FrameIdx, TargetStackID::ScalableVector);
16131615
continue;
16141616
}
16151617
}
@@ -1626,6 +1628,8 @@ bool RISCVFrameLowering::assignCalleeSavedSpillSlots(
16261628
if ((unsigned)FrameIdx > MaxCSFrameIndex)
16271629
MaxCSFrameIndex = FrameIdx;
16281630
CS.setFrameIdx(FrameIdx);
1631+
if (RISCVRegisterInfo::isRVVRegClass(RC))
1632+
MFI.setStackID(FrameIdx, TargetStackID::ScalableVector);
16291633
}
16301634

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

0 commit comments

Comments
 (0)