[Mlir-commits] [mlir] [mlir][Transforms] More detailed error message when new IR cannot be legalized (PR #152297)

Matthias Springer llvmlistbot at llvm.org
Thu Aug 7 00:04:48 PDT 2025


https://github.com/matthias-springer updated https://github.com/llvm/llvm-project/pull/152297

>From c53c18e526ab12b84720c85eea3a84ed3a5f38aa Mon Sep 17 00:00:00 2001
From: Matthias Springer <me at m-sp.org>
Date: Wed, 6 Aug 2025 12:03:28 +0000
Subject: [PATCH 1/3] [mlir][Transforms] More detailed error message when new
 IR cannot be legalized

---
 .../Transforms/Utils/DialectConversion.cpp    | 35 +++++++++++++++++--
 1 file changed, 33 insertions(+), 2 deletions(-)

diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index f23c6197accd5..463394c19b51c 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -2302,6 +2302,37 @@ OperationLegalizer::legalizeWithFold(Operation *op,
   return success();
 }
 
+/// Report a fatal error indicating that newly produced or modified IR could
+/// not be legalized.
+static void
+reportNewIrLegalizationFatalError(const Pattern &pattern,
+                                  const SetVector<Operation *> &newOps,
+                                  const SetVector<Operation *> &modifiedOps,
+                                  const SetVector<Block *> &insertedBlocks) {
+  StringRef detachedBlockStr = "(detached block)";
+  std::string newOpNames = llvm::join(
+      llvm::map_range(
+          newOps, [](Operation *op) { return op->getName().getStringRef(); }),
+      ", ");
+  std::string modifiedOpNames = llvm::join(
+      llvm::map_range(
+          newOps, [](Operation *op) { return op->getName().getStringRef(); }),
+      ", ");
+  std::string insertedBlockNames = llvm::join(
+      llvm::map_range(insertedBlocks,
+                      [&](Block *block) {
+                        if (block->getParentOp())
+                          return block->getParentOp()->getName().getStringRef();
+                        return detachedBlockStr;
+                      }),
+      ", ");
+  llvm::report_fatal_error(
+      "pattern '" + pattern.getDebugName() +
+      "' produced IR that could not be legalized. " + "new ops: {" +
+      newOpNames + "}, " + "modified ops: {" + modifiedOpNames + "}, " +
+      "inserted block into ops: {" + insertedBlockNames + "}");
+}
+
 LogicalResult
 OperationLegalizer::legalizeWithPattern(Operation *op,
                                         ConversionPatternRewriter &rewriter) {
@@ -2389,8 +2420,8 @@ OperationLegalizer::legalizeWithPattern(Operation *op,
     appliedPatterns.erase(&pattern);
     if (failed(result)) {
       if (!rewriterImpl.config.allowPatternRollback)
-        llvm::report_fatal_error("pattern '" + pattern.getDebugName() +
-                                 "' produced IR that could not be legalized");
+        reportNewIrLegalizationFatalError(pattern, newOps, modifiedOps,
+                                          insertedBlocks);
       rewriterImpl.resetState(curState, pattern.getDebugName());
     }
     if (config.listener)

>From 6d03ac0886a9a78ffcee34ba0e03d58dc650b023 Mon Sep 17 00:00:00 2001
From: Matthias Springer <me at m-sp.org>
Date: Thu, 7 Aug 2025 08:33:57 +0200
Subject: [PATCH 2/3] Update mlir/lib/Transforms/Utils/DialectConversion.cpp

Co-authored-by: Jeremy Kun <jkun at google.com>
---
 mlir/lib/Transforms/Utils/DialectConversion.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index 463394c19b51c..3455e6be3ba7c 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -2316,7 +2316,7 @@ reportNewIrLegalizationFatalError(const Pattern &pattern,
       ", ");
   std::string modifiedOpNames = llvm::join(
       llvm::map_range(
-          newOps, [](Operation *op) { return op->getName().getStringRef(); }),
+          modifiedOps, [](Operation *op) { return op->getName().getStringRef(); }),
       ", ");
   std::string insertedBlockNames = llvm::join(
       llvm::map_range(insertedBlocks,

>From 73dfec2204e7f19929c1d5bb135e67764f147be9 Mon Sep 17 00:00:00 2001
From: Matthias Springer <me at m-sp.org>
Date: Thu, 7 Aug 2025 06:39:16 +0000
Subject: [PATCH 3/3] reformat

---
 .../Transforms/Utils/DialectConversion.cpp    | 30 ++++++++-----------
 1 file changed, 12 insertions(+), 18 deletions(-)

diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index 3455e6be3ba7c..d06ea7001cbdb 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -2309,28 +2309,22 @@ reportNewIrLegalizationFatalError(const Pattern &pattern,
                                   const SetVector<Operation *> &newOps,
                                   const SetVector<Operation *> &modifiedOps,
                                   const SetVector<Block *> &insertedBlocks) {
+  auto newOpNames = llvm::map_range(
+      newOps, [](Operation *op) { return op->getName().getStringRef(); });
+  auto modifiedOpNames = llvm::map_range(
+      modifiedOps, [](Operation *op) { return op->getName().getStringRef(); });
   StringRef detachedBlockStr = "(detached block)";
-  std::string newOpNames = llvm::join(
-      llvm::map_range(
-          newOps, [](Operation *op) { return op->getName().getStringRef(); }),
-      ", ");
-  std::string modifiedOpNames = llvm::join(
-      llvm::map_range(
-          modifiedOps, [](Operation *op) { return op->getName().getStringRef(); }),
-      ", ");
-  std::string insertedBlockNames = llvm::join(
-      llvm::map_range(insertedBlocks,
-                      [&](Block *block) {
-                        if (block->getParentOp())
-                          return block->getParentOp()->getName().getStringRef();
-                        return detachedBlockStr;
-                      }),
-      ", ");
+  auto insertedBlockNames = llvm::map_range(insertedBlocks, [&](Block *block) {
+    if (block->getParentOp())
+      return block->getParentOp()->getName().getStringRef();
+    return detachedBlockStr;
+  });
   llvm::report_fatal_error(
       "pattern '" + pattern.getDebugName() +
       "' produced IR that could not be legalized. " + "new ops: {" +
-      newOpNames + "}, " + "modified ops: {" + modifiedOpNames + "}, " +
-      "inserted block into ops: {" + insertedBlockNames + "}");
+      llvm::join(newOpNames, ", ") + "}, " + "modified ops: {" +
+      llvm::join(modifiedOpNames, ", ") + "}, " + "inserted block into ops: {" +
+      llvm::join(insertedBlockNames, ", ") + "}");
 }
 
 LogicalResult



More information about the Mlir-commits mailing list