@@ -329,7 +329,7 @@ static int64_t getArgumentStackToRestore(MachineFunction &MF,
329
329
static bool produceCompactUnwindFrame (const AArch64FrameLowering &,
330
330
MachineFunction &MF);
331
331
332
- // Conservatively, returns true if the function is likely to have an SVE vectors
332
+ // Conservatively, returns true if the function is likely to have SVE vectors
333
333
// on the stack. This function is safe to be called before callee-saves or
334
334
// object offsets have been determined.
335
335
static bool isLikelyToHaveSVEStack (const AArch64FrameLowering &AFL,
@@ -343,7 +343,7 @@ static bool isLikelyToHaveSVEStack(const AArch64FrameLowering &AFL,
343
343
344
344
const MachineFrameInfo &MFI = MF.getFrameInfo ();
345
345
for (int FI = MFI.getObjectIndexBegin (); FI < MFI.getObjectIndexEnd (); FI++) {
346
- if (MFI.getStackID (FI) == TargetStackID::ScalableVector )
346
+ if (MFI.isScalableStackID (FI))
347
347
return true ;
348
348
}
349
349
@@ -726,8 +726,7 @@ static void emitCalleeSavedRestores(MachineBasicBlock &MBB,
726
726
CFIInstBuilder CFIBuilder (MBB, MBBI, MachineInstr::FrameDestroy);
727
727
728
728
for (const auto &Info : CSI) {
729
- if (SVE !=
730
- (MFI.getStackID (Info.getFrameIdx ()) == TargetStackID::ScalableVector))
729
+ if (SVE != MFI.isScalableStackID (Info.getFrameIdx ()))
731
730
continue ;
732
731
733
732
MCRegister Reg = Info.getReg ();
@@ -2141,7 +2140,7 @@ AArch64FrameLowering::getFrameIndexReferenceFromSP(const MachineFunction &MF,
2141
2140
const auto *AFI = MF.getInfo <AArch64FunctionInfo>();
2142
2141
bool FPAfterSVECalleeSaves =
2143
2142
isTargetWindows (MF) && AFI->getSVECalleeSavedStackSize ();
2144
- if (MFI.getStackID (FI) == TargetStackID::ScalableVector ) {
2143
+ if (MFI.isScalableStackID (FI)) {
2145
2144
if (FPAfterSVECalleeSaves &&
2146
2145
-ObjectOffset <= (int64_t )AFI->getSVECalleeSavedStackSize ())
2147
2146
return StackOffset::getScalable (ObjectOffset);
@@ -2207,7 +2206,7 @@ StackOffset AArch64FrameLowering::resolveFrameIndexReference(
2207
2206
const auto &MFI = MF.getFrameInfo ();
2208
2207
int64_t ObjectOffset = MFI.getObjectOffset (FI);
2209
2208
bool isFixed = MFI.isFixedObjectIndex (FI);
2210
- bool isSVE = MFI.getStackID (FI) == TargetStackID::ScalableVector ;
2209
+ bool isSVE = MFI.isScalableStackID (FI);
2211
2210
return resolveFrameOffsetReference (MF, ObjectOffset, isFixed, isSVE, FrameReg,
2212
2211
PreferFP, ForSimm);
2213
2212
}
@@ -2934,10 +2933,14 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters(
2934
2933
}
2935
2934
// Update the StackIDs of the SVE stack slots.
2936
2935
MachineFrameInfo &MFI = MF.getFrameInfo ();
2937
- if (RPI.Type == RegPairInfo::ZPR || RPI. Type == RegPairInfo::PPR ) {
2936
+ if (RPI.Type == RegPairInfo::ZPR) {
2938
2937
MFI.setStackID (FrameIdxReg1, TargetStackID::ScalableVector);
2939
2938
if (RPI.isPaired ())
2940
2939
MFI.setStackID (FrameIdxReg2, TargetStackID::ScalableVector);
2940
+ } else if (RPI.Type == RegPairInfo::PPR) {
2941
+ MFI.setStackID (FrameIdxReg1, TargetStackID::ScalablePredicateVector);
2942
+ if (RPI.isPaired ())
2943
+ MFI.setStackID (FrameIdxReg2, TargetStackID::ScalablePredicateVector);
2941
2944
}
2942
2945
}
2943
2946
return true ;
@@ -3145,8 +3148,7 @@ void AArch64FrameLowering::determineStackHazardSlot(
3145
3148
for (auto &MI : MBB) {
3146
3149
std::optional<int > FI = getLdStFrameID (MI, MFI);
3147
3150
if (FI && *FI >= 0 && *FI < (int )FrameObjects.size ()) {
3148
- if (MFI.getStackID (*FI) == TargetStackID::ScalableVector ||
3149
- AArch64InstrInfo::isFpOrNEON (MI))
3151
+ if (MFI.isScalableStackID (*FI) || AArch64InstrInfo::isFpOrNEON (MI))
3150
3152
FrameObjects[*FI] |= 2 ;
3151
3153
else
3152
3154
FrameObjects[*FI] |= 1 ;
@@ -3591,7 +3593,7 @@ static int64_t determineSVEStackObjectOffsets(MachineFrameInfo &MFI,
3591
3593
#ifndef NDEBUG
3592
3594
// First process all fixed stack objects.
3593
3595
for (int I = MFI.getObjectIndexBegin (); I != 0 ; ++I)
3594
- assert (MFI.getStackID (I) != TargetStackID::ScalableVector &&
3596
+ assert (! MFI.isScalableStackID (I) &&
3595
3597
" SVE vectors should never be passed on the stack by value, only by "
3596
3598
" reference." );
3597
3599
#endif
@@ -3625,12 +3627,11 @@ static int64_t determineSVEStackObjectOffsets(MachineFrameInfo &MFI,
3625
3627
int StackProtectorFI = -1 ;
3626
3628
if (MFI.hasStackProtectorIndex ()) {
3627
3629
StackProtectorFI = MFI.getStackProtectorIndex ();
3628
- if (MFI.getStackID (StackProtectorFI) == TargetStackID::ScalableVector )
3630
+ if (MFI.isScalableStackID (StackProtectorFI))
3629
3631
ObjectsToAllocate.push_back (StackProtectorFI);
3630
3632
}
3631
3633
for (int I = 0 , E = MFI.getObjectIndexEnd (); I != E; ++I) {
3632
- unsigned StackID = MFI.getStackID (I);
3633
- if (StackID != TargetStackID::ScalableVector)
3634
+ if (!MFI.isScalableStackID (I))
3634
3635
continue ;
3635
3636
if (I == StackProtectorFI)
3636
3637
continue ;
@@ -4634,8 +4635,7 @@ void AArch64FrameLowering::orderFrameObjects(
4634
4635
if (AFI.hasStackHazardSlotIndex ()) {
4635
4636
std::optional<int > FI = getLdStFrameID (MI, MFI);
4636
4637
if (FI && *FI >= 0 && *FI < (int )FrameObjects.size ()) {
4637
- if (MFI.getStackID (*FI) == TargetStackID::ScalableVector ||
4638
- AArch64InstrInfo::isFpOrNEON (MI))
4638
+ if (MFI.isScalableStackID (*FI) || AArch64InstrInfo::isFpOrNEON (MI))
4639
4639
FrameObjects[*FI].Accesses |= FrameObject::AccessFPR;
4640
4640
else
4641
4641
FrameObjects[*FI].Accesses |= FrameObject::AccessGPR;
@@ -4993,7 +4993,7 @@ void AArch64FrameLowering::emitRemarks(
4993
4993
}
4994
4994
4995
4995
unsigned RegTy = StackAccess::AccessType::GPR;
4996
- if (MFI.getStackID (FrameIdx) == TargetStackID::ScalableVector ) {
4996
+ if (MFI.isScalableStackID (FrameIdx)) {
4997
4997
// SPILL_PPR_TO_ZPR_SLOT_PSEUDO and FILL_PPR_FROM_ZPR_SLOT_PSEUDO
4998
4998
// spill/fill the predicate as a data vector (so are an FPR access).
4999
4999
if (MI.getOpcode () != AArch64::SPILL_PPR_TO_ZPR_SLOT_PSEUDO &&
0 commit comments