[llvm] [AMDGPU][SIInsertWaitcnts][NFC] Introduce Counter class (PR #190271)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 10 09:22:12 PDT 2026
================
@@ -742,14 +743,65 @@ class WaitcntBrackets {
bool empty(InstCounterType T) const { return getScoreRange(T) == 0; }
private:
+ /// A container that holds all counters.
+ class AllCounters {
+ /// A counter of a specific InstCounterType. Whenever this pass visits an
+ /// instruction that affects this counter type we "increment" the counter.
+ /// Conceptually the counter implements the value of the corresponding
+ /// AMDGPU hardware counter if none of the outstanding instructions that
+ /// affect this counter had completed. When a wait for this counter is
+ /// emitted then we "decrement" (or zero) the counter.
+ class Counter {
+ InstCounterType CntT;
+ const AMDGPU::HardwareLimits *Limits = nullptr;
+ unsigned LB = 0;
+ unsigned UB = 0;
+
+ public:
+ Counter() = default;
+ Counter(InstCounterType CntT, const AMDGPU::HardwareLimits &Limits)
+ : CntT(CntT), Limits(&Limits) {}
+ /// \returns the count of outstanding instrs tracked by this counter.
+ unsigned getValue() const { return UB - LB; }
+ // TODO: Make private: we should not provide raw access to the internals.
+ void setLB(unsigned NewLB) { LB = NewLB; }
+ // TODO: Make private: we should not provide raw access to the internals.
+ void setUB(unsigned NewUB) {
+ UB = NewUB;
+ if (CntT == EXP_CNT) {
+ if (getValue() > getWaitCountMax(*Limits, EXP_CNT))
+ LB = UB - getWaitCountMax(*Limits, EXP_CNT);
+ }
+ }
+ // TODO: Make private: we should not provide raw access to the internals.
+ unsigned getUB() const { return UB; }
+ // TODO: Make private: we should not provide raw access to the internals.
+ unsigned getLB() const { return LB; }
+
+ /// \returns true if the counter includes \p Score, i.e., it has
+ /// contributed to its current value, or in other words it is pending.
+ bool contains(unsigned Score) const { return LB < Score && Score <= UB; }
+ };
+
+ std::array<Counter, NUM_INST_CNTS> Counters;
+
+ public:
+ explicit AllCounters(const AMDGPU::HardwareLimits &Limits) {
+ for (InstCounterType CntT : inst_counter_types())
+ Counters[(int)CntT] = Counter(CntT, Limits);
+ }
+ Counter &operator[](unsigned Idx) { return Counters[Idx]; }
----------------
vporpo wrote:
Good point, done.
https://github.com/llvm/llvm-project/pull/190271
More information about the llvm-commits
mailing list