[Mlir-commits] [mlir] 4d79405 - [mlir] Add missing materialization function diag for dialect convertion (#207689)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Aug 3 09:59:53 PDT 2026
Author: lonely eagle
Date: 2026-08-04T00:59:49+08:00
New Revision: 4d7940544ffa50ef9fa8ccc506f5f70a8bf93166
URL: https://github.com/llvm/llvm-project/commit/4d7940544ffa50ef9fa8ccc506f5f70a8bf93166
DIFF: https://github.com/llvm/llvm-project/commit/4d7940544ffa50ef9fa8ccc506f5f70a8bf93166.diff
LOG: [mlir] Add missing materialization function diag for dialect convertion (#207689)
This Patch adds more precise diagnostics for when a pass is missing a
target/source materialization function, making it easier to locate the
issue in the pass.
Added:
Modified:
mlir/lib/Transforms/Utils/DialectConversion.cpp
mlir/test/Dialect/Arith/emulate-wide-int-unsupported.mlir
mlir/test/Transforms/test-legalize-type-conversion.mlir
mlir/test/python/rewrite.py
Removed:
################################################################################
diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index c8db49c226e43..75d5620f0f298 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -3382,14 +3382,26 @@ legalizeUnresolvedMaterialization(RewriterBase &rewriter,
rewriter.replaceOp(op, newMaterialization);
return success();
}
+ StringRef direction =
+ info.getMaterializationKind() == MaterializationKind::Target ? "target"
+ : "source";
+ InFlightDiagnostic diag =
+ op.emitError()
+ << "failed to legalize unresolved " << direction
+ << " materialization from (" << inputOperands.getTypes() << ") to ("
+ << op.getResultTypes()
+ << ") that remained live after conversion (no matching callback)";
+ diag.attachNote(op->getUsers().begin()->getLoc())
+ << "see existing live user here: " << *op->getUsers().begin();
+ return failure();
}
- InFlightDiagnostic diag = op->emitError()
- << "failed to legalize unresolved materialization "
- "from ("
- << inputOperands.getTypes() << ") to ("
- << op.getResultTypes()
- << ") that remained live after conversion";
+ InFlightDiagnostic diag =
+ op->emitError()
+ << "failed to legalize unresolved materialization "
+ "from ("
+ << inputOperands.getTypes() << ") to (" << op.getResultTypes()
+ << ") that remained live after conversion (no type converter specified)";
diag.attachNote(op->getUsers().begin()->getLoc())
<< "see existing live user here: " << *op->getUsers().begin();
return failure();
diff --git a/mlir/test/Dialect/Arith/emulate-wide-int-unsupported.mlir b/mlir/test/Dialect/Arith/emulate-wide-int-unsupported.mlir
index 44f09b920ed4f..30dae88a255d9 100644
--- a/mlir/test/Dialect/Arith/emulate-wide-int-unsupported.mlir
+++ b/mlir/test/Dialect/Arith/emulate-wide-int-unsupported.mlir
@@ -45,7 +45,7 @@ func.func @unsupported_argument_type(%arg0: vector<4xi128>) -> vector<4xi64> {
// Ensure this case not crash
func.func @unsupported_vector(%arg0: vector<2xi1>) {
- // expected-error at +1 {{failed to legalize unresolved materialization from ('vector<2x2xi32>') to ('vector<2xi64>') that remained live after conversion}}
+ // expected-error at +1 {{failed to legalize unresolved source materialization from ('vector<2x2xi32>') to ('vector<2xi64>') that remained live after conversion (no matching callback)}}
%cst_0 = arith.constant dense<0> : vector<2xi64>
// expected-note at +1 {{see existing live user here}}
%0 = vector.mask %arg0 { vector.multi_reduction <xor>, %cst_0, %cst_0 [] : vector<2xi64> to vector<2xi64> } : vector<2xi1> -> vector<2xi64>
diff --git a/mlir/test/Transforms/test-legalize-type-conversion.mlir b/mlir/test/Transforms/test-legalize-type-conversion.mlir
index 1453045c3bfbc..7a8bf06a3a060 100644
--- a/mlir/test/Transforms/test-legalize-type-conversion.mlir
+++ b/mlir/test/Transforms/test-legalize-type-conversion.mlir
@@ -2,7 +2,7 @@
func.func @test_invalid_arg_materialization(
- // expected-error at below {{failed to legalize unresolved materialization from () to ('i16') that remained live after conversion}}
+ // expected-error at below {{failed to legalize unresolved source materialization from () to ('i16') that remained live after conversion (no matching callback)}}
%arg0: i16) {
// expected-note at below{{see existing live user here}}
"foo.return"(%arg0) : (i16) -> ()
@@ -21,7 +21,7 @@ func.func @test_valid_arg_materialization(%arg0: i64) {
// -----
func.func @test_invalid_result_materialization() {
- // expected-error at below {{failed to legalize unresolved materialization from ('f64') to ('f16') that remained live after conversion}}
+ // expected-error at below {{failed to legalize unresolved source materialization from ('f64') to ('f16') that remained live after conversion (no matching callback)}}
%result = "test.type_producer"() : () -> f16
// expected-note at below{{see existing live user here}}
"foo.return"(%result) : (f16) -> ()
@@ -30,7 +30,7 @@ func.func @test_invalid_result_materialization() {
// -----
func.func @test_invalid_result_materialization() {
- // expected-error at below {{failed to legalize unresolved materialization from ('f64') to ('f16') that remained live after conversion}}
+ // expected-error at below {{failed to legalize unresolved source materialization from ('f64') to ('f16') that remained live after conversion (no matching callback)}}
%result = "test.type_producer"() : () -> f16
// expected-note at below{{see existing live user here}}
"foo.return"(%result) : (f16) -> ()
@@ -50,7 +50,7 @@ func.func @test_transitive_use_materialization() {
// -----
func.func @test_transitive_use_invalid_materialization() {
- // expected-error at below {{failed to legalize unresolved materialization from ('f64') to ('f16') that remained live after conversion}}
+ // expected-error at below {{failed to legalize unresolved source materialization from ('f64') to ('f16') that remained live after conversion (no matching callback)}}
%result = "test.another_type_producer"() : () -> f16
// expected-note at below{{see existing live user here}}
"foo.return"(%result) : (f16) -> ()
@@ -102,7 +102,7 @@ func.func @test_block_argument_not_converted() {
// Make sure argument type changes aren't implicitly forwarded.
func.func @test_signature_conversion_no_converter() {
"test.signature_conversion_no_converter"() ({
- // expected-error at below {{failed to legalize unresolved materialization from ('f64') to ('f32') that remained live after conversion}}
+ // expected-error at below {{failed to legalize unresolved materialization from ('f64') to ('f32') that remained live after conversion (no type converter specified)}}
^bb0(%arg0: f32):
// expected-note at below{{see existing live user here}}
"test.type_consumer"(%arg0) : (f32) -> ()
@@ -194,7 +194,7 @@ gpu.module @cuda_events {
// hashes and could
diff er with LLVM_ENABLE_REVERSE_ITERATION.
func.func @test_deterministic_materialization_order() {
- // expected-error at below {{failed to legalize unresolved materialization from ('f64') to ('f16') that remained live after conversion}}
+ // expected-error at below {{failed to legalize unresolved source materialization from ('f64') to ('f16') that remained live after conversion (no matching callback)}}
%a = "test.type_producer"() : () -> f16
%b = "test.type_producer"() : () -> f16
// expected-note at below {{see existing live user here}}
diff --git a/mlir/test/python/rewrite.py b/mlir/test/python/rewrite.py
index 35d88833e69e0..1cd3e70d3dfce 100644
--- a/mlir/test/python/rewrite.py
+++ b/mlir/test/python/rewrite.py
@@ -316,7 +316,7 @@ def convert_muli(op, adaptor, type_converter, rewriter):
apply_partial_conversion(module, target, frozen)
except MLIRError as e:
# CHECK: caught exception: partial conversion failed
- # CHECK: failed to legalize unresolved materialization
+ # CHECK: failed to legalize unresolved target materialization
print("caught exception:", e)
t1 = converter.convert_type(IntegerType.get_signless(64))
More information about the Mlir-commits
mailing list