[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