[llvm] [AMDGPU] Introduce custom MIR formatting for s_wait_alu (PR #176316)

Jay Foad via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 27 02:13:24 PST 2026


================
@@ -90,6 +138,88 @@ void AMDGPUMIRFormatter::printSDelayAluImm(int64_t Imm,
   Outdep(Id1);
 }
 
+bool AMDGPUMIRFormatter::parseSWaitAluImmMnemonic(
+    const unsigned int OpIdx, int64_t &Imm, llvm::StringRef &Src,
+    llvm::MIRFormatter::ErrorCallbackType &ErrorCallback) const {
+  // TODO: For now accept integer masks for compatibility with old MIR.
+  if (!Src.consumeInteger(10, Imm))
+    return false;
+
+  // Initialize with all checks off.
+  Imm = AMDGPU::DepCtr::getDefaultDepCtrEncoding(STI);
+  // The input is in the form: .Name1_Num1_Name2_Num2
+  // Drop the '.' prefix.
+  bool ConsumePrefix = Src.consume_front(SWaitAluImmPrefix);
+  if (!ConsumePrefix)
+    return ErrorCallback(Src.begin(), "expected prefix");
+  if (Src.empty())
+    return ErrorCallback(Src.begin(), "expected <CounterName>_<CounterNum>");
+
+  // Special case for all off.
+  if (Src == AllOff)
+    return false;
+
+  // Parse a counter name, number pair in each iteration.
+  while (!Src.empty()) {
+    // Src: Name1_Num1_Name2_Num2
+    //           ^
+    size_t DelimIdx = Src.find(SWaitAluDelim);
+    if (DelimIdx == StringRef::npos)
+      return ErrorCallback(Src.begin(), "expected <CounterName>_<CounterNum>");
+    // Src: Name1_Num1_Name2_Num2
+    //      ^^^^^
+    StringRef Name = Src.substr(0, DelimIdx);
+    // Save the position of the name for accurate error reporting.
+    StringRef::iterator NamePos = Src.begin();
+    bool ConsumeName = Src.consume_front(Name);
+    assert(ConsumeName && "Expected name");
+    bool ConsumeDelim = Src.consume_front(SWaitAluDelim);
+    assert(ConsumeDelim && "Expected delimiter");
+    // Src:       Num1_Name2_Num2
+    //                ^
+    DelimIdx = Src.find(SWaitAluDelim);
+    // Src:       Num1_Name2_Num2
+    //            ^^^^
+    int64_t Num;
+    // Save the position of the number for accurate error reporting.
+    StringRef::iterator NumPos = Src.begin();
+    if (Src.consumeInteger(10, Num) || Num < 0)
+      return ErrorCallback(NumPos,
+                           "expected non-negative integer counter number");
+    unsigned Max;
+    if (Name == VaVdstName) {
+      Max = llvm::AMDGPU::DepCtr::getVaVdstBitMask();
+      Imm = llvm::AMDGPU::DepCtr::encodeFieldVaVdst(Imm, Num);
+    } else if (Name == VmVsrcName) {
+      Max = llvm::AMDGPU::DepCtr::getVmVsrcBitMask();
+      Imm = llvm::AMDGPU::DepCtr::encodeFieldVmVsrc(Imm, Num);
+    } else if (Name == VaSdstName) {
+      Max = llvm::AMDGPU::DepCtr::getVaSdstBitMask();
+      Imm = llvm::AMDGPU::DepCtr::encodeFieldVaSdst(Imm, Num);
+    } else if (Name == VaSsrcName) {
+      Max = llvm::AMDGPU::DepCtr::getVaSsrcBitMask();
+      Imm = llvm::AMDGPU::DepCtr::encodeFieldVaSsrc(Imm, Num);
+    } else if (Name == HoldCntName) {
+      Max = llvm::AMDGPU::DepCtr::getHoldCntBitMask(STI);
+      Imm = llvm::AMDGPU::DepCtr::encodeFieldHoldCnt(Imm, Num);
+    } else if (Name == VaVccName) {
+      Max = llvm::AMDGPU::DepCtr::getVaVccBitMask();
+      Imm = llvm::AMDGPU::DepCtr::encodeFieldVaVcc(Imm, Num);
+    } else if (Name == SaSdstName) {
+      Max = llvm::AMDGPU::DepCtr::getSaSdstBitMask();
+      Imm = llvm::AMDGPU::DepCtr::encodeFieldSaSdst(Imm, Num);
+    } else {
+      return ErrorCallback(NamePos, "invalid counter name");
+    }
+    // Don't allow the values to reach their maximum value.
+    if (Num >= Max)
+      return ErrorCallback(NumPos, "counter value too large");
+    // Src:            Name2_Num2
+    Src.consume_front(SWaitAluDelim);
----------------
jayfoad wrote:

Same here, I find consume a bit weird when you already know it matches.

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


More information about the llvm-commits mailing list