[llvm] [AArch64] Hint regalloc to choose distinct predicate for MATCH/CMP (PR #190139)
Mikael Holmen via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 14 06:46:31 PDT 2026
================
@@ -1115,6 +1115,55 @@ unsigned AArch64RegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
}
}
+static bool HandleMatchCmpPredicateHint(
+ Register VirtReg, ArrayRef<MCPhysReg> Order,
+ SmallVectorImpl<MCPhysReg> &Hints, const VirtRegMap *VRM,
+ const MachineRegisterInfo &MRI, const TargetInstrInfo &TII,
+ const AArch64Subtarget &ST, const LiveRegMatrix *Matrix) {
+ const TargetRegisterClass *RegRC = MRI.getRegClass(VirtReg);
+ if (!ST.useDistinctPredicateDstReg() ||
+ !AArch64::PPRRegClass.hasSubClassEq(RegRC) || !MRI.hasOneDef(VirtReg) ||
+ Order.size() < 2)
+ return false;
+
+ const MachineInstr *DefInst = MRI.getOneDef(VirtReg)->getParent();
+ if ((TII.get(DefInst->getOpcode()).TSFlags &
+ AArch64::DestructiveInstTypeMask) != AArch64::DestructivePredicate)
+ return false;
+
+ Register Op1Reg = DefInst->getOperand(1).getReg();
+ if (Op1Reg.isVirtual())
+ Op1Reg = VRM->getPhys(Op1Reg);
+
+ // If no register is allocated for the general-predicate, it's not yet
+ // possible to choose a distinct register.
+ if (!Op1Reg.isValid())
+ return false;
+
+ // Move Op1Reg as the least preferred register.
+ //
+ // This might result in callee-save spills when the function takes/returns
+ // arguments in SVE registers (i.e. needs to preserve p4-p15) and can't reuse
+ // p0-p3. That's why we limit it to non-callee saved registers or to
+ // callee-saved registers that have already been allocated for other uses in
+ // the function.
+ DenseSet<unsigned> CSRs;
+ for (unsigned I = 0;; ++I) {
+ Register R = MRI.getCalleeSavedRegs()[I];
+ if (!R.isValid())
+ break;
+ if (AArch64::PPRRegClass.contains(R))
+ CSRs.insert(R);
+ }
+
+ Hints.append(Order.begin(), Order.end());
+ llvm::stable_sort(Hints, [&](Register A, Register B) {
----------------
mikaelholmen wrote:
Great!
https://github.com/llvm/llvm-project/pull/190139
More information about the llvm-commits
mailing list