From d35976d0f8a0ceaa56a5c025ea0747028604e367 Mon Sep 17 00:00:00 2001 From: Jacques Pienaar Date: Thu, 11 Sep 2025 10:30:34 +0000 Subject: [PATCH 1/4] [mlir] Expand error message to include unregistered dialects. It is possible to load unregistered dialects, this can result in a confusing error message. Mark unregistered but loaded dialects. This is currently done as a merged list as that is most concise but requires some additional preprocessing (did merge sort given the other two lists are, could do it shorter and probably at not too much extra cost if I just used SetVectors). --- mlir/lib/AsmParser/Parser.cpp | 42 ++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/mlir/lib/AsmParser/Parser.cpp b/mlir/lib/AsmParser/Parser.cpp index 435ff713a1b29..86ffe41092547 100644 --- a/mlir/lib/AsmParser/Parser.cpp +++ b/mlir/lib/AsmParser/Parser.cpp @@ -2077,9 +2077,45 @@ OperationParser::parseCustomOperation(ArrayRef resultIDs) { diag << " (tried '" << opName << "' as well)"; auto ¬e = diag.attachNote(); note << "Registered dialects: "; - llvm::interleaveComma(getContext()->getAvailableDialects(), note, - [&](StringRef dialect) { note << dialect; }); - note << " ; for more info on dialect registration see " + std::vector registered = getContext()->getAvailableDialects(); + auto loaded = getContext()->getLoadedDialects(); + + // Merge the sorted lists of registered and loaded dialects. + SmallVector> mergedDialects; + auto regIt = registered.begin(), regEnd = registered.end(); + auto loadIt = loaded.rbegin(), loadEnd = loaded.rend(); + bool isRegistered = false; + bool isOnlyLoaded = true; + while (regIt != regEnd && loadIt != loadEnd) { + StringRef reg = *regIt; + StringRef load = (*loadIt)->getNamespace(); + if (reg < load) { + mergedDialects.emplace_back(*regIt++, isRegistered); + } else if (load < reg) { + mergedDialects.emplace_back(load, isOnlyLoaded); + loadIt++; + } else { + mergedDialects.emplace_back(*regIt++, isRegistered); + loadIt++; + } + } + for (; regIt != regEnd; ++regIt) + mergedDialects.emplace_back(*regIt, isRegistered); + for (; loadIt != loadEnd; ++loadIt) + mergedDialects.emplace_back((*loadIt)->getNamespace(), isOnlyLoaded); + + bool loadedUnregistered = false; + llvm::interleaveComma(mergedDialects, note, [&](auto &pair) { + note << pair.first; + if (pair.second) { + loadedUnregistered = true; + note << " (*)"; + } + }); + note << " "; + if (loadedUnregistered) + note << "(* corresponding to loaded but unregistered dialects)"; + note << "; for more info on dialect registration see " "https://mlir.llvm.org/getting_started/Faq/" "#registered-loaded-dependent-whats-up-with-dialects-management"; return nullptr; From 30abb6b54dca0bedb0fdcdc762e61882d9dbde04 Mon Sep 17 00:00:00 2001 From: Jacques Pienaar Date: Wed, 17 Sep 2025 00:24:51 -0700 Subject: [PATCH 2/4] Update mlir/lib/AsmParser/Parser.cpp Co-authored-by: Mehdi Amini --- mlir/lib/AsmParser/Parser.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mlir/lib/AsmParser/Parser.cpp b/mlir/lib/AsmParser/Parser.cpp index 86ffe41092547..a50c507cd7001 100644 --- a/mlir/lib/AsmParser/Parser.cpp +++ b/mlir/lib/AsmParser/Parser.cpp @@ -2089,14 +2089,14 @@ OperationParser::parseCustomOperation(ArrayRef resultIDs) { while (regIt != regEnd && loadIt != loadEnd) { StringRef reg = *regIt; StringRef load = (*loadIt)->getNamespace(); - if (reg < load) { - mergedDialects.emplace_back(*regIt++, isRegistered); - } else if (load < reg) { + if (load < reg) { mergedDialects.emplace_back(load, isOnlyLoaded); - loadIt++; + ++loadIt; } else { - mergedDialects.emplace_back(*regIt++, isRegistered); - loadIt++; + mergedDialects.emplace_back(reg, isRegistered); + ++regIt; + if (reg == load) + ++loadIt; } } for (; regIt != regEnd; ++regIt) From b6fafd7b8d8d602be082b97b0184a7f2cf82d79c Mon Sep 17 00:00:00 2001 From: Jacques Pienaar Date: Wed, 17 Sep 2025 00:25:00 -0700 Subject: [PATCH 3/4] Update mlir/lib/AsmParser/Parser.cpp Co-authored-by: Mehdi Amini --- mlir/lib/AsmParser/Parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlir/lib/AsmParser/Parser.cpp b/mlir/lib/AsmParser/Parser.cpp index a50c507cd7001..82bdb844480f1 100644 --- a/mlir/lib/AsmParser/Parser.cpp +++ b/mlir/lib/AsmParser/Parser.cpp @@ -2076,7 +2076,7 @@ OperationParser::parseCustomOperation(ArrayRef resultIDs) { if (originalOpName != opName) diag << " (tried '" << opName << "' as well)"; auto ¬e = diag.attachNote(); - note << "Registered dialects: "; + note << "Available dialects: "; std::vector registered = getContext()->getAvailableDialects(); auto loaded = getContext()->getLoadedDialects(); From 1b4ab51ace3f79ae8b436dbbfe3a8b9df011031d Mon Sep 17 00:00:00 2001 From: Jacques Pienaar Date: Thu, 18 Sep 2025 08:46:35 +0200 Subject: [PATCH 4/4] Update invalid.mlir --- mlir/test/IR/invalid.mlir | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlir/test/IR/invalid.mlir b/mlir/test/IR/invalid.mlir index d0bbf8669b63d..89077ef0f4736 100644 --- a/mlir/test/IR/invalid.mlir +++ b/mlir/test/IR/invalid.mlir @@ -114,7 +114,7 @@ func.func @non_operation() { func.func @unknown_dialect_operation() { // expected-error@below {{Dialect `foo' not found for custom op 'foo.asd'}} - // expected-note-re@below {{Registered dialects:{{.*}} test{{.*}}}} + // expected-note-re@below {{Available dialects:{{.*}} test{{.*}}}} foo.asd }