[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