[llvm] [AMDGPU] Add hint for MFMA Dst and OpC (PR #185218)
Juan Manuel Martinez CaamaƱo via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 31 08:03:07 PDT 2026
================
@@ -245,6 +246,64 @@ bool GCNPreRAOptimizationsImpl::run(MachineFunction &MF) {
TRI = ST.getRegisterInfo();
bool Changed = false;
+ if (ST.hasMAIInsts()) {
+ EquivalenceClasses<Register> MFMAHints;
+ for (const MachineBasicBlock &MBB : MF) {
+ for (const MachineInstr &MI : MBB) {
+ if (!SIInstrInfo::isMFMA(MI))
+ continue;
+ const MachineOperand *DstMO =
+ TII->getNamedOperand(MI, AMDGPU::OpName::vdst);
+ const MachineOperand *Src2MO =
+ TII->getNamedOperand(MI, AMDGPU::OpName::src2);
+ if (!DstMO || !Src2MO || !DstMO->isReg() || !Src2MO->isReg())
+ continue;
+ Register Dst = DstMO->getReg();
+ Register Src2 = Src2MO->getReg();
+ if (!Dst.isVirtual() || !Src2.isVirtual())
+ continue;
+ LLVM_DEBUG(dbgs() << "Setting hint for "; MI.dump());
+ LLVM_DEBUG(dbgs() << " Dst: "; DstMO->dump(); dbgs() << " Src2: ";
+ Src2MO->dump());
+ MFMAHints.unionSets(Dst, Src2);
+ }
+ }
+
+ auto CheckAllCompatibleRC =
+ [&](const EquivalenceClasses<llvm::Register>::ECValue *I) -> bool {
+ for (Register A : MFMAHints.members(*I)) {
+ assert(A.isVirtual());
+ for (Register B : MFMAHints.members(*I)) {
+ assert(B.isVirtual());
+ if (A == B)
+ continue;
+
+ const TargetRegisterClass *ARC = MRI->getRegClass(A);
+ const TargetRegisterClass *BRC = MRI->getRegClass(B);
+ if (!TRI->getCommonSubClass(ARC, BRC))
----------------
jmmartinez wrote:
Just passing by.
Is `getCommonSubClass(A,B) == getCommonSubClass(B,A)` ? If that is the case, is it possible to iterate only once over each `(A,B)` pair?
Same for the `addRegAllocationHint` loop nest below.
https://github.com/llvm/llvm-project/pull/185218
More information about the llvm-commits
mailing list