Skip to content

Commit 24b7e5e

Browse files
Improvements to spillCalleeSavedRegisters:
- Removed HasSVE - Use any_of to check if X0 is a livein - Removed level of indentation from block handling VG spill
1 parent 56c9f39 commit 24b7e5e

File tree

1 file changed

+30
-29
lines changed

1 file changed

+30
-29
lines changed

llvm/lib/Target/AArch64/AArch64FrameLowering.cpp

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3072,7 +3072,6 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters(
30723072
const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
30733073
AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
30743074
bool NeedsWinCFI = needsWinCFI(MF);
3075-
bool HasSVE = MF.getSubtarget<AArch64Subtarget>().hasSVE();
30763075
DebugLoc DL;
30773076
SmallVector<RegPairInfo, 8> RegPairs;
30783077

@@ -3167,36 +3166,38 @@ bool AArch64FrameLowering::spillCalleeSavedRegisters(
31673166
.setMIFlag(MachineInstr::FrameSetup);
31683167

31693168
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);
31703175
} 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)
31973190
.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;
32003201
AFI->setVGIdx(RPI.FrameIdx);
32013202
}
32023203
}

0 commit comments

Comments
 (0)