[llvm] [AMDGPU] Refactor GFX11 VALU Mask Hazard Waitcnt Merging (PR #169213)
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 14 06:42:44 PDT 2026
================
@@ -437,9 +439,118 @@ class AMDGPUWaitSGPRHazards {
return Changed;
}
+ bool runWaitMerging(MachineFunction &MF) {
+ // Perform per-block merging of existing s_waitcnt_depctr instructions.
+ // Track set of SGPR writes before a given wait instruction, and search
+ // for reads of these SGPRs.
+ // Move the wait to just before the read to improve pipelining.
+ // If no related reads occur before subsequent wait then merged waits.
+ const unsigned ConstantMaskBits = AMDGPU::DepCtr::encodeFieldSaSdst(
+ AMDGPU::DepCtr::encodeFieldVaSdst(
+ AMDGPU::DepCtr::encodeFieldVaVcc(0, *ST), 0),
+ 0);
+ const unsigned VccLoIdx = *sgprNumber(AMDGPU::VCC_LO, *TRI);
+ const unsigned VccHiIdx = *sgprNumber(AMDGPU::VCC_HI, *TRI);
+ bool Changed = false;
+ for (MachineBasicBlock &MBB : MF) {
+ SmallBitVector WriteSet(128), PendingSALUWriteSet(128),
+ PendingVALUWriteSet(128);
+ MachineInstr *PrevWait = nullptr;
+
+ auto CommitWrites = [&](unsigned Mask) {
+ if (!AMDGPU::DepCtr::decodeFieldSaSdst(Mask))
+ WriteSet |= PendingSALUWriteSet;
+ bool VccLoBit = WriteSet[VccLoIdx];
+ bool VccHiBit = WriteSet[VccHiIdx];
+ if (!AMDGPU::DepCtr::decodeFieldVaSdst(Mask)) {
+ // Apply pending VALU set minus VCC bits
+ WriteSet |= PendingVALUWriteSet;
+ WriteSet[VccLoIdx] = VccLoBit;
+ WriteSet[VccHiIdx] = VccHiBit;
+ }
+ if (!AMDGPU::DepCtr::decodeFieldVaVcc(Mask)) {
+ WriteSet[VccLoIdx] = VccLoBit || PendingVALUWriteSet[VccLoIdx];
+ WriteSet[VccHiIdx] = VccHiBit || PendingVALUWriteSet[VccHiIdx];
+ }
+ // Clear all pending writes
+ PendingSALUWriteSet.reset();
+ PendingVALUWriteSet.reset();
+ };
+
+ for (auto MI = MBB.begin(), E = MBB.end(); MI != E; ++MI) {
----------------
jayfoad wrote:
Nit
```suggestion
for (MachineInstr &MI : MBB) {
```
https://github.com/llvm/llvm-project/pull/169213
More information about the llvm-commits
mailing list