Skip to content

Commit ca111b7

Browse files
committed
Fixups
1 parent c5b7871 commit ca111b7

File tree

1 file changed

+28
-30
lines changed

1 file changed

+28
-30
lines changed

llvm/lib/Target/AArch64/AArch64FrameLowering.cpp

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4185,8 +4185,8 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF,
41854185
// If any callee-saved registers are used, the frame cannot be eliminated.
41864186
auto [ZPRLocalStackSize, PPRLocalStackSize] =
41874187
determineSVEStackSizes(MF, AssignObjectOffsets::No);
4188-
int64_t SVELocals = ZPRLocalStackSize + PPRLocalStackSize;
4189-
int64_t SVEStackSize =
4188+
uint64_t SVELocals = ZPRLocalStackSize + PPRLocalStackSize;
4189+
uint64_t SVEStackSize =
41904190
alignTo(ZPRCSStackSize + PPRCSStackSize + SVELocals, 16);
41914191
bool CanEliminateFrame = (SavedRegs.count() == 0) && !SVEStackSize;
41924192

@@ -4441,28 +4441,37 @@ static SVEStackSizes determineSVEStackSizes(MachineFunction &MF,
44414441
"reference.");
44424442
#endif
44434443

4444-
auto StackForObject = [&](int FI, uint64_t &ZPRStackTop,
4445-
uint64_t &PPRStackTop) -> uint64_t & {
4446-
return MFI.getStackID(FI) == TargetStackID::ScalableVector ? ZPRStackTop
4447-
: PPRStackTop;
4448-
};
4444+
auto AllocateObject = [&](int FI) {
4445+
uint64_t &StackTop = MFI.getStackID(FI) == TargetStackID::ScalableVector
4446+
? ZPRStackTop
4447+
: PPRStackTop;
4448+
4449+
// FIXME: Given that the length of SVE vectors is not necessarily a power of
4450+
// two, we'd need to align every object dynamically at runtime if the
4451+
// alignment is larger than 16. This is not yet supported.
4452+
Align Alignment = MFI.getObjectAlign(FI);
4453+
if (Alignment > Align(16))
4454+
report_fatal_error(
4455+
"Alignment of scalable vectors > 16 bytes is not yet supported");
4456+
4457+
StackTop += MFI.getObjectSize(FI);
4458+
StackTop = alignTo(StackTop, Alignment);
4459+
4460+
assert(StackTop < std::numeric_limits<int64_t>::max() &&
4461+
"SVE StackTop far too large?!");
4462+
4463+
int64_t Offset = -int64_t(StackTop);
4464+
if (AssignOffsets == AssignObjectOffsets::Yes)
4465+
MFI.setObjectOffset(FI, Offset);
44494466

4450-
auto Assign = [&MFI, AssignOffsets](int FI, int64_t Offset) {
4451-
if (AssignOffsets == AssignObjectOffsets::No)
4452-
return;
44534467
LLVM_DEBUG(dbgs() << "alloc FI(" << FI << ") at SP[" << Offset << "]\n");
4454-
MFI.setObjectOffset(FI, Offset);
44554468
};
44564469

44574470
// Then process all callee saved slots.
44584471
int MinCSFrameIndex, MaxCSFrameIndex;
44594472
if (getSVECalleeSaveSlotRange(MFI, MinCSFrameIndex, MaxCSFrameIndex)) {
4460-
for (int FI = MinCSFrameIndex; FI <= MaxCSFrameIndex; ++FI) {
4461-
uint64_t &StackTop = StackForObject(FI, ZPRStackTop, PPRStackTop);
4462-
StackTop += MFI.getObjectSize(FI);
4463-
StackTop = alignTo(StackTop, MFI.getObjectAlign(FI));
4464-
Assign(FI, -int64_t(StackTop));
4465-
}
4473+
for (int FI = MinCSFrameIndex; FI <= MaxCSFrameIndex; ++FI)
4474+
AllocateObject(FI);
44664475
}
44674476

44684477
// Ensure the CS area is 16-byte aligned.
@@ -4495,19 +4504,8 @@ static SVEStackSizes determineSVEStackSizes(MachineFunction &MF,
44954504
}
44964505

44974506
// Allocate all SVE locals and spills
4498-
for (unsigned FI : ObjectsToAllocate) {
4499-
Align Alignment = MFI.getObjectAlign(FI);
4500-
// FIXME: Given that the length of SVE vectors is not necessarily a power of
4501-
// two, we'd need to align every object dynamically at runtime if the
4502-
// alignment is larger than 16. This is not yet supported.
4503-
if (Alignment > Align(16))
4504-
report_fatal_error(
4505-
"Alignment of scalable vectors > 16 bytes is not yet supported");
4506-
4507-
uint64_t &StackTop = StackForObject(FI, ZPRStackTop, PPRStackTop);
4508-
StackTop = alignTo(StackTop + MFI.getObjectSize(FI), Alignment);
4509-
Assign(FI, -int64_t(StackTop));
4510-
}
4507+
for (unsigned FI : ObjectsToAllocate)
4508+
AllocateObject(FI);
45114509

45124510
PPRStackTop = alignTo(PPRStackTop, Align(16U));
45134511
ZPRStackTop = alignTo(ZPRStackTop, Align(16U));

0 commit comments

Comments
 (0)