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

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 20 03:44:51 PST 2026


================
@@ -90,6 +138,93 @@ 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 Expected = Src.consume_front(SWaitAluImmPrefix);
+  if (!Expected)
+    return ErrorCallback(Src.begin(), "expected prefix");
+  bool Empty = true;
+
+  // 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 Delim1Idx = Src.find(SWaitAluDelim);
+    if (Delim1Idx == StringRef::npos) {
+      if (Empty)
+        return ErrorCallback(Src.begin() + Src.size(),
+                             "expected <CounterName>_<CounterNum>");
+      break;
+    }
+    // Src: Name1_Num1_Name2_Num2
+    //      ^^^^^
+    StringRef Name = Src.substr(0, Delim1Idx);
+    // Src: Name1_Num1_Name2_Num2
+    //                ^
+    size_t Delim2Idx = Src.find(SWaitAluDelim, Delim1Idx + 1);
+    // Src: Name1_Num1_Name2_Num2
+    //            ^^^^
+    StringRef NumStr = Src.substr(Delim1Idx + 1, Delim2Idx);
+    if (Name.empty() || NumStr.empty())
+      return ErrorCallback(Src.begin() + Delim1Idx,
+                           "expected <CounterName>_<CounterNum>");
+    // Make sure the counter number is legal.
+    int64_t Num;
+    if (NumStr.consumeInteger(10, Num) || Num < 0)
+      return ErrorCallback(Src.begin() + Delim1Idx + 1,
+                           "expected non-negative integer counter number");
+
+    // Encode the counter number into Imm.
+    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(Src.begin(), "bad counter name");
----------------
arsenm wrote:

```suggestion
      return ErrorCallback(Src.begin(), "invalid counter name");
```

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


More information about the llvm-commits mailing list