[llvm] [AMDGPU] Fix simplification of VM_VSRC based on VMEM waits (PR #178711)
Krzysztof Drewniak via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 20 08:53:57 PDT 2026
================
@@ -1295,12 +1297,27 @@ void WaitcntBrackets::simplifyVmVsrc(const AMDGPU::Waitcnt &CheckWait,
// Waiting for some counters implies waiting for VM_VSRC, since an
// instruction that decrements a counter on completion would have
// decremented VM_VSRC once its VGPR operands had been read.
- if (CheckWait.get(AMDGPU::VM_VSRC) >=
- std::min({CheckWait.get(AMDGPU::LOAD_CNT),
- CheckWait.get(AMDGPU::STORE_CNT),
- CheckWait.get(AMDGPU::SAMPLE_CNT),
- CheckWait.get(AMDGPU::BVH_CNT), CheckWait.get(AMDGPU::DS_CNT)}))
- UpdateWait.set(AMDGPU::VM_VSRC, ~0u);
+ static constexpr AMDGPU::InstCounterType VmemCounters[] = {
+ AMDGPU::LOAD_CNT, AMDGPU::STORE_CNT, AMDGPU::SAMPLE_CNT, AMDGPU::BVH_CNT,
+ AMDGPU::DS_CNT};
+ HWEvents VmemEvents = llvm::accumulate(
+ VmemCounters, HWEvents(), [&](HWEvents Acc, AMDGPU::InstCounterType T) {
+ return Acc | Context->getWaitEvents(T);
+ });
+ HWEvents PendingVmemEvents = PendingEvents & VmemEvents;
+ auto Simplify = [&](AMDGPU::InstCounterType T) {
+ unsigned CheckCount = CheckWait.get(T);
+ if (UpdateWait.get(AMDGPU::VM_VSRC) >= CheckCount &&
+ (CheckCount == 0 || !counterOutOfOrder(T)) &&
+ (PendingVmemEvents & ~Context->getWaitEvents(T)) == 0)
+ UpdateWait.set(AMDGPU::VM_VSRC, ~0u);
+ };
+ Simplify(AMDGPU::LOAD_CNT);
----------------
krzysz00 wrote:
This could be a for loop?
https://github.com/llvm/llvm-project/pull/178711
More information about the llvm-commits
mailing list