[llvm] [LLVM][AArch64]Use load/store with consecutive registers in SME2 or S… (PR #77665)
Sander de Smalen via llvm-commits
llvm-commits at lists.llvm.org
Wed May 8 01:51:57 PDT 2024
================
@@ -3287,6 +3355,31 @@ void AArch64FrameLowering::determineCalleeSaves(MachineFunction &MF,
!RegInfo->isReservedReg(MF, PairedReg))
ExtraCSSpill = PairedReg;
}
+ // Check if there is a pair of ZRegs, so it can select PReg for spill/fill
+ HasPairZReg |= (AArch64::ZPRRegClass.contains(Reg, CSRegs[i ^ 1]) &&
+ SavedRegs.test(CSRegs[i ^ 1]));
+ }
+
+ if (HasPairZReg && (Subtarget.hasSVE2p1() || Subtarget.hasSME2())) {
+ AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
+ // Find a suitable predicate register for the multi-vector spill/fill
+ // instructions.
+ for (unsigned PReg = AArch64::P8; PReg <= AArch64::P15; ++PReg) {
+ if (SavedRegs.test(PReg)) {
+ AFI->setPredicateRegForFillSpill(PReg - AArch64::P0 + AArch64::PN0);
+ break;
+ }
+ }
+ // If no free callee-save has been found assign one.
+ if (!AFI->getPredicateRegForFillSpill() &&
+ MF.getFunction().getCallingConv() ==
+ CallingConv::AArch64_SVE_VectorCall) {
+ SavedRegs.set(AArch64::P8);
+ AFI->setPredicateRegForFillSpill(AArch64::PN8);
+ }
+
+ assert(!RegInfo->isReservedReg(MF, AFI->getPredicateRegForFillSpill()) &&
----------------
sdesmalen-arm wrote:
nit: Is it worth putting this functionality into a helper function to keep this function a bit simpler?
e.g.
```
if (HasPairZReg && (Subtarget.hasSVE2p1() || Subtarget.hasSME2()))
if (unsigned Reg = findFreePredicateReg())
AFI->setPredicateRegForFillSpill(Reg);
```
?
https://github.com/llvm/llvm-project/pull/77665
More information about the llvm-commits
mailing list