[Mlir-commits] [mlir] e110abc - [mlir][affine] Use iter argument replace init when delete loop in the coalesceLoops function (#169514)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Sun Nov 30 18:00:59 PST 2025
Author: lonely eagle
Date: 2025-12-01T10:00:54+08:00
New Revision: e110abc3c65bb33f738738a9fa6e0f5b602ed97f
URL: https://github.com/llvm/llvm-project/commit/e110abc3c65bb33f738738a9fa6e0f5b602ed97f
DIFF: https://github.com/llvm/llvm-project/commit/e110abc3c65bb33f738738a9fa6e0f5b602ed97f.diff
LOG: [mlir][affine] Use iter argument replace init when delete loop in the coalesceLoops function (#169514)
Fix https://github.com/llvm/llvm-project/issues/169483 by using iter
argument replace init when delete loop in the coalesceLoops function.
Added:
Modified:
mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp
mlir/test/Dialect/Affine/loop-coalescing.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp b/mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp
index 4743941deff3f..8f1249e3afaf0 100644
--- a/mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp
+++ b/mlir/lib/Dialect/Affine/Utils/LoopUtils.cpp
@@ -1711,6 +1711,12 @@ LogicalResult mlir::affine::coalesceLoops(MutableArrayRef<AffineForOp> loops) {
outermost.getBody()->getOperations().splice(
Block::iterator(secondOutermostLoop.getOperation()),
innermost.getBody()->getOperations());
+ for (auto [iter, init] :
+ llvm::zip_equal(secondOutermostLoop.getRegionIterArgs(),
+ secondOutermostLoop.getInits())) {
+ iter.replaceAllUsesWith(init);
+ iter.dropAllUses();
+ }
secondOutermostLoop.erase();
return success();
}
diff --git a/mlir/test/Dialect/Affine/loop-coalescing.mlir b/mlir/test/Dialect/Affine/loop-coalescing.mlir
index 3be14eaf5c326..6a825320ff20f 100644
--- a/mlir/test/Dialect/Affine/loop-coalescing.mlir
+++ b/mlir/test/Dialect/Affine/loop-coalescing.mlir
@@ -416,3 +416,31 @@ func.func @test_loops_do_not_get_coalesced() {
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: return
+
+// -----
+
+// CHECK-LABEL: func @inner_loop_has_iter_args
+// CHECK-SAME: %[[ALLOC:.*]]: memref<?xi64>)
+func.func @inner_loop_has_iter_args(%alloc : memref<?xi64>) {
+ %c17 = arith.constant 17 : index
+ affine.for %arg0 = 0 to 79 {
+ %0 = affine.for %arg1 = 0 to 64 iter_args(%arg2 = %alloc) -> (memref<?xi64>) {
+ %1 = arith.remui %arg1, %c17 : index
+ %2 = arith.index_cast %arg1 : index to i64
+ memref.store %2, %arg2[%1] : memref<?xi64>
+ affine.yield %arg2 : memref<?xi64>
+ }
+ }
+ return
+}
+
+// CHECK: %[[CONSTANT_0:.*]] = arith.constant 17 : index
+// CHECK: %[[APPLY_0:.*]] = affine.apply affine_map<() -> (79)>()
+// CHECK: %[[APPLY_1:.*]] = affine.apply affine_map<() -> (64)>()
+// CHECK: %[[APPLY_2:.*]] = affine.apply affine_map<(d0)[s0] -> (d0 * s0)>(%[[APPLY_0]]){{\[}}%[[APPLY_1]]]
+// CHECK: affine.for %[[IV:.*]] = 0 to %[[APPLY_2]] {
+// CHECK: %[[APPLY_3:.*]] = affine.apply affine_map<(d0)[s0] -> (d0 mod s0)>(%[[IV]]){{\[}}%[[APPLY_1]]]
+// CHECK: %[[REMUI_0:.*]] = arith.remui %[[APPLY_3]], %[[CONSTANT_0]] : index
+// CHECK: %[[INDEX_CAST_0:.*]] = arith.index_cast %[[APPLY_3]] : index to i64
+// CHECK: memref.store %[[INDEX_CAST_0]], %[[ALLOC]]{{\[}}%[[REMUI_0]]] : memref<?xi64>
+// CHECK: }
More information about the Mlir-commits
mailing list