[Mlir-commits] [mlir] [MLIR][Affine] Keep dims when simplifying affine.min/max (PR #235819)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Oct 26 09:07:22 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir-affine
Author: SunXu (whutsunxu)
<details>
<summary>Changes</summary>
## Summary
- `simplifyAffineMinMaxOp` rebuilt maps as 0-dim / all-symbol, so a loop IV was used as a symbol and `affine.apply` verify failed (https://github.com/llvm/llvm-project/issues/235064).
- Call `canonicalizeMapAndOperands` after rebuilding so demoted dims are legalized.
- Add dim and symbol `affine.min` tests in `simplify-min-max-ops.mlir`.
## Test plan
- [x] `llvm-lit` `--filter='Dialect/Affine/simplify-min-max-ops.mlir'`
- [x] `mlir-opt` on the issue 235064 repro with `--verify-each`
---
Full diff: https://github.com/llvm/llvm-project/pull/235819.diff
2 Files Affected:
- (modified) mlir/lib/Dialect/Affine/Transforms/SimplifyAffineMinMax.cpp (+6-2)
- (modified) mlir/test/Dialect/Affine/simplify-min-max-ops.mlir (+23)
``````````diff
diff --git a/mlir/lib/Dialect/Affine/Transforms/SimplifyAffineMinMax.cpp b/mlir/lib/Dialect/Affine/Transforms/SimplifyAffineMinMax.cpp
index ea7f3157c82eaa..88ffbd1461ce55 100644
--- a/mlir/lib/Dialect/Affine/Transforms/SimplifyAffineMinMax.cpp
+++ b/mlir/lib/Dialect/Affine/Transforms/SimplifyAffineMinMax.cpp
@@ -35,7 +35,7 @@ static bool simplifyAffineMinMaxOp(RewriterBase &rewriter, AffineOp affineOp) {
using ComparisonOperator = ValueBoundsConstraintSet::ComparisonOperator;
AffineMap affineMap = affineOp.getMap();
- ValueRange operands = affineOp.getOperands();
+ SmallVector<Value> operands(affineOp.getOperands());
static constexpr bool isMin = std::is_same_v<AffineOp, AffineMinOp>;
LDBG() << "analyzing value: `" << affineOp;
@@ -131,9 +131,13 @@ static bool simplifyAffineMinMaxOp(RewriterBase &rewriter, AffineOp affineOp) {
affineMap =
AffineMap::get(0, affineMap.getNumSymbols() + affineMap.getNumDims(),
results, rewriter.getContext());
+ canonicalizeMapAndOperands(&affineMap, &operands);
// Update the affine op.
- rewriter.modifyOpInPlace(affineOp, [&]() { affineOp.setMap(affineMap); });
+ rewriter.modifyOpInPlace(affineOp, [&]() {
+ affineOp.setMap(affineMap);
+ affineOp->setOperands(operands);
+ });
LDBG() << "- simplified affine op: `" << affineOp << "`";
return true;
}
diff --git a/mlir/test/Dialect/Affine/simplify-min-max-ops.mlir b/mlir/test/Dialect/Affine/simplify-min-max-ops.mlir
index 96e3c32f6d49fe..b17a66d5cecb22 100644
--- a/mlir/test/Dialect/Affine/simplify-min-max-ops.mlir
+++ b/mlir/test/Dialect/Affine/simplify-min-max-ops.mlir
@@ -3,6 +3,7 @@
// CHECK-DAG: #[[MAP_0:.*]] = affine_map<()[s0] -> (32, s0)>
// CHECK-DAG: #[[MAP_1:.*]] = affine_map<()[s0, s1] -> (s1, s0)>
// CHECK-DAG: #[[MAP_2:.*]] = affine_map<()[s0] -> (256, s0)>
+// CHECK-DAG: #[[MAP_MOD:.*]] = affine_map<(d0) -> (-d0 + (d0 floordiv 2) * 2)>
// CHECK: @min_max_full_simplify
func.func @min_max_full_simplify() -> (index, index) {
@@ -58,3 +59,25 @@ func.func @overlapping_constraints() -> (index, index) {
%r1 = affine.max affine_map<()[s0, s1, s2] -> (s0, s1, s2)>()[%0, %1, %2]
return %r0, %r1 : index, index
}
+
+// CHECK: @affine_min_dim_simplify
+func.func @affine_min_dim_simplify(%bound: index) -> index {
+ // CHECK: affine.for %[[IV:.*]] = 0 to
+ %out = affine.for %iv = 0 to %bound iter_args(%carried = %bound) -> (index) {
+ // CHECK: affine.apply #[[MAP_MOD]](%[[IV]])
+ %result = affine.min affine_map<(d0) -> (0, -(d0 mod 2))>(%iv)
+ affine.yield %result : index
+ }
+ return %out : index
+}
+
+// CHECK: @affine_min_symbol_simplify
+func.func @affine_min_symbol_simplify(%bound: index) -> index {
+ // CHECK: affine.for %[[IV:.*]] = 0 to
+ %out = affine.for %iv = 0 to %bound iter_args(%carried = %bound) -> (index) {
+ // CHECK: affine.apply #[[MAP_MOD]](%[[IV]])
+ %result = affine.min affine_map<()[s0] -> (0, -(s0 mod 2))>()[%iv]
+ affine.yield %result : index
+ }
+ return %out : index
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/235819
More information about the Mlir-commits
mailing list