@@ -4382,8 +4382,8 @@ determineSVEStackObjectOffsets(MachineFunction &MF, bool AssignOffsets,
4382
4382
// With SplitSVEObjects we maintain separate stack offsets for predicates
4383
4383
// (PPRs) and SVE vectors (ZPRs). When SplitSVEObjects is disabled predicates
4384
4384
// are included in the SVE vector area.
4385
- int64_t &ZPROffset = SVEStack.ZPRStackSize ;
4386
- int64_t &PPROffset =
4385
+ uint64_t &ZPRStackTop = SVEStack.ZPRStackSize ;
4386
+ uint64_t &PPRStackTop =
4387
4387
SplitSVEObjects ? SVEStack.PPRStackSize : SVEStack.ZPRStackSize ;
4388
4388
4389
4389
#ifndef NDEBUG
@@ -4394,10 +4394,10 @@ determineSVEStackObjectOffsets(MachineFunction &MF, bool AssignOffsets,
4394
4394
" reference." );
4395
4395
#endif
4396
4396
4397
- auto OffsetForObject = [&](int FI, int64_t &ZPROffset ,
4398
- int64_t &PPROffset ) -> int64_t & {
4399
- return MFI.getStackID (FI) == TargetStackID::ScalableVector ? ZPROffset
4400
- : PPROffset ;
4397
+ auto StackForObject = [&](int FI, uint64_t &ZPRStackTop ,
4398
+ uint64_t &PPRStackTop ) -> uint64_t & {
4399
+ return MFI.getStackID (FI) == TargetStackID::ScalableVector ? ZPRStackTop
4400
+ : PPRStackTop ;
4401
4401
};
4402
4402
4403
4403
auto Assign = [&MFI](int FI, int64_t Offset) {
@@ -4409,19 +4409,17 @@ determineSVEStackObjectOffsets(MachineFunction &MF, bool AssignOffsets,
4409
4409
int MinCSFrameIndex, MaxCSFrameIndex;
4410
4410
if (getSVECalleeSaveSlotRange (MFI, MinCSFrameIndex, MaxCSFrameIndex)) {
4411
4411
for (int FI = MinCSFrameIndex; FI <= MaxCSFrameIndex; ++FI) {
4412
- int64_t &Offset = OffsetForObject (FI, ZPROffset, PPROffset);
4413
- Offset += MFI.getObjectSize (FI);
4414
- Offset = alignTo (Offset, MFI.getObjectAlign (FI));
4415
- if (AssignOffsets) {
4416
- LLVM_DEBUG (dbgs () << " FI: " << FI << " , Offset: " << -Offset << " \n " );
4417
- Assign (FI, -Offset);
4418
- }
4412
+ uint64_t &StackTop = StackForObject (FI, ZPRStackTop, PPRStackTop);
4413
+ StackTop += MFI.getObjectSize (FI);
4414
+ StackTop = alignTo (StackTop, MFI.getObjectAlign (FI));
4415
+ if (AssignOffsets)
4416
+ Assign (FI, -int64_t (StackTop));
4419
4417
}
4420
4418
}
4421
4419
4422
4420
// Ensure the CS area is 16-byte aligned.
4423
- PPROffset = alignTo (PPROffset , Align (16U ));
4424
- ZPROffset = alignTo (ZPROffset , Align (16U ));
4421
+ PPRStackTop = alignTo (PPRStackTop , Align (16U ));
4422
+ ZPRStackTop = alignTo (ZPRStackTop , Align (16U ));
4425
4423
4426
4424
// Create a buffer of SVE objects to allocate and sort it.
4427
4425
SmallVector<int , 8 > ObjectsToAllocate;
@@ -4458,14 +4456,14 @@ determineSVEStackObjectOffsets(MachineFunction &MF, bool AssignOffsets,
4458
4456
report_fatal_error (
4459
4457
" Alignment of scalable vectors > 16 bytes is not yet supported" );
4460
4458
4461
- int64_t &Offset = OffsetForObject (FI, ZPROffset, PPROffset );
4462
- Offset = alignTo (Offset + MFI.getObjectSize (FI), Alignment);
4459
+ uint64_t &StackTop = StackForObject (FI, ZPRStackTop, PPRStackTop );
4460
+ StackTop = alignTo (StackTop + MFI.getObjectSize (FI), Alignment);
4463
4461
if (AssignOffsets)
4464
- Assign (FI, -Offset );
4462
+ Assign (FI, -int64_t (StackTop) );
4465
4463
}
4466
4464
4467
- PPROffset = alignTo (PPROffset , Align (16U ));
4468
- ZPROffset = alignTo (ZPROffset , Align (16U ));
4465
+ PPRStackTop = alignTo (PPRStackTop , Align (16U ));
4466
+ ZPRStackTop = alignTo (ZPRStackTop , Align (16U ));
4469
4467
return SVEStack;
4470
4468
}
4471
4469
@@ -4474,9 +4472,11 @@ AArch64FrameLowering::estimateSVEStackObjectOffsets(MachineFunction &MF) const {
4474
4472
return determineSVEStackObjectOffsets (MF, false );
4475
4473
}
4476
4474
4477
- SVEStackSizes
4478
- AArch64FrameLowering::assignSVEStackObjectOffsets (MachineFunction &MF) const {
4479
- return determineSVEStackObjectOffsets (MF, true );
4475
+ void AArch64FrameLowering::assignSVEStackObjectOffsets (
4476
+ MachineFunction &MF) const {
4477
+ auto [ZPRStackSize, PPRStackSize] = determineSVEStackObjectOffsets (MF, true );
4478
+ MF.getInfo <AArch64FunctionInfo>()->setStackSizeSVE (ZPRStackSize,
4479
+ PPRStackSize);
4480
4480
}
4481
4481
4482
4482
// / Attempts to scavenge a register from \p ScavengeableRegs given the used
@@ -4790,8 +4790,7 @@ void AArch64FrameLowering::processFunctionBeforeFrameFinalized(
4790
4790
assert (getStackGrowthDirection () == TargetFrameLowering::StackGrowsDown &&
4791
4791
" Upwards growing stack unsupported" );
4792
4792
4793
- auto [ZPRStackSize, PPRStackSize] = assignSVEStackObjectOffsets (MF);
4794
- AFI->setStackSizeSVE (ZPRStackSize, PPRStackSize);
4793
+ assignSVEStackObjectOffsets (MF);
4795
4794
4796
4795
// If this function isn't doing Win64-style C++ EH, we don't need to do
4797
4796
// anything.
0 commit comments