@@ -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