[Mlir-commits] [mlir] 1ee0d22 - [MLIR][Standard] Erase redundant assertions `std.assert`
Frederik Gossen
llvmlistbot at llvm.org
Tue Jul 14 03:10:06 PDT 2020
Author: Frederik Gossen
Date: 2020-07-14T10:09:39Z
New Revision: 1ee0d22f269ee61e0df215079a5d479f829a2921
URL: https://github.com/llvm/llvm-project/commit/1ee0d22f269ee61e0df215079a5d479f829a2921
DIFF: https://github.com/llvm/llvm-project/commit/1ee0d22f269ee61e0df215079a5d479f829a2921.diff
LOG: [MLIR][Standard] Erase redundant assertions `std.assert`
Differential Revision: https://reviews.llvm.org/D83118
Added:
Modified:
mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
mlir/lib/Dialect/StandardOps/IR/Ops.cpp
mlir/test/Dialect/Standard/canonicalize-cf.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/StandardOps/IR/Ops.td b/mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
index 57293591f383..b34dac4f38a7 100644
--- a/mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
+++ b/mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
@@ -467,6 +467,8 @@ def AssertOp : Std_Op<"assert"> {
// AssertOp is fully verified by its traits.
let verifier = ?;
+
+ let hasCanonicalizer = 1;
}
//===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Dialect/StandardOps/IR/Ops.cpp b/mlir/lib/Dialect/StandardOps/IR/Ops.cpp
index 7c28608d98b9..3e71c48f0871 100644
--- a/mlir/lib/Dialect/StandardOps/IR/Ops.cpp
+++ b/mlir/lib/Dialect/StandardOps/IR/Ops.cpp
@@ -439,6 +439,31 @@ OpFoldResult AndOp::fold(ArrayRef<Attribute> operands) {
[](APInt a, APInt b) { return a & b; });
}
+//===----------------------------------------------------------------------===//
+// AssertOp
+//===----------------------------------------------------------------------===//
+
+namespace {
+struct EraseRedundantAssertions : public OpRewritePattern<AssertOp> {
+ using OpRewritePattern<AssertOp>::OpRewritePattern;
+
+ LogicalResult matchAndRewrite(AssertOp op,
+ PatternRewriter &rewriter) const override {
+ // Erase assertion if argument is constant true.
+ if (matchPattern(op.arg(), m_One())) {
+ rewriter.eraseOp(op);
+ return success();
+ }
+ return failure();
+ }
+};
+} // namespace
+
+void AssertOp::getCanonicalizationPatterns(OwningRewritePatternList &patterns,
+ MLIRContext *context) {
+ patterns.insert<EraseRedundantAssertions>(context);
+}
+
//===----------------------------------------------------------------------===//
// AssumeAlignmentOp
//===----------------------------------------------------------------------===//
diff --git a/mlir/test/Dialect/Standard/canonicalize-cf.mlir b/mlir/test/Dialect/Standard/canonicalize-cf.mlir
index c22bd28dfccd..0cdf7fdc1471 100644
--- a/mlir/test/Dialect/Standard/canonicalize-cf.mlir
+++ b/mlir/test/Dialect/Standard/canonicalize-cf.mlir
@@ -138,3 +138,26 @@ func @cond_br_pass_through_fail(%cond : i1) {
^bb2:
return
}
+
+// -----
+
+// Erase assertion if condition is known to be true at compile time.
+// CHECK-LABEL: @assert_true
+func @assert_true() {
+ // CHECK-NOT: assert
+ %true = constant true
+ assert %true, "Computer says no"
+ return
+}
+
+// -----
+
+// Keep assertion if condition unknown at compile time.
+// CHECK-LABEL: @assert
+// CHECK-SAME: (%[[ARG:.*]]: i1)
+func @assert(%arg : i1) {
+ // CHECK: assert %[[ARG]], "Computer says no"
+ assert %arg, "Computer says no"
+ return
+}
+
More information about the Mlir-commits
mailing list