[llvm] [NFC][AMDGPU] Avoid using raw TSFlags in AMDGPUBarrierLatency.cpp (PR #213064)

Valery Pykhtin via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 13 02:54:55 PDT 2026


https://github.com/vpykhtin updated https://github.com/llvm/llvm-project/pull/213064

>From 05addd9d812f02d4b537c46995205ac2c8e127f9 Mon Sep 17 00:00:00 2001
From: Valery Pykhtin <valery.pykhtin at amd.com>
Date: Thu, 30 Jul 2026 16:12:53 +0000
Subject: [PATCH 1/2]  Avoid using raw TSFlags in
 AMDGPU/AMDGPUBarrierLatency.cpp

---
 llvm/lib/Target/AMDGPU/AMDGPUBarrierLatency.cpp | 16 +++++++---------
 llvm/lib/Target/AMDGPU/SIInstrInfo.h            |  4 ++--
 2 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/llvm/lib/Target/AMDGPU/AMDGPUBarrierLatency.cpp b/llvm/lib/Target/AMDGPU/AMDGPUBarrierLatency.cpp
index 5be42ec5e1589..770b6f2debc58 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUBarrierLatency.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUBarrierLatency.cpp
@@ -132,9 +132,9 @@ void BarrierLatency::apply(ScheduleDAGInstrs *DAG) {
         }
       }
     } else if (TII->isLDSDMA(*MI)) {
-      if (MI->getDesc().TSFlags & SIInstrFlags::TENSOR_CNT)
+      if (SIInstrFlags::usesTENSOR_CNT(*MI))
         RegionTDM.push_back(&SU);
-      else if (MI->getDesc().TSFlags & SIInstrFlags::ASYNC_CNT)
+      else if (SIInstrFlags::usesASYNC_CNT(*MI))
         RegionAsync.push_back(&SU);
     } else if (Op == AMDGPU::S_WAIT_TENSORCNT ||
                Op == AMDGPU::S_WAIT_ASYNCCNT) {
@@ -164,12 +164,8 @@ void BarrierLatency::apply(ScheduleDAGInstrs *DAG) {
           continue;
 
         Register DepReg = PredDep.getReg();
-        Register LDSDMACnt = AMDGPU::TENSORcnt;
-        uint64_t LDSDMAFlags = SIInstrFlags::TENSOR_CNT;
-        if (Op == AMDGPU::S_WAIT_ASYNCCNT) {
-          LDSDMACnt = AMDGPU::ASYNCcnt;
-          LDSDMAFlags = SIInstrFlags::ASYNC_CNT;
-        }
+        bool IsAsync = Op == AMDGPU::S_WAIT_ASYNCCNT;
+        Register LDSDMACnt = IsAsync ? AMDGPU::ASYNCcnt : AMDGPU::TENSORcnt;
 
         if (DepReg != LDSDMACnt)
           continue;
@@ -179,7 +175,9 @@ void BarrierLatency::apply(ScheduleDAGInstrs *DAG) {
         // The data dep can be carried by a non-LDSDMA SU
         // (e.g. an intervening COPY or pseudo). Such predecessors are not
         // tracked, so needWaitFor cannot reason about them.
-        if (!(PredSU->getInstr()->getDesc().TSFlags & LDSDMAFlags))
+        const MachineInstr &PredMI = *PredSU->getInstr();
+        if (IsAsync ? !SIInstrFlags::usesASYNC_CNT(PredMI)
+                    : !SIInstrFlags::usesTENSOR_CNT(PredMI))
           continue;
 
         if (!needWaitFor(Op == AMDGPU::S_WAIT_ASYNCCNT ? RegionAsync
diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.h b/llvm/lib/Target/AMDGPU/SIInstrInfo.h
index 4c8641a6091d7..f2703138f2425 100644
--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.h
+++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.h
@@ -1054,11 +1054,11 @@ class SIInstrInfo final : public AMDGPUGenInstrInfo {
   }
 
   static bool usesTENSOR_CNT(const MachineInstr &MI) {
-    return MI.getDesc().TSFlags & SIInstrFlags::TENSOR_CNT;
+    return SIInstrFlags::usesTENSOR_CNT(MI);
   }
 
   bool usesTENSOR_CNT(uint32_t Opcode) const {
-    return get(Opcode).TSFlags & SIInstrFlags::TENSOR_CNT;
+    return SIInstrFlags::usesTENSOR_CNT(get(Opcode));
   }
 
   // Most sopk treat the immediate as a signed 16-bit, however some

>From 4dc185291d18054c474f7c0f0f53a2b4e498e463 Mon Sep 17 00:00:00 2001
From: Valery Pykhtin <valery.pykhtin at amd.com>
Date: Thu, 30 Jul 2026 16:13:55 +0000
Subject: [PATCH 2/2] Add DontUseRawTSFlags namespace to prevent direct access
 and encourage predicate function usage

---
 llvm/lib/Target/AMDGPU/SIDefines.h | 130 +++++++++++++++--------------
 1 file changed, 69 insertions(+), 61 deletions(-)

diff --git a/llvm/lib/Target/AMDGPU/SIDefines.h b/llvm/lib/Target/AMDGPU/SIDefines.h
index a7dd7b5f8dd10..f0aa20036f263 100644
--- a/llvm/lib/Target/AMDGPU/SIDefines.h
+++ b/llvm/lib/Target/AMDGPU/SIDefines.h
@@ -55,6 +55,11 @@ enum {
 }
 
 namespace SIInstrFlags {
+
+// Raw TSFlags bit constants — use the predicate functions below instead of
+// testing these directly. This namespace makes accidental direct use a
+// compile error outside of SIDefines.h itself.
+namespace DontUseRawTSFlags {
 // This needs to be kept in sync with the field bits in InstSI.
 enum : uint64_t {
   // Low bits - basic encoding information.
@@ -183,6 +188,7 @@ enum : uint64_t {
   // Is a SWMMAC instruction.
   IsSWMMAC = UINT64_C(1) << 63,
 };
+} // namespace DontUseRawTSFlags
 
 // Predicate functions over TSFlags — the single place where raw TSFlags bit
 // tests are written. All callers (SIInstrInfo methods, MC-layer code) go
@@ -202,187 +208,189 @@ inline uint64_t getTSFlags(const MCInstrInfo &MII, const MCInst &Inst) {
 }
 
 template <typename... T> constexpr bool isSALU(const T &...O) {
-  return getTSFlags(O...) & SALU;
+  return getTSFlags(O...) & DontUseRawTSFlags::SALU;
 }
 template <typename... T> constexpr bool isVALU(const T &...O) {
-  return getTSFlags(O...) & VALU;
+  return getTSFlags(O...) & DontUseRawTSFlags::VALU;
 }
 template <typename... T> constexpr bool isSOP1(const T &...O) {
-  return getTSFlags(O...) & SOP1;
+  return getTSFlags(O...) & DontUseRawTSFlags::SOP1;
 }
 template <typename... T> constexpr bool isSOP2(const T &...O) {
-  return getTSFlags(O...) & SOP2;
+  return getTSFlags(O...) & DontUseRawTSFlags::SOP2;
 }
 template <typename... T> constexpr bool isSOPC(const T &...O) {
-  return getTSFlags(O...) & SOPC;
+  return getTSFlags(O...) & DontUseRawTSFlags::SOPC;
 }
 template <typename... T> constexpr bool isSOPK(const T &...O) {
-  return getTSFlags(O...) & SOPK;
+  return getTSFlags(O...) & DontUseRawTSFlags::SOPK;
 }
 template <typename... T> constexpr bool isSOPP(const T &...O) {
-  return getTSFlags(O...) & SOPP;
+  return getTSFlags(O...) & DontUseRawTSFlags::SOPP;
 }
 template <typename... T> constexpr bool isVOP1(const T &...O) {
-  return getTSFlags(O...) & VOP1;
+  return getTSFlags(O...) & DontUseRawTSFlags::VOP1;
 }
 template <typename... T> constexpr bool isVOP2(const T &...O) {
-  return getTSFlags(O...) & VOP2;
+  return getTSFlags(O...) & DontUseRawTSFlags::VOP2;
 }
 template <typename... T> constexpr bool isVOPC(const T &...O) {
-  return getTSFlags(O...) & VOPC;
+  return getTSFlags(O...) & DontUseRawTSFlags::VOPC;
 }
 template <typename... T> constexpr bool isVOP3(const T &...O) {
-  return getTSFlags(O...) & VOP3;
+  return getTSFlags(O...) & DontUseRawTSFlags::VOP3;
 }
 template <typename... T> constexpr bool isVOP3P(const T &...O) {
-  return getTSFlags(O...) & VOP3P;
+  return getTSFlags(O...) & DontUseRawTSFlags::VOP3P;
 }
 template <typename... T> constexpr bool isVOP3Like(const T &...O) {
-  return getTSFlags(O...) & (VOP3 | VOP3P);
+  return getTSFlags(O...) &
+         (DontUseRawTSFlags::VOP3 | DontUseRawTSFlags::VOP3P);
 }
 template <typename... T> constexpr bool isVINTRP(const T &...O) {
-  return getTSFlags(O...) & VINTRP;
+  return getTSFlags(O...) & DontUseRawTSFlags::VINTRP;
 }
 template <typename... T> constexpr bool isSDWA(const T &...O) {
-  return getTSFlags(O...) & SDWA;
+  return getTSFlags(O...) & DontUseRawTSFlags::SDWA;
 }
 template <typename... T> constexpr bool isDPP(const T &...O) {
-  return getTSFlags(O...) & DPP;
+  return getTSFlags(O...) & DontUseRawTSFlags::DPP;
 }
 template <typename... T> constexpr bool isTRANS(const T &...O) {
-  return getTSFlags(O...) & TRANS;
+  return getTSFlags(O...) & DontUseRawTSFlags::TRANS;
 }
 template <typename... T> constexpr bool isMUBUF(const T &...O) {
-  return getTSFlags(O...) & MUBUF;
+  return getTSFlags(O...) & DontUseRawTSFlags::MUBUF;
 }
 template <typename... T> constexpr bool isMTBUF(const T &...O) {
-  return getTSFlags(O...) & MTBUF;
+  return getTSFlags(O...) & DontUseRawTSFlags::MTBUF;
 }
 template <typename... T> constexpr bool isBuffer(const T &...O) {
-  return getTSFlags(O...) & (MUBUF | MTBUF);
+  return getTSFlags(O...) &
+         (DontUseRawTSFlags::MUBUF | DontUseRawTSFlags::MTBUF);
 }
 template <typename... T> constexpr bool isSMRD(const T &...O) {
-  return getTSFlags(O...) & SMRD;
+  return getTSFlags(O...) & DontUseRawTSFlags::SMRD;
 }
 template <typename... T> constexpr bool isMIMG(const T &...O) {
-  return getTSFlags(O...) & MIMG;
+  return getTSFlags(O...) & DontUseRawTSFlags::MIMG;
 }
 template <typename... T> constexpr bool isVIMAGE(const T &...O) {
-  return getTSFlags(O...) & VIMAGE;
+  return getTSFlags(O...) & DontUseRawTSFlags::VIMAGE;
 }
 template <typename... T> constexpr bool isVSAMPLE(const T &...O) {
-  return getTSFlags(O...) & VSAMPLE;
+  return getTSFlags(O...) & DontUseRawTSFlags::VSAMPLE;
 }
 template <typename... T> constexpr bool isEXP(const T &...O) {
-  return getTSFlags(O...) & EXP;
+  return getTSFlags(O...) & DontUseRawTSFlags::EXP;
 }
 template <typename... T> constexpr bool isFLAT(const T &...O) {
-  return getTSFlags(O...) & FLAT;
+  return getTSFlags(O...) & DontUseRawTSFlags::FLAT;
 }
 template <typename... T> constexpr bool isDS(const T &...O) {
-  return getTSFlags(O...) & DS;
+  return getTSFlags(O...) & DontUseRawTSFlags::DS;
 }
 template <typename... T> constexpr bool isSpill(const T &...O) {
-  return getTSFlags(O...) & Spill;
+  return getTSFlags(O...) & DontUseRawTSFlags::Spill;
 }
 template <typename... T> constexpr bool isLDSDIR(const T &...O) {
-  return getTSFlags(O...) & LDSDIR;
+  return getTSFlags(O...) & DontUseRawTSFlags::LDSDIR;
 }
 template <typename... T> constexpr bool isVINTERP(const T &...O) {
-  return getTSFlags(O...) & VINTERP;
+  return getTSFlags(O...) & DontUseRawTSFlags::VINTERP;
 }
 template <typename... T> constexpr bool isWQM(const T &...O) {
-  return getTSFlags(O...) & WQM;
+  return getTSFlags(O...) & DontUseRawTSFlags::WQM;
 }
 template <typename... T> constexpr bool isDisableWQM(const T &...O) {
-  return getTSFlags(O...) & DisableWQM;
+  return getTSFlags(O...) & DontUseRawTSFlags::DisableWQM;
 }
 template <typename... T> constexpr bool isGather4(const T &...O) {
-  return getTSFlags(O...) & Gather4;
+  return getTSFlags(O...) & DontUseRawTSFlags::Gather4;
 }
 template <typename... T> constexpr bool usesTENSOR_CNT(const T &...O) {
-  return getTSFlags(O...) & TENSOR_CNT;
+  return getTSFlags(O...) & DontUseRawTSFlags::TENSOR_CNT;
 }
 template <typename... T> constexpr bool isScalarStore(const T &...O) {
-  return getTSFlags(O...) & SCALAR_STORE;
+  return getTSFlags(O...) & DontUseRawTSFlags::SCALAR_STORE;
 }
 template <typename... T> constexpr bool isFixedSize(const T &...O) {
-  return getTSFlags(O...) & FIXED_SIZE;
+  return getTSFlags(O...) & DontUseRawTSFlags::FIXED_SIZE;
 }
 template <typename... T> constexpr bool usesASYNC_CNT(const T &...O) {
-  return getTSFlags(O...) & ASYNC_CNT;
+  return getTSFlags(O...) & DontUseRawTSFlags::ASYNC_CNT;
 }
 template <typename... T> constexpr bool hasVOP3OpSel(const T &...O) {
-  return getTSFlags(O...) & VOP3_OPSEL;
+  return getTSFlags(O...) & DontUseRawTSFlags::VOP3_OPSEL;
 }
 template <typename... T> constexpr bool isMaybeAtomic(const T &...O) {
-  return getTSFlags(O...) & maybeAtomic;
+  return getTSFlags(O...) & DontUseRawTSFlags::maybeAtomic;
 }
 template <typename... T> constexpr bool hasFPClamp(const T &...O) {
-  return getTSFlags(O...) & FPClamp;
+  return getTSFlags(O...) & DontUseRawTSFlags::FPClamp;
 }
 template <typename... T> constexpr bool hasIntClamp(const T &...O) {
-  return getTSFlags(O...) & IntClamp;
+  return getTSFlags(O...) & DontUseRawTSFlags::IntClamp;
 }
 template <typename... T> constexpr bool hasClampLo(const T &...O) {
-  return getTSFlags(O...) & ClampLo;
+  return getTSFlags(O...) & DontUseRawTSFlags::ClampLo;
 }
 template <typename... T> constexpr bool hasClampHi(const T &...O) {
-  return getTSFlags(O...) & ClampHi;
+  return getTSFlags(O...) & DontUseRawTSFlags::ClampHi;
 }
 template <typename... T> constexpr bool isPacked(const T &...O) {
-  return getTSFlags(O...) & IsPacked;
+  return getTSFlags(O...) & DontUseRawTSFlags::IsPacked;
 }
 template <typename... T> constexpr bool isD16Buf(const T &...O) {
-  return getTSFlags(O...) & D16Buf;
+  return getTSFlags(O...) & DontUseRawTSFlags::D16Buf;
 }
 template <typename... T> constexpr bool isFlatGlobal(const T &...O) {
-  return getTSFlags(O...) & FlatGlobal;
+  return getTSFlags(O...) & DontUseRawTSFlags::FlatGlobal;
 }
 template <typename... T> constexpr bool usesFPDPRounding(const T &...O) {
-  return getTSFlags(O...) & FPDPRounding;
+  return getTSFlags(O...) & DontUseRawTSFlags::FPDPRounding;
 }
 template <typename... T> constexpr bool isFPAtomic(const T &...O) {
-  return getTSFlags(O...) & FPAtomic;
+  return getTSFlags(O...) & DontUseRawTSFlags::FPAtomic;
 }
 template <typename... T> constexpr bool isMAI(const T &...O) {
-  return getTSFlags(O...) & IsMAI;
+  return getTSFlags(O...) & DontUseRawTSFlags::IsMAI;
 }
 template <typename... T> constexpr bool isDOT(const T &...O) {
-  return getTSFlags(O...) & IsDOT;
+  return getTSFlags(O...) & DontUseRawTSFlags::IsDOT;
 }
 template <typename... T> constexpr bool isFlatScratch(const T &...O) {
-  return getTSFlags(O...) & FlatScratch;
+  return getTSFlags(O...) & DontUseRawTSFlags::FlatScratch;
 }
 template <typename... T> constexpr bool isAtomicNoRet(const T &...O) {
-  return getTSFlags(O...) & IsAtomicNoRet;
+  return getTSFlags(O...) & DontUseRawTSFlags::IsAtomicNoRet;
 }
 template <typename... T> constexpr bool isAtomicRet(const T &...O) {
-  return getTSFlags(O...) & IsAtomicRet;
+  return getTSFlags(O...) & DontUseRawTSFlags::IsAtomicRet;
 }
 template <typename... T> constexpr bool isWMMA(const T &...O) {
-  return getTSFlags(O...) & IsWMMA;
+  return getTSFlags(O...) & DontUseRawTSFlags::IsWMMA;
 }
 template <typename... T> constexpr bool isTiedSourceNotRead(const T &...O) {
-  return getTSFlags(O...) & TiedSourceNotRead;
+  return getTSFlags(O...) & DontUseRawTSFlags::TiedSourceNotRead;
 }
 template <typename... T> constexpr bool isNeverUniform(const T &...O) {
-  return getTSFlags(O...) & IsNeverUniform;
+  return getTSFlags(O...) & DontUseRawTSFlags::IsNeverUniform;
 }
 template <typename... T> constexpr bool isGWS(const T &...O) {
-  return getTSFlags(O...) & GWS;
+  return getTSFlags(O...) & DontUseRawTSFlags::GWS;
 }
 template <typename... T> constexpr bool isSWMMAC(const T &...O) {
-  return getTSFlags(O...) & IsSWMMAC;
+  return getTSFlags(O...) & DontUseRawTSFlags::IsSWMMAC;
 }
 template <typename... T> constexpr bool isVOPD3(const T &...O) {
-  return getTSFlags(O...) & VOPD3;
+  return getTSFlags(O...) & DontUseRawTSFlags::VOPD3;
 }
 template <typename... T> constexpr bool usesVM_CNT(const T &...O) {
-  return getTSFlags(O...) & VM_CNT;
+  return getTSFlags(O...) & DontUseRawTSFlags::VM_CNT;
 }
 template <typename... T> constexpr bool usesLGKM_CNT(const T &...O) {
-  return getTSFlags(O...) & LGKM_CNT;
+  return getTSFlags(O...) & DontUseRawTSFlags::LGKM_CNT;
 }
 
 // Compound predicates.



More information about the llvm-commits mailing list