[Mlir-commits] [mlir] [mlir][Transforms] Dialect conversion: Add flag to dump materialization kind (PR #119532)
Matthias Springer
llvmlistbot at llvm.org
Mon Aug 18 06:12:09 PDT 2025
https://github.com/matthias-springer updated https://github.com/llvm/llvm-project/pull/119532
>From 3dc17c351208f3a0094547a719ed9a1dccd45401 Mon Sep 17 00:00:00 2001
From: Matthias Springer <me at m-sp.org>
Date: Mon, 18 Aug 2025 08:49:48 +0000
Subject: [PATCH] [mlir][Transforms] Dialect conversion: Add flag to dump
materialization kind
---
.../mlir/Transforms/DialectConversion.h | 6 ++++
.../Transforms/Utils/DialectConversion.cpp | 5 +++
mlir/test/Transforms/test-legalizer.mlir | 13 ++++++--
mlir/test/lib/Dialect/Test/TestPatterns.cpp | 32 +++++++++++--------
4 files changed, 41 insertions(+), 15 deletions(-)
diff --git a/mlir/include/mlir/Transforms/DialectConversion.h b/mlir/include/mlir/Transforms/DialectConversion.h
index 220431e6ee2f1..536b23f5c33c1 100644
--- a/mlir/include/mlir/Transforms/DialectConversion.h
+++ b/mlir/include/mlir/Transforms/DialectConversion.h
@@ -1300,6 +1300,12 @@ struct ConversionConfig {
/// The folding mode to use during conversion.
DialectConversionFoldingMode foldingMode =
DialectConversionFoldingMode::BeforePatterns;
+
+ /// If set to "true", the materialization kind ("source" or "target") will be
+ /// attached to "builtin.unrealized_conversion_cast" ops. This flag is useful
+ /// for debugging, to find out what kind of materialization rule may be
+ /// missing.
+ bool attachDebugMaterializationKind = false;
};
//===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index ff34a58965763..e48cfca486808 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -1637,6 +1637,11 @@ ValueRange ConversionPatternRewriterImpl::buildUnresolvedMaterialization(
builder.setInsertionPoint(ip.getBlock(), ip.getPoint());
UnrealizedConversionCastOp convertOp =
UnrealizedConversionCastOp::create(builder, loc, outputTypes, inputs);
+ if (config.attachDebugMaterializationKind) {
+ StringRef kindStr =
+ kind == MaterializationKind::Source ? "source" : "target";
+ convertOp->setAttr("__kind__", builder.getStringAttr(kindStr));
+ }
if (isPureTypeConversion)
convertOp->setAttr(kPureTypeConversionMarker, builder.getUnitAttr());
diff --git a/mlir/test/Transforms/test-legalizer.mlir b/mlir/test/Transforms/test-legalizer.mlir
index 55d153db7f4bb..3fa42ff6b2757 100644
--- a/mlir/test/Transforms/test-legalizer.mlir
+++ b/mlir/test/Transforms/test-legalizer.mlir
@@ -1,6 +1,7 @@
// RUN: mlir-opt -allow-unregistered-dialect -split-input-file -test-legalize-patterns="allow-pattern-rollback=1" -verify-diagnostics %s | FileCheck %s
// RUN: mlir-opt -allow-unregistered-dialect -split-input-file -test-legalize-patterns="allow-pattern-rollback=1" -verify-diagnostics -profile-actions-to=- %s | FileCheck %s --check-prefix=CHECK-PROFILER
// RUN: mlir-opt -allow-unregistered-dialect -split-input-file -test-legalize-patterns="allow-pattern-rollback=0" -verify-diagnostics %s | FileCheck %s
+// RUN: mlir-opt -allow-unregistered-dialect -split-input-file -test-legalize-patterns="allow-pattern-rollback=0 build-materializations=0 attach-debug-materialization-kind=1" -verify-diagnostics %s | FileCheck %s --check-prefix=CHECK-KIND
// CHECK-PROFILER: "name": "pass-execution", "cat": "PERF", "ph": "B"
// CHECK-PROFILER: "name": "apply-conversion", "cat": "PERF", "ph": "B"
@@ -190,9 +191,12 @@ func.func @remap_drop_region() {
// -----
// CHECK-LABEL: func @dropped_input_in_use
+// CHECK-KIND-LABEL: func @dropped_input_in_use
func.func @dropped_input_in_use(%arg: i16, %arg2: i64) {
- // CHECK-NEXT: "test.cast"{{.*}} : () -> i16
- // CHECK-NEXT: "work"{{.*}} : (i16)
+ // CHECK-NEXT: %[[cast:.*]] = "test.cast"() : () -> i16
+ // CHECK-NEXT: "work"(%[[cast]]) : (i16)
+ // CHECK-KIND-NEXT: %[[cast:.*]] = builtin.unrealized_conversion_cast to i16 {__kind__ = "source"}
+ // CHECK-KIND-NEXT: "work"(%[[cast]]) : (i16)
// expected-remark at +1 {{op 'work' is not legalizable}}
"work"(%arg) : (i16) -> ()
}
@@ -430,6 +434,11 @@ func.func @test_multiple_1_to_n_replacement() {
// CHECK: %[[cast:.*]] = "test.cast"(%[[producer]]) : (i16) -> f64
// CHECK: "test.valid_consumer"(%[[cast]]) : (f64) -> ()
// CHECK: "test.valid_consumer"(%[[producer]]) : (i16) -> ()
+// CHECK-KIND-LABEL: func @test_lookup_without_converter
+// CHECK-KIND: %[[producer:.*]] = "test.valid_producer"() : () -> i16
+// CHECK-KIND: %[[cast:.*]] = builtin.unrealized_conversion_cast %[[producer]] : i16 to f64 {__kind__ = "target"}
+// CHECK-KIND: "test.valid_consumer"(%[[cast]]) : (f64) -> ()
+// CHECK-KIND: "test.valid_consumer"(%[[producer]]) : (i16) -> ()
func.func @test_lookup_without_converter() {
%0 = "test.replace_with_valid_producer"() {type = i16} : () -> (i64)
"test.replace_with_valid_consumer"(%0) {with_converter} : (i64) -> ()
diff --git a/mlir/test/lib/Dialect/Test/TestPatterns.cpp b/mlir/test/lib/Dialect/Test/TestPatterns.cpp
index 6300c5b0ca21c..b6f16ac1b5c48 100644
--- a/mlir/test/lib/Dialect/Test/TestPatterns.cpp
+++ b/mlir/test/lib/Dialect/Test/TestPatterns.cpp
@@ -1574,15 +1574,19 @@ struct TestLegalizePatternDriver
target.addDynamicallyLegalOp<ConvertBlockArgsOp>(
[](ConvertBlockArgsOp op) { return op.getIsLegal(); });
+ // Set up configuration.
+ ConversionConfig config;
+ config.allowPatternRollback = allowPatternRollback;
+ config.foldingMode = foldingMode;
+ config.buildMaterializations = buildMaterializations;
+ config.attachDebugMaterializationKind = attachDebugMaterializationKind;
+ DumpNotifications dumpNotifications;
+ config.listener = &dumpNotifications;
+
// Handle a partial conversion.
if (mode == ConversionMode::Partial) {
DenseSet<Operation *> unlegalizedOps;
- ConversionConfig config;
- config.allowPatternRollback = allowPatternRollback;
- DumpNotifications dumpNotifications;
- config.listener = &dumpNotifications;
config.unlegalizedOps = &unlegalizedOps;
- config.foldingMode = foldingMode;
if (failed(applyPartialConversion(getOperation(), target,
std::move(patterns), config))) {
getOperation()->emitRemark() << "applyPartialConversion failed";
@@ -1600,11 +1604,6 @@ struct TestLegalizePatternDriver
return (bool)op->getAttrOfType<UnitAttr>("test.dynamically_legal");
});
- ConversionConfig config;
- config.allowPatternRollback = allowPatternRollback;
- DumpNotifications dumpNotifications;
- config.foldingMode = foldingMode;
- config.listener = &dumpNotifications;
if (failed(applyFullConversion(getOperation(), target,
std::move(patterns), config))) {
getOperation()->emitRemark() << "applyFullConversion failed";
@@ -1617,9 +1616,6 @@ struct TestLegalizePatternDriver
// Analyze the convertible operations.
DenseSet<Operation *> legalizedOps;
- ConversionConfig config;
- config.foldingMode = foldingMode;
- config.allowPatternRollback = allowPatternRollback;
config.legalizableOps = &legalizedOps;
if (failed(applyAnalysisConversion(getOperation(), target,
std::move(patterns), config)))
@@ -1658,6 +1654,16 @@ struct TestLegalizePatternDriver
Option<bool> allowPatternRollback{*this, "allow-pattern-rollback",
llvm::cl::desc("Allow pattern rollback"),
llvm::cl::init(true)};
+ Option<bool> attachDebugMaterializationKind{
+ *this, "attach-debug-materialization-kind",
+ llvm::cl::desc(
+ "Attach materialization kind to unrealized_conversion_cast ops"),
+ llvm::cl::init(false)};
+ Option<bool> buildMaterializations{
+ *this, "build-materializations",
+ llvm::cl::desc(
+ "If set to 'false', leave unrealized_conversion_cast ops in place"),
+ llvm::cl::init(true)};
};
} // namespace
More information about the Mlir-commits
mailing list