[Mlir-commits] [mlir] 1dc9047 - [mlir][arith] Add canon pattern: addui_extended -> addi
Jakub Kuderski
llvmlistbot at llvm.org
Fri Dec 9 11:41:00 PST 2022
Author: Jakub Kuderski
Date: 2022-12-09T14:40:05-05:00
New Revision: 1dc9047bdab746f1f20a5e7bb8537d7667230254
URL: https://github.com/llvm/llvm-project/commit/1dc9047bdab746f1f20a5e7bb8537d7667230254
DIFF: https://github.com/llvm/llvm-project/commit/1dc9047bdab746f1f20a5e7bb8537d7667230254.diff
LOG: [mlir][arith] Add canon pattern: addui_extended -> addi
Demote `arith.addui_extended` to `arith.addi` when the 'overflow'
result has no uses.
Reviewed By: antiagainst
Differential Revision: https://reviews.llvm.org/D139722
Added:
Modified:
mlir/include/mlir/Dialect/Arith/IR/ArithOps.td
mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td
mlir/lib/Dialect/Arith/IR/ArithOps.cpp
mlir/test/Dialect/Arith/canonicalize.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td b/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td
index d2fedaaba3fa7..0c54acac59a36 100644
--- a/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td
+++ b/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td
@@ -265,6 +265,7 @@ def Arith_AddUIExtendedOp : Arith_Op<"addui_extended", [Pure, Commutative,
];
let hasFolder = 1;
+ let hasCanonicalizer = 1;
let extraClassDeclaration = [{
::llvm::Optional<::llvm::SmallVector<int64_t, 4>> getShapeForUnroll();
diff --git a/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td b/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td
index a30ba2eff6412..a12c1fe5c6326 100644
--- a/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td
+++ b/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td
@@ -49,6 +49,17 @@ def AddISubConstantLHS :
(Arith_ConstantOp APIntAttr:$c1)),
(Arith_SubIOp (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)), $x)>;
+//===----------------------------------------------------------------------===//
+// AddUIExtendedOp
+//===----------------------------------------------------------------------===//
+
+// addui_extended(x, y) -> [addi(x, y), x], when the `overflow` result has no
+// uses. Since the 'overflow' result is unused, any replacement value will do.
+def AddUIExtendedToAddI:
+ Pattern<(Arith_AddUIExtendedOp:$res $x, $y),
+ [(Arith_AddIOp $x, $y), (replaceWithValue $x)],
+ [(Constraint<CPred<"$0.getUses().empty()">> $res__1)]>;
+
//===----------------------------------------------------------------------===//
// SubIOp
//===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
index dd6e8606542d1..29bce4def8745 100644
--- a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
+++ b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
@@ -295,6 +295,11 @@ arith::AddUIExtendedOp::fold(ArrayRef<Attribute> operands,
return failure();
}
+void arith::AddUIExtendedOp::getCanonicalizationPatterns(
+ RewritePatternSet &patterns, MLIRContext *context) {
+ patterns.add<AddUIExtendedToAddI>(context);
+}
+
//===----------------------------------------------------------------------===//
// SubIOp
//===----------------------------------------------------------------------===//
diff --git a/mlir/test/Dialect/Arith/canonicalize.mlir b/mlir/test/Dialect/Arith/canonicalize.mlir
index 8fc39808b6cc6..6a1c0feb9025d 100644
--- a/mlir/test/Dialect/Arith/canonicalize.mlir
+++ b/mlir/test/Dialect/Arith/canonicalize.mlir
@@ -662,6 +662,24 @@ func.func @adduiExtendedZeroLhs(%arg0: i32) -> (i32, i1) {
return %sum, %overflow : i32, i1
}
+// CHECK-LABEL: @adduiExtendedUnusedOverflowScalar
+// CHECK-SAME: (%[[LHS:.+]]: i32, %[[RHS:.+]]: i32) -> i32
+// CHECK-NEXT: %[[RES:.+]] = arith.addi %[[LHS]], %[[RHS]] : i32
+// CHECK-NEXT: return %[[RES]] : i32
+func.func @adduiExtendedUnusedOverflowScalar(%arg0: i32, %arg1: i32) -> i32 {
+ %sum, %overflow = arith.addui_extended %arg0, %arg1: i32, i1
+ return %sum : i32
+}
+
+// CHECK-LABEL: @adduiExtendedUnusedOverflowVector
+// CHECK-SAME: (%[[LHS:.+]]: vector<3xi32>, %[[RHS:.+]]: vector<3xi32>) -> vector<3xi32>
+// CHECK-NEXT: %[[RES:.+]] = arith.addi %[[LHS]], %[[RHS]] : vector<3xi32>
+// CHECK-NEXT: return %[[RES]] : vector<3xi32>
+func.func @adduiExtendedUnusedOverflowVector(%arg0: vector<3xi32>, %arg1: vector<3xi32>) -> vector<3xi32> {
+ %sum, %overflow = arith.addui_extended %arg0, %arg1: vector<3xi32>, vector<3xi1>
+ return %sum : vector<3xi32>
+}
+
// CHECK-LABEL: @adduiExtendedConstants
// CHECK-DAG: %[[false:.+]] = arith.constant false
// CHECK-DAG: %[[c50:.+]] = arith.constant 50 : i32
More information about the Mlir-commits
mailing list