From 32a4650f3c76efee3bd515e25d70ae39d980b071 Mon Sep 17 00:00:00 2001 From: Benjamin Maxwell Date: Fri, 17 Jan 2025 10:10:21 +0000 Subject: [PATCH] [AArch64] Avoid hardcoding spill size/align in FrameLowering (NFC) (#123080) This is already defined for each register class in AArch64RegisterInfo, not hardcoding it here makes these values easier to change (perhaps based on hardware mode). --- .../Target/AArch64/AArch64FrameLowering.cpp | 69 ++++++------------- 1 file changed, 20 insertions(+), 49 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp index dd248cf39a5ce9a..1582d1999ca1dcc 100644 --- a/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64FrameLowering.cpp @@ -2926,26 +2926,12 @@ struct RegPairInfo { int FrameIdx; int Offset; enum RegType { GPR, FPR64, FPR128, PPR, ZPR, VG } Type; + const TargetRegisterClass *RC; RegPairInfo() = default; bool isPaired() const { return Reg2 != AArch64::NoRegister; } - unsigned getScale() const { - switch (Type) { - case PPR: - return 2; - case GPR: - case FPR64: - case VG: - return 8; - case ZPR: - case FPR128: - return 16; - } - llvm_unreachable("Unsupported type"); - } - bool isScalable() const { return Type == PPR || Type == ZPR; } }; @@ -3023,20 +3009,27 @@ static void computeCalleeSaveRegisterPairs( RegPairInfo RPI; RPI.Reg1 = CSI[i].getReg(); - if (AArch64::GPR64RegClass.contains(RPI.Reg1)) + if (AArch64::GPR64RegClass.contains(RPI.Reg1)) { RPI.Type = RegPairInfo::GPR; - else if (AArch64::FPR64RegClass.contains(RPI.Reg1)) + RPI.RC = &AArch64::GPR64RegClass; + } else if (AArch64::FPR64RegClass.contains(RPI.Reg1)) { RPI.Type = RegPairInfo::FPR64; - else if (AArch64::FPR128RegClass.contains(RPI.Reg1)) + RPI.RC = &AArch64::FPR64RegClass; + } else if (AArch64::FPR128RegClass.contains(RPI.Reg1)) { RPI.Type = RegPairInfo::FPR128; - else if (AArch64::ZPRRegClass.contains(RPI.Reg1)) + RPI.RC = &AArch64::FPR128RegClass; + } else if (AArch64::ZPRRegClass.contains(RPI.Reg1)) { RPI.Type = RegPairInfo::ZPR; - else if (AArch64::PPRRegClass.contains(RPI.Reg1)) + RPI.RC = &AArch64::ZPRRegClass; + } else if (AArch64::PPRRegClass.contains(RPI.Reg1)) { RPI.Type = RegPairInfo::PPR; - else if (RPI.Reg1 == AArch64::VG) + RPI.RC = &AArch64::PPRRegClass; + } else if (RPI.Reg1 == AArch64::VG) { RPI.Type = RegPairInfo::VG; - else + RPI.RC = &AArch64::FIXED_REGSRegClass; + } else { llvm_unreachable("Unsupported register class."); + } // Add the stack hazard size as we transition from GPR->FPR CSRs. if (AFI->hasStackHazardSlotIndex() && @@ -3045,7 +3038,7 @@ static void computeCalleeSaveRegisterPairs( ByteOffset += StackFillDir * StackHazardSize; LastReg = RPI.Reg1; - int Scale = RPI.getScale(); + int Scale = TRI->getSpillSize(*RPI.RC); // Add the next reg to the pair if it is in the same register class. if (unsigned(i + RegInc) < Count && !AFI->hasStackHazardSlotIndex()) { Register NextReg = CSI[i + RegInc].getReg(); @@ -3254,38 +3247,26 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters( // Rationale: This sequence saves uop updates compared to a sequence of // pre-increment spills like stp xi,xj,[sp,#-16]! // Note: Similar rationale and sequence for restores in epilog. - unsigned Size; - Align Alignment; + unsigned Size = TRI->getSpillSize(*RPI.RC); + Align Alignment = TRI->getSpillAlign(*RPI.RC); switch (RPI.Type) { case RegPairInfo::GPR: StrOpc = RPI.isPaired() ? AArch64::STPXi : AArch64::STRXui; - Size = 8; - Alignment = Align(8); break; case RegPairInfo::FPR64: StrOpc = RPI.isPaired() ? AArch64::STPDi : AArch64::STRDui; - Size = 8; - Alignment = Align(8); break; case RegPairInfo::FPR128: StrOpc = RPI.isPaired() ? AArch64::STPQi : AArch64::STRQui; - Size = 16; - Alignment = Align(16); break; case RegPairInfo::ZPR: StrOpc = RPI.isPaired() ? AArch64::ST1B_2Z_IMM : AArch64::STR_ZXI; - Size = 16; - Alignment = Align(16); break; case RegPairInfo::PPR: StrOpc = AArch64::STR_PXI; - Size = 2; - Alignment = Align(2); break; case RegPairInfo::VG: StrOpc = AArch64::STRXui; - Size = 8; - Alignment = Align(8); break; } @@ -3495,33 +3476,23 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters( // ldp x22, x21, [sp, #0] // addImm(+0) // Note: see comment in spillCalleeSavedRegisters() unsigned LdrOpc; - unsigned Size; - Align Alignment; + unsigned Size = TRI->getSpillSize(*RPI.RC); + Align Alignment = TRI->getSpillAlign(*RPI.RC); switch (RPI.Type) { case RegPairInfo::GPR: LdrOpc = RPI.isPaired() ? AArch64::LDPXi : AArch64::LDRXui; - Size = 8; - Alignment = Align(8); break; case RegPairInfo::FPR64: LdrOpc = RPI.isPaired() ? AArch64::LDPDi : AArch64::LDRDui; - Size = 8; - Alignment = Align(8); break; case RegPairInfo::FPR128: LdrOpc = RPI.isPaired() ? AArch64::LDPQi : AArch64::LDRQui; - Size = 16; - Alignment = Align(16); break; case RegPairInfo::ZPR: LdrOpc = RPI.isPaired() ? AArch64::LD1B_2Z_IMM : AArch64::LDR_ZXI; - Size = 16; - Alignment = Align(16); break; case RegPairInfo::PPR: LdrOpc = AArch64::LDR_PXI; - Size = 2; - Alignment = Align(2); break; case RegPairInfo::VG: continue;