diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp index f23c6197accd5..d06ea7001cbdb 100644 --- a/mlir/lib/Transforms/Utils/DialectConversion.cpp +++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp @@ -2302,6 +2302,31 @@ 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 &newOps, + const SetVector &modifiedOps, + const SetVector &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)"; + 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: {" + + llvm::join(newOpNames, ", ") + "}, " + "modified ops: {" + + llvm::join(modifiedOpNames, ", ") + "}, " + "inserted block into ops: {" + + llvm::join(insertedBlockNames, ", ") + "}"); +} + LogicalResult OperationLegalizer::legalizeWithPattern(Operation *op, ConversionPatternRewriter &rewriter) { @@ -2389,8 +2414,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)