@@ -3072,7 +3072,6 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters(
3072
3072
const TargetInstrInfo &TII = *MF.getSubtarget ().getInstrInfo ();
3073
3073
AArch64FunctionInfo *AFI = MF.getInfo <AArch64FunctionInfo>();
3074
3074
bool NeedsWinCFI = needsWinCFI (MF);
3075
- bool HasSVE = MF.getSubtarget <AArch64Subtarget>().hasSVE ();
3076
3075
DebugLoc DL;
3077
3076
SmallVector<RegPairInfo, 8 > RegPairs;
3078
3077
@@ -3167,36 +3166,38 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters(
3167
3166
.setMIFlag (MachineInstr::FrameSetup);
3168
3167
3169
3168
AFI->setStreamingVGIdx (RPI.FrameIdx );
3169
+ } else if (MF.getSubtarget <AArch64Subtarget>().hasSVE ()) {
3170
+ BuildMI (MBB, MI, DL, TII.get (AArch64::CNTD_XPiI), Reg1)
3171
+ .addImm (31 )
3172
+ .addImm (1 )
3173
+ .setMIFlag (MachineInstr::FrameSetup);
3174
+ AFI->setVGIdx (RPI.FrameIdx );
3170
3175
} else {
3171
- if (HasSVE)
3172
- BuildMI (MBB, MI, DL, TII.get (AArch64::CNTD_XPiI), Reg1)
3173
- .addImm (31 )
3174
- .addImm (1 )
3175
- .setMIFlag (MachineInstr::FrameSetup);
3176
- else {
3177
- const AArch64Subtarget &STI = MF.getSubtarget <AArch64Subtarget>();
3178
- for (const auto &LiveIn : MBB.liveins ())
3179
- if (STI.getRegisterInfo ()->isSuperOrSubRegisterEq (AArch64::X0,
3180
- LiveIn.PhysReg ))
3181
- X0Scratch = Reg1;
3182
-
3183
- if (X0Scratch != AArch64::NoRegister)
3184
- BuildMI (MBB, MI, DL, TII.get (AArch64::ORRXrr), Reg1)
3185
- .addReg (AArch64::XZR)
3186
- .addReg (AArch64::X0, RegState::Undef)
3187
- .addReg (AArch64::X0, RegState::Implicit)
3188
- .setMIFlag (MachineInstr::FrameSetup);
3189
-
3190
- const uint32_t *RegMask = TRI->getCallPreservedMask (
3191
- MF, CallingConv::
3192
- AArch64_SME_ABI_Support_Routines_PreserveMost_From_X1);
3193
- BuildMI (MBB, MI, DL, TII.get (AArch64::BL))
3194
- .addExternalSymbol (" __arm_get_current_vg" )
3195
- .addRegMask (RegMask)
3196
- .addReg (AArch64::X0, RegState::ImplicitDefine)
3176
+ const AArch64Subtarget &STI = MF.getSubtarget <AArch64Subtarget>();
3177
+ if (llvm::any_of (
3178
+ MBB.liveins (),
3179
+ [&STI](const MachineBasicBlock::RegisterMaskPair &LiveIn) {
3180
+ return STI.getRegisterInfo ()->isSuperOrSubRegisterEq (
3181
+ AArch64::X0, LiveIn.PhysReg );
3182
+ }))
3183
+ X0Scratch = Reg1;
3184
+
3185
+ if (X0Scratch != AArch64::NoRegister)
3186
+ BuildMI (MBB, MI, DL, TII.get (AArch64::ORRXrr), Reg1)
3187
+ .addReg (AArch64::XZR)
3188
+ .addReg (AArch64::X0, RegState::Undef)
3189
+ .addReg (AArch64::X0, RegState::Implicit)
3197
3190
.setMIFlag (MachineInstr::FrameSetup);
3198
- Reg1 = AArch64::X0;
3199
- }
3191
+
3192
+ const uint32_t *RegMask = TRI->getCallPreservedMask (
3193
+ MF,
3194
+ CallingConv::AArch64_SME_ABI_Support_Routines_PreserveMost_From_X1);
3195
+ BuildMI (MBB, MI, DL, TII.get (AArch64::BL))
3196
+ .addExternalSymbol (" __arm_get_current_vg" )
3197
+ .addRegMask (RegMask)
3198
+ .addReg (AArch64::X0, RegState::ImplicitDefine)
3199
+ .setMIFlag (MachineInstr::FrameSetup);
3200
+ Reg1 = AArch64::X0;
3200
3201
AFI->setVGIdx (RPI.FrameIdx );
3201
3202
}
3202
3203
}
0 commit comments