Skip to content

Commit fff3e34

Browse files
[LLVM][AArch64]Use load/store with consecutive registers in SME2 or SVE2.1 for spill/fill
When possible the spill/fill register in Frame Lowering uses the ld/st consecutive pairs available in sme or sve2.1.
1 parent 5e9b05b commit fff3e34

File tree

2 files changed

+17
-15
lines changed

2 files changed

+17
-15
lines changed

llvm/lib/Target/AArch64/AArch64FrameLowering.cpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
28002806
static 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
}

llvm/test/CodeGen/AArch64/sve-callee-save-restore-pairs.ll

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,3 @@ define void @fhalf(<vscale x 8 x half> %v) {
290290
call void @my_func()
291291
ret void
292292
}
293-
294-
295-

0 commit comments

Comments
 (0)