Skip to content

Commit 2c4b693

Browse files
committed
Fixups
1 parent ef83c9d commit 2c4b693

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
@@ -4126,8 +4126,8 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF,
41264126
// If any callee-saved registers are used, the frame cannot be eliminated.
41274127
auto [ZPRLocalStackSize, PPRLocalStackSize] =
41284128
determineSVEStackSizes(MF, AssignObjectOffsets::No);
4129-
int64_t SVELocals = ZPRLocalStackSize + PPRLocalStackSize;
4130-
int64_t SVEStackSize =
4129+
uint64_t SVELocals = ZPRLocalStackSize + PPRLocalStackSize;
4130+
uint64_t SVEStackSize =
41314131
alignTo(ZPRCSStackSize + PPRCSStackSize + SVELocals, 16);
41324132
bool CanEliminateFrame = (SavedRegs.count() == 0) && !SVEStackSize;
41334133

@@ -4398,28 +4398,37 @@ static SVEStackSizes determineSVEStackSizes(MachineFunction &MF,
43984398
"reference.");
43994399
#endif
44004400

4401-
auto StackForObject = [&](int FI, uint64_t &ZPRStackTop,
4402-
uint64_t &PPRStackTop) -> uint64_t & {
4403-
return MFI.getStackID(FI) == TargetStackID::ScalableVector ? ZPRStackTop
4404-
: PPRStackTop;
4405-
};
4401+
auto AllocateObject = [&](int FI) {
4402+
uint64_t &StackTop = MFI.getStackID(FI) == TargetStackID::ScalableVector
4403+
? ZPRStackTop
4404+
: PPRStackTop;
4405+
4406+
// FIXME: Given that the length of SVE vectors is not necessarily a power of
4407+
// two, we'd need to align every object dynamically at runtime if the
4408+
// alignment is larger than 16. This is not yet supported.
4409+
Align Alignment = MFI.getObjectAlign(FI);
4410+
if (Alignment > Align(16))
4411+
report_fatal_error(
4412+
"Alignment of scalable vectors > 16 bytes is not yet supported");
4413+
4414+
StackTop += MFI.getObjectSize(FI);
4415+
StackTop = alignTo(StackTop, Alignment);
4416+
4417+
assert(StackTop < std::numeric_limits<int64_t>::max() &&
4418+
"SVE StackTop far too large?!");
4419+
4420+
int64_t Offset = -int64_t(StackTop);
4421+
if (AssignOffsets == AssignObjectOffsets::Yes)
4422+
MFI.setObjectOffset(FI, Offset);
44064423

4407-
auto Assign = [&MFI, AssignOffsets](int FI, int64_t Offset) {
4408-
if (AssignOffsets == AssignObjectOffsets::No)
4409-
return;
44104424
LLVM_DEBUG(dbgs() << "alloc FI(" << FI << ") at SP[" << Offset << "]\n");
4411-
MFI.setObjectOffset(FI, Offset);
44124425
};
44134426

44144427
// Then process all callee saved slots.
44154428
int MinCSFrameIndex, MaxCSFrameIndex;
44164429
if (getSVECalleeSaveSlotRange(MFI, MinCSFrameIndex, MaxCSFrameIndex)) {
4417-
for (int FI = MinCSFrameIndex; FI <= MaxCSFrameIndex; ++FI) {
4418-
uint64_t &StackTop = StackForObject(FI, ZPRStackTop, PPRStackTop);
4419-
StackTop += MFI.getObjectSize(FI);
4420-
StackTop = alignTo(StackTop, MFI.getObjectAlign(FI));
4421-
Assign(FI, -int64_t(StackTop));
4422-
}
4430+
for (int FI = MinCSFrameIndex; FI <= MaxCSFrameIndex; ++FI)
4431+
AllocateObject(FI);
44234432
}
44244433

44254434
// Ensure the CS area is 16-byte aligned.
@@ -4452,19 +4461,8 @@ static SVEStackSizes determineSVEStackSizes(MachineFunction &MF,
44524461
}
44534462

44544463
// Allocate all SVE locals and spills
4455-
for (unsigned FI : ObjectsToAllocate) {
4456-
Align Alignment = MFI.getObjectAlign(FI);
4457-
// FIXME: Given that the length of SVE vectors is not necessarily a power of
4458-
// two, we'd need to align every object dynamically at runtime if the
4459-
// alignment is larger than 16. This is not yet supported.
4460-
if (Alignment > Align(16))
4461-
report_fatal_error(
4462-
"Alignment of scalable vectors > 16 bytes is not yet supported");
4463-
4464-
uint64_t &StackTop = StackForObject(FI, ZPRStackTop, PPRStackTop);
4465-
StackTop = alignTo(StackTop + MFI.getObjectSize(FI), Alignment);
4466-
Assign(FI, -int64_t(StackTop));
4467-
}
4464+
for (unsigned FI : ObjectsToAllocate)
4465+
AllocateObject(FI);
44684466

44694467
PPRStackTop = alignTo(PPRStackTop, Align(16U));
44704468
ZPRStackTop = alignTo(ZPRStackTop, Align(16U));

0 commit comments

Comments
 (0)