@@ -2762,7 +2762,7 @@ struct RegPairInfo {
2762
2762
unsigned Reg2 = AArch64::NoRegister;
2763
2763
int FrameIdx;
2764
2764
int Offset;
2765
- enum RegType { GPR, FPR64, FPR128, PPR, ZPR } Type;
2765
+ enum RegType { GPR, FPR64, FPR128, ZPR, PPR } Type;
2766
2766
2767
2767
RegPairInfo () = default ;
2768
2768
@@ -2787,16 +2787,22 @@ struct RegPairInfo {
2787
2787
2788
2788
} // end anonymous namespace
2789
2789
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
+
2792
2798
for (MCRegister PReg :
2793
2799
{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}){
2796
2801
return PReg;
2797
2802
}
2798
- llvm_unreachable (" cannot find a free predicate " );
2803
+ llvm_unreachable (" No predicated register free" );
2799
2804
}
2805
+
2800
2806
static void computeCalleeSaveRegisterPairs (
2801
2807
MachineFunction &MF, ArrayRef<CalleeSavedInfo> CSI,
2802
2808
const TargetRegisterInfo *TRI, SmallVectorImpl<RegPairInfo> &RegPairs,
@@ -3085,17 +3091,18 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters(
3085
3091
std::swap (FrameIdxReg1, FrameIdxReg2);
3086
3092
}
3087
3093
3088
- unsigned PnReg;
3089
3094
unsigned PairRegs;
3095
+ unsigned PnReg;
3090
3096
if (RPI.isPaired () && RPI.isScalable ()) {
3091
3097
PairRegs = AArch64::Z0_Z1 + (RPI.Reg1 - AArch64::Z0);
3092
3098
if (!PtrueCreated) {
3093
3099
PtrueCreated = true ;
3094
- PnReg = findFreePredicateAsCounterReg (MF );
3100
+ PnReg = findFreePredicateAsCounterReg (&MBB );
3095
3101
BuildMI (MBB, MI, DL, TII.get (AArch64::PTRUE_C_B), PnReg)
3096
- .setMIFlags (MachineInstr::FrameDestroy );
3102
+ .setMIFlags (MachineInstr::FrameSetup );
3097
3103
}
3098
3104
}
3105
+
3099
3106
MachineInstrBuilder MIB = BuildMI (MBB, MI, DL, TII.get (StrOpc));
3100
3107
if (!MRI.isReserved (Reg1))
3101
3108
MBB.addLiveIn (Reg1);
@@ -3149,8 +3156,6 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters(
3149
3156
DL = MBBI->getDebugLoc ();
3150
3157
3151
3158
computeCalleeSaveRegisterPairs (MF, CSI, TRI, RegPairs, hasFP (MF));
3152
-
3153
- bool PtrueCreated = false ;
3154
3159
auto EmitMI = [&, PtrueCreated = false ](const RegPairInfo &RPI) mutable -> MachineBasicBlock::iterator {
3155
3160
unsigned Reg1 = RPI.Reg1 ;
3156
3161
unsigned Reg2 = RPI.Reg2 ;
@@ -3215,7 +3220,7 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters(
3215
3220
PairRegs = AArch64::Z0_Z1 + (RPI.Reg1 - AArch64::Z0);
3216
3221
if (!PtrueCreated) {
3217
3222
PtrueCreated = true ;
3218
- PnReg = findFreePredicateAsCounterReg (MF );
3223
+ PnReg = findFreePredicateAsCounterReg (&MBB );
3219
3224
BuildMI (MBB, MBBI, DL, TII.get (AArch64::PTRUE_C_B), PnReg)
3220
3225
.setMIFlags (MachineInstr::FrameDestroy);
3221
3226
}
0 commit comments