aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mlir/lib/Dialect/Affine/IR/AffineOps.cpp6
-rw-r--r--mlir/test/Dialect/Affine/canonicalize.mlir14
2 files changed, 13 insertions, 7 deletions
diff --git a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
index b1721cd..370084d 100644
--- a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
+++ b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp
@@ -1628,7 +1628,8 @@ static LogicalResult canonicalizeLoopBounds(AffineForOp forOp) {
}
namespace {
-/// This is a pattern to fold trivially empty loops.
+/// This is a pattern to fold trivially empty loop bodies.
+/// TODO: This should be moved into the folding hook.
struct AffineForEmptyLoopFolder : public OpRewritePattern<AffineForOp> {
using OpRewritePattern<AffineForOp>::OpRewritePattern;
@@ -1637,7 +1638,8 @@ struct AffineForEmptyLoopFolder : public OpRewritePattern<AffineForOp> {
// Check that the body only contains a yield.
if (!llvm::hasSingleElement(*forOp.getBody()))
return failure();
- rewriter.eraseOp(forOp);
+ // The initial values of the iteration arguments would be the op's results.
+ rewriter.replaceOp(forOp, forOp.getIterOperands());
return success();
}
};
diff --git a/mlir/test/Dialect/Affine/canonicalize.mlir b/mlir/test/Dialect/Affine/canonicalize.mlir
index f12a0ca..3c55431 100644
--- a/mlir/test/Dialect/Affine/canonicalize.mlir
+++ b/mlir/test/Dialect/Affine/canonicalize.mlir
@@ -460,14 +460,18 @@ func @constant_fold_bounds(%N : index) {
// -----
-// CHECK-LABEL: func @fold_empty_loop() {
-func @fold_empty_loop() {
- // CHECK-NOT: affine.for
+// CHECK-LABEL: func @fold_empty_loops()
+func @fold_empty_loops() -> index {
+ %c0 = constant 0 : index
affine.for %i = 0 to 10 {
}
- return
+ %res = affine.for %i = 0 to 10 iter_args(%arg = %c0) -> index {
+ affine.yield %arg : index
+ }
+ // CHECK-NEXT: %[[zero:.*]] = constant 0
+ // CHECK-NEXT: return %[[zero]]
+ return %res : index
}
-// CHECK: return
// -----