@@ -2762,7 +2762,7 @@ struct RegPairInfo {
27622762 unsigned Reg2 = AArch64::NoRegister;
27632763 int FrameIdx;
27642764 int Offset;
2765- enum RegType { GPR, FPR64, FPR128, PPR, ZPR } Type;
2765+ enum RegType { GPR, FPR64, FPR128, ZPR, PPR } Type;
27662766
27672767 RegPairInfo () = default ;
27682768
@@ -2787,16 +2787,22 @@ struct RegPairInfo {
27872787
27882788} // end anonymous namespace
27892789
2790- unsigned findFreePredicateAsCounterReg (MachineFunction &MF) {
2791- const MachineRegisterInfo &MRI = MF.getRegInfo ();
2790+ static unsigned findFreePredicateAsCounterReg (MachineBasicBlock *MBB) {
2791+ MachineFunction *MF = MBB->getParent ();
2792+
2793+ const AArch64Subtarget &Subtarget = MF->getSubtarget <AArch64Subtarget>();
2794+ const AArch64RegisterInfo &TRI = *Subtarget.getRegisterInfo ();
2795+ LivePhysRegs LiveRegs (TRI);
2796+ getLiveRegsForEntryMBB (LiveRegs, *MBB);
2797+
27922798 for (MCRegister PReg :
27932799 {AArch64::PN8, AArch64::PN9, AArch64::PN10, AArch64::PN11, AArch64::PN12,
2794- AArch64::PN13, AArch64::PN14, AArch64::PN15}) {
2795- if (!MRI.isReserved (PReg))
2800+ AArch64::PN13, AArch64::PN14, AArch64::PN15}){
27962801 return PReg;
27972802 }
2798- llvm_unreachable (" cannot find a free predicate " );
2803+ llvm_unreachable (" No predicated register free" );
27992804}
2805+
28002806static void computeCalleeSaveRegisterPairs (
28012807 MachineFunction &MF, ArrayRef<CalleeSavedInfo> CSI,
28022808 const TargetRegisterInfo *TRI, SmallVectorImpl<RegPairInfo> &RegPairs,
@@ -3085,17 +3091,18 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters(
30853091 std::swap (FrameIdxReg1, FrameIdxReg2);
30863092 }
30873093
3088- unsigned PnReg;
30893094 unsigned PairRegs;
3095+ unsigned PnReg;
30903096 if (RPI.isPaired () && RPI.isScalable ()) {
30913097 PairRegs = AArch64::Z0_Z1 + (RPI.Reg1 - AArch64::Z0);
30923098 if (!PtrueCreated) {
30933099 PtrueCreated = true ;
3094- PnReg = findFreePredicateAsCounterReg (MF );
3100+ PnReg = findFreePredicateAsCounterReg (&MBB );
30953101 BuildMI (MBB, MI, DL, TII.get (AArch64::PTRUE_C_B), PnReg)
3096- .setMIFlags (MachineInstr::FrameDestroy );
3102+ .setMIFlags (MachineInstr::FrameSetup );
30973103 }
30983104 }
3105+
30993106 MachineInstrBuilder MIB = BuildMI (MBB, MI, DL, TII.get (StrOpc));
31003107 if (!MRI.isReserved (Reg1))
31013108 MBB.addLiveIn (Reg1);
@@ -3149,8 +3156,6 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters(
31493156 DL = MBBI->getDebugLoc ();
31503157
31513158 computeCalleeSaveRegisterPairs (MF, CSI, TRI, RegPairs, hasFP (MF));
3152-
3153- bool PtrueCreated = false ;
31543159 auto EmitMI = [&, PtrueCreated = false ](const RegPairInfo &RPI) mutable -> MachineBasicBlock::iterator {
31553160 unsigned Reg1 = RPI.Reg1 ;
31563161 unsigned Reg2 = RPI.Reg2 ;
@@ -3215,7 +3220,7 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters(
32153220 PairRegs = AArch64::Z0_Z1 + (RPI.Reg1 - AArch64::Z0);
32163221 if (!PtrueCreated) {
32173222 PtrueCreated = true ;
3218- PnReg = findFreePredicateAsCounterReg (MF );
3223+ PnReg = findFreePredicateAsCounterReg (&MBB );
32193224 BuildMI (MBB, MBBI, DL, TII.get (AArch64::PTRUE_C_B), PnReg)
32203225 .setMIFlags (MachineInstr::FrameDestroy);
32213226 }
0 commit comments