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