Skip to content

Commit a3e0685

Browse files
[mlir][Transforms] More detailed error message when new IR cannot be legalized (#152297)
Print a more detailed error message when new/modified IR could not be legalized with `allowPatternRollback = false`. This is useful to understand why a pattern is incompatible with the new One-Shot Dialect Conversion driver. --------- Co-authored-by: Jeremy Kun <[email protected]>
1 parent 1110e2f commit a3e0685

File tree

1 file changed

+27
-2
lines changed

1 file changed

+27
-2
lines changed

mlir/lib/Transforms/Utils/DialectConversion.cpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2356,6 +2356,31 @@ OperationLegalizer::legalizeWithFold(Operation *op,
23562356
return success();
23572357
}
23582358

2359+
/// Report a fatal error indicating that newly produced or modified IR could
2360+
/// not be legalized.
2361+
static void
2362+
reportNewIrLegalizationFatalError(const Pattern &pattern,
2363+
const SetVector<Operation *> &newOps,
2364+
const SetVector<Operation *> &modifiedOps,
2365+
const SetVector<Block *> &insertedBlocks) {
2366+
auto newOpNames = llvm::map_range(
2367+
newOps, [](Operation *op) { return op->getName().getStringRef(); });
2368+
auto modifiedOpNames = llvm::map_range(
2369+
modifiedOps, [](Operation *op) { return op->getName().getStringRef(); });
2370+
StringRef detachedBlockStr = "(detached block)";
2371+
auto insertedBlockNames = llvm::map_range(insertedBlocks, [&](Block *block) {
2372+
if (block->getParentOp())
2373+
return block->getParentOp()->getName().getStringRef();
2374+
return detachedBlockStr;
2375+
});
2376+
llvm::report_fatal_error(
2377+
"pattern '" + pattern.getDebugName() +
2378+
"' produced IR that could not be legalized. " + "new ops: {" +
2379+
llvm::join(newOpNames, ", ") + "}, " + "modified ops: {" +
2380+
llvm::join(modifiedOpNames, ", ") + "}, " + "inserted block into ops: {" +
2381+
llvm::join(insertedBlockNames, ", ") + "}");
2382+
}
2383+
23592384
LogicalResult
23602385
OperationLegalizer::legalizeWithPattern(Operation *op,
23612386
ConversionPatternRewriter &rewriter) {
@@ -2444,8 +2469,8 @@ OperationLegalizer::legalizeWithPattern(Operation *op,
24442469
appliedPatterns.erase(&pattern);
24452470
if (failed(result)) {
24462471
if (!rewriterImpl.config.allowPatternRollback)
2447-
llvm::report_fatal_error("pattern '" + pattern.getDebugName() +
2448-
"' produced IR that could not be legalized");
2472+
reportNewIrLegalizationFatalError(pattern, newOps, modifiedOps,
2473+
insertedBlocks);
24492474
rewriterImpl.resetState(curState, pattern.getDebugName());
24502475
}
24512476
if (config.listener)

0 commit comments

Comments
 (0)