[Mlir-commits] [mlir] 621d93d - [mlir][SCF] Remove empty else blocks of `scf.if` operations.
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Tue Jun 15 15:07:43 PDT 2021
Author: MaheshRavishankar
Date: 2021-06-15T15:07:20-07:00
New Revision: 621d93d263f82059c2826fe919a1a138b65627a3
URL: https://github.com/llvm/llvm-project/commit/621d93d263f82059c2826fe919a1a138b65627a3
DIFF: https://github.com/llvm/llvm-project/commit/621d93d263f82059c2826fe919a1a138b65627a3.diff
LOG: [mlir][SCF] Remove empty else blocks of `scf.if` operations.
Differential Revision: https://reviews.llvm.org/D104273
Added:
Modified:
mlir/lib/Dialect/SCF/SCF.cpp
mlir/test/Dialect/SCF/canonicalize.mlir
Removed:
################################################################################
diff --git a/mlir/lib/Dialect/SCF/SCF.cpp b/mlir/lib/Dialect/SCF/SCF.cpp
index c7b2836e04386..fe96407eb69aa 100644
--- a/mlir/lib/Dialect/SCF/SCF.cpp
+++ b/mlir/lib/Dialect/SCF/SCF.cpp
@@ -1371,18 +1371,44 @@ struct CombineIfs : public OpRewritePattern<IfOp> {
}
};
+/// Pattern to remove an empty else branch.
+struct RemoveEmptyElseBranch : public OpRewritePattern<IfOp> {
+ using OpRewritePattern<IfOp>::OpRewritePattern;
+
+ LogicalResult matchAndRewrite(IfOp ifOp,
+ PatternRewriter &rewriter) const override {
+ // Cannot remove else region when there are operation results.
+ if (ifOp.getNumResults())
+ return failure();
+ Block *elseBlock = ifOp.elseBlock();
+ if (!elseBlock || !llvm::hasSingleElement(*elseBlock))
+ return failure();
+ auto newIfOp = rewriter.cloneWithoutRegions(ifOp);
+ rewriter.inlineRegionBefore(ifOp.thenRegion(), newIfOp.thenRegion(),
+ newIfOp.thenRegion().begin());
+ rewriter.eraseOp(ifOp);
+ return success();
+ }
+};
+
} // namespace
void IfOp::getCanonicalizationPatterns(RewritePatternSet &results,
MLIRContext *context) {
- results.add<RemoveUnusedResults, RemoveStaticCondition,
- ConvertTrivialIfToSelect, ConditionPropagation,
- ReplaceIfYieldWithConditionOrValue, CombineIfs>(context);
+ results
+ .add<RemoveUnusedResults, RemoveStaticCondition, ConvertTrivialIfToSelect,
+ ConditionPropagation, ReplaceIfYieldWithConditionOrValue, CombineIfs,
+ RemoveEmptyElseBranch>(context);
}
Block *IfOp::thenBlock() { return &thenRegion().back(); }
YieldOp IfOp::thenYield() { return cast<YieldOp>(&thenBlock()->back()); }
-Block *IfOp::elseBlock() { return &elseRegion().back(); }
+Block *IfOp::elseBlock() {
+ Region &r = elseRegion();
+ if (r.empty())
+ return nullptr;
+ return &r.back();
+}
YieldOp IfOp::elseYield() { return cast<YieldOp>(&elseBlock()->back()); }
//===----------------------------------------------------------------------===//
diff --git a/mlir/test/Dialect/SCF/canonicalize.mlir b/mlir/test/Dialect/SCF/canonicalize.mlir
index f95f27df9cc20..45f0f7618a9f4 100644
--- a/mlir/test/Dialect/SCF/canonicalize.mlir
+++ b/mlir/test/Dialect/SCF/canonicalize.mlir
@@ -250,6 +250,20 @@ func @empty_if2(%cond: i1) {
// CHECK-NOT: scf.if
// CHECK: return
+// ----
+
+func @empty_else(%cond: i1, %v : memref<i1>) {
+ scf.if %cond {
+ memref.store %cond, %v[] : memref<i1>
+ } else {
+ }
+ return
+}
+
+// CHECK-LABEL: func @empty_else
+// CHECK: scf.if
+// CHECK-NOT: else
+
// -----
func @to_select1(%cond: i1) -> index {
@@ -475,9 +489,9 @@ func @replace_single_iteration_loop_1() {
// CHECK-LABEL: @replace_single_iteration_loop_2
func @replace_single_iteration_loop_2() {
// CHECK: %[[LB:.*]] = constant 5
- %c5 = constant 5 : index
- %c6 = constant 6 : index
- %c11 = constant 11 : index
+ %c5 = constant 5 : index
+ %c6 = constant 6 : index
+ %c11 = constant 11 : index
// CHECK: %[[INIT:.*]] = "test.init"
%init = "test.init"() : () -> i32
// CHECK-NOT: scf.for
More information about the Mlir-commits
mailing list