[llvm] [AArch64] Enable quad variant st1b/ld1b for callee-saved spills (PR #225100)
Benjamin Maxwell via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 22 06:03:19 PDT 2026
================
@@ -1806,37 +1822,57 @@ void computeCalleeSaveRegisterPairs(const AArch64FrameLowering &AFL,
bool PairFitsImmRange =
PairOffset / Scale >= -64 && PairOffset / Scale <= 63;
switch (RPI.Type) {
- case RegPairInfo::GPR:
+ case RegGroupInfo::GPR:
if (AArch64::GPR64RegClass.contains(NextReg) && PairFitsImmRange &&
!invalidateRegisterPairing(SpillExtendedVolatile, SpillCount,
RPI.Reg1, NextReg, IsWindows,
NeedsWinCFI, NeedsFrameRecord, TRI))
RPI.Reg2 = NextReg;
break;
- case RegPairInfo::FPR64:
+ case RegGroupInfo::FPR64:
if (AArch64::FPR64RegClass.contains(NextReg) && PairFitsImmRange &&
!invalidateRegisterPairing(SpillExtendedVolatile, SpillCount,
RPI.Reg1, NextReg, IsWindows,
NeedsWinCFI, NeedsFrameRecord, TRI))
RPI.Reg2 = NextReg;
break;
- case RegPairInfo::FPR128:
+ case RegGroupInfo::FPR128:
if (AArch64::FPR128RegClass.contains(NextReg) && PairFitsImmRange)
RPI.Reg2 = NextReg;
break;
- case RegPairInfo::PPR:
+ case RegGroupInfo::PPR:
break;
- case RegPairInfo::ZPR:
- if (!NeedsWinCFI && AFI->getPredicateRegForFillSpill() != 0 &&
- ((RPI.Reg1 - AArch64::Z0) & 1) == 0 && (NextReg == RPI.Reg1 + 1)) {
- // Calculate offset of register pair to see if pair instruction can be
- // used.
- int Offset = (ScalableByteOffset + StackFillDir * 2 * Scale) / Scale;
- if ((-16 <= Offset && Offset <= 14) && (Offset % 2 == 0))
- RPI.Reg2 = NextReg;
+ case RegGroupInfo::ZPR:
+ if (!NeedsWinCFI && AFI->getPredicateRegForFillSpill() != 0) {
+ if (unsigned(i + 2 * RegInc) < Count &&
+ unsigned(i + 3 * RegInc) < Count &&
+ (RPI.Reg1 - AArch64::Z0) % 4 == 0) {
+ auto Reg3 = CSI[i + RegInc * 2].getReg();
+ auto Reg4 = CSI[i + RegInc * 3].getReg();
----------------
MacDue wrote:
Don't use `auto` if the type is not on the RHS.
https://github.com/llvm/llvm-project/pull/225100
More information about the llvm-commits
mailing list