[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