[llvm] [AMDGPU] Avoid wmma bank conflict for GFX11 and GFX12 (PR #205530)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 24 04:32:32 PDT 2026


================
@@ -262,6 +266,41 @@ void GCNPreRAOptimizationsImpl::hintTrue16Copy(const MachineInstr &MI) {
     MRI->setRegAllocationHint(Dst, AMDGPURI::Size16, Src);
 }
 
+void GCNPreRAOptimizationsImpl::recordWMMABankSiblings(
+    const MachineInstr &MI, SIMachineFunctionInfo &MFI) {
+  // The consecutive-allocation VGPR bank collision only happens when each
+  // matrix operand is a multiple of 4 VGPRs (128 bits) wide; with narrower
+  // operands the start registers already fall on different banks. Restrict the
+  // hint to WMMAs whose matrix source operands are a multiple of 128 bits.
+  auto Is128BitMultiple = [&](AMDGPU::OpName Name) {
+    const MachineOperand *MO = TII->getNamedOperand(MI, Name);
+    return MO && MO->isReg() && MO->getReg() &&
+           TRI->getRegSizeInBits(MO->getReg(), *MRI) % 128 == 0;
+  };
+  if (!Is128BitMultiple(AMDGPU::OpName::src0) ||
+      !Is128BitMultiple(AMDGPU::OpName::src1))
+    return;
+
+  // Record, for each virtual register operand, the other operands of this WMMA
+  // so SIRegisterInfo::getRegAllocationHints can steer them onto distinct
+  // VGPR banks. A register used by several WMMAs accumulates the union of their
+  // siblings.
+  SmallVector<Register, 4> Regs;
+  for (const MachineOperand &MO : MI.operands())
+    if (MO.isReg() && MO.getReg() && MO.getReg().isVirtual() &&
+        !is_contained(Regs, MO.getReg()))
+      Regs.push_back(MO.getReg());
+
+  DenseMap<Register, SmallVector<Register, 3>> &Siblings =
+      MFI.getWMMABankSiblings();
+  for (Register Reg : Regs) {
+    SmallVector<Register, 3> &S = Siblings[Reg];
+    for (Register Other : Regs)
+      if (Other != Reg && !is_contained(S, Other))
+        S.push_back(Other);
+  }
----------------
arsenm wrote:

This feels clumsy 

https://github.com/llvm/llvm-project/pull/205530


More information about the llvm-commits mailing list