[Mlir-commits] [mlir] [mlir] Avoid verifying live user in conversion diagnostic (PR #210566)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Sun Jul 19 16:51:01 PDT 2026


https://github.com/qyingwu updated https://github.com/llvm/llvm-project/pull/210566

>From c69db555ddc028d5aa1c49f94012ab24aac11435 Mon Sep 17 00:00:00 2001
From: qyingwu <qiyingwu at utexas.edu>
Date: Sat, 18 Jul 2026 19:10:29 -0700
Subject: [PATCH] [mlir] Avoid verifying live user in conversion diagnostic

---
 .../Transforms/Utils/DialectConversion.cpp    |  7 +++++--
 .../test-legalize-erased-op-with-uses.mlir    | 21 ++++++++++++++++++-
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index c76e3808d3b37..49986517d26b4 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -3391,8 +3391,11 @@ legalizeUnresolvedMaterialization(RewriterBase &rewriter,
                             << inputOperands.getTypes() << ") to ("
                             << op.getResultTypes()
                             << ") that remained live after conversion";
-  diag.attachNote(op->getUsers().begin()->getLoc())
-      << "see existing live user here: " << *op->getUsers().begin();
+  Operation *liveUser = *op->getUsers().begin();
+  diag.attachNote(liveUser->getLoc())
+      << "see existing live user here: "
+      << OpWithFlags(liveUser,
+                     OpPrintingFlags().assumeVerified().printGenericOpForm());
   return failure();
 }
 
diff --git a/mlir/test/Transforms/test-legalize-erased-op-with-uses.mlir b/mlir/test/Transforms/test-legalize-erased-op-with-uses.mlir
index 031442b0ee2da..829ff2f183e53 100644
--- a/mlir/test/Transforms/test-legalize-erased-op-with-uses.mlir
+++ b/mlir/test/Transforms/test-legalize-erased-op-with-uses.mlir
@@ -1,4 +1,4 @@
-// RUN: mlir-opt %s -test-legalize-unknown-root-patterns -verify-diagnostics
+// RUN: mlir-opt %s -test-legalize-unknown-root-patterns -split-input-file -verify-diagnostics
 
 // Test that an error is emitted when an operation is marked as "erased", but
 // has users that live across the conversion.
@@ -8,3 +8,22 @@ func.func @remove_all_ops(%arg0: i32) -> i32 {
   // expected-note at below {{see existing live user here}}
   return %0 : i32
 }
+
+// -----
+
+// Test that diagnostics can print a live user under an op that is not
+// verifiable while the conversion is in progress.
+module {
+  spirv.func @remove_test_ops() -> i32 "None" {
+    %cst1_i32 = spirv.Constant 1 : i32
+    // expected-error at below {{failed to legalize unresolved materialization from () to ('i32') that remained live after conversion}}
+    %0 = test.with_bounds {smax = 0 : si32, smin = 0 : si32, umax = 0 : i32, umin = 0 : ui32} : i32
+    %1 = builtin.unrealized_conversion_cast %cst1_i32 : i32 to i32
+    // expected-note at below {{see existing live user here}}
+    %2 = spirv.IAdd %0, %1 : i32
+    %3 = builtin.unrealized_conversion_cast %2 : i32 to i32
+    %4 = test.reflect_bounds %3 : i32
+    %5 = builtin.unrealized_conversion_cast %4 : i32 to i32
+    spirv.ReturnValue %5 : i32
+  }
+}



More information about the Mlir-commits mailing list