[Mlir-commits] [mlir] c0f73c8 - [mlir] Use a container with deterministic iteration order for unrealized materializations (#191323)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Wed Apr 15 11:34:50 PDT 2026


Author: Colin He
Date: 2026-04-15T11:34:44-07:00
New Revision: c0f73c807ddad11f5262f570fee25479226b3fd3

URL: https://github.com/llvm/llvm-project/commit/c0f73c807ddad11f5262f570fee25479226b3fd3
DIFF: https://github.com/llvm/llvm-project/commit/c0f73c807ddad11f5262f570fee25479226b3fd3.diff

LOG: [mlir] Use a container with deterministic iteration order for unrealized materializations (#191323)

Iteration over unrealized materializations in DialectConversion is
non-deterministic as the materialization metadata is stored in a
DenseMap. Replacing with a Vector-backed `llvm::MapVector` restores
deterministic behaviour.

This container is iterated for example here:
https://github.com/llvm/llvm-project/blob/main/mlir/lib/Transforms/Utils/DialectConversion.cpp#L3250

Added: 
    

Modified: 
    mlir/lib/Transforms/Utils/DialectConversion.cpp
    mlir/test/Transforms/test-legalize-type-conversion.mlir

Removed: 
    


################################################################################
diff  --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp
index cad27763ab165..9666302507281 100644
--- a/mlir/lib/Transforms/Utils/DialectConversion.cpp
+++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp
@@ -1139,7 +1139,7 @@ struct ConversionPatternRewriterImpl : public RewriterBase::Listener {
   DenseSet<UnrealizedConversionCastOp> patternMaterializations;
 
   /// A mapping for looking up metadata of unresolved materializations.
-  DenseMap<UnrealizedConversionCastOp, UnresolvedMaterializationInfo>
+  llvm::MapVector<UnrealizedConversionCastOp, UnresolvedMaterializationInfo>
       unresolvedMaterializations;
 
   /// The current type converter, or nullptr if no type converter is currently
@@ -3243,8 +3243,8 @@ void mlir::reconcileUnrealizedCasts(
 
 namespace mlir {
 static void reconcileUnrealizedCasts(
-    const DenseMap<UnrealizedConversionCastOp, UnresolvedMaterializationInfo>
-        &castOps,
+    const llvm::MapVector<UnrealizedConversionCastOp,
+                          UnresolvedMaterializationInfo> &castOps,
     SmallVectorImpl<UnrealizedConversionCastOp> *remainingCastOps) {
   reconcileUnrealizedCastsImpl(
       castOps.keys(),
@@ -3486,8 +3486,9 @@ LogicalResult OperationConverter::applyConversion(ArrayRef<Operation *> ops) {
   // Reconcile all UnrealizedConversionCastOps that were inserted by the
   // dialect conversion frameworks. (Not the ones that were inserted by
   // patterns.)
-  const DenseMap<UnrealizedConversionCastOp, UnresolvedMaterializationInfo>
-      &materializations = rewriterImpl.unresolvedMaterializations;
+  const llvm::MapVector<UnrealizedConversionCastOp,
+                        UnresolvedMaterializationInfo> &materializations =
+      rewriterImpl.unresolvedMaterializations;
   SmallVector<UnrealizedConversionCastOp> remainingCastOps;
   reconcileUnrealizedCasts(materializations, &remainingCastOps);
 

diff  --git a/mlir/test/Transforms/test-legalize-type-conversion.mlir b/mlir/test/Transforms/test-legalize-type-conversion.mlir
index ed675c36752b0..1453045c3bfbc 100644
--- a/mlir/test/Transforms/test-legalize-type-conversion.mlir
+++ b/mlir/test/Transforms/test-legalize-type-conversion.mlir
@@ -184,3 +184,19 @@ gpu.module @cuda_events {
     gpu.return
   }
 }
+
+// -----
+
+// Test that the order of materialization legalization is deterministic.
+// Multiple unresolvable materializations are created; the first one (in
+// insertion/walk order) should always fail first. With a DenseMap for
+// unresolvedMaterializations, the processing order would depend on pointer
+// 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}}
+  %a = "test.type_producer"() : () -> f16
+  %b = "test.type_producer"() : () -> f16
+  // expected-note at below {{see existing live user here}}
+  "foo.return"(%a, %b) : (f16, f16) -> ()
+}


        


More information about the Mlir-commits mailing list