[Mlir-commits] [mlir] 834cf3b - [MLIR][Arith] Canonicalize and/or with ext
William S. Moses
llvmlistbot at llvm.org
Sun Jan 2 22:25:34 PST 2022
Author: William S. Moses
Date: 2022-01-03T01:25:30-05:00
New Revision: 834cf3be222d2acebc82b2a022f3db8918a2bfe9
URL: https://github.com/llvm/llvm-project/commit/834cf3be222d2acebc82b2a022f3db8918a2bfe9
DIFF: https://github.com/llvm/llvm-project/commit/834cf3be222d2acebc82b2a022f3db8918a2bfe9.diff
LOG: [MLIR][Arith] Canonicalize and/or with ext
Replace and(ext(a),ext(b)) with ext(and(a,b)). This both reduces one instruction, and results in the computation (and/or) being done on a smaller type.
Reviewed By: mehdi_amini
Differential Revision: https://reviews.llvm.org/D116519
Added:
Modified:
mlir/include/mlir/Dialect/Arithmetic/IR/ArithmeticOps.td
mlir/lib/Dialect/Arithmetic/IR/ArithmeticCanonicalization.td
mlir/lib/Dialect/Arithmetic/IR/ArithmeticOps.cpp
mlir/test/Dialect/Arithmetic/canonicalize.mlir
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/Arithmetic/IR/ArithmeticOps.td b/mlir/include/mlir/Dialect/Arithmetic/IR/ArithmeticOps.td
index fb6d32fd04f62..b57c05ab87e62 100644
--- a/mlir/include/mlir/Dialect/Arithmetic/IR/ArithmeticOps.td
+++ b/mlir/include/mlir/Dialect/Arithmetic/IR/ArithmeticOps.td
@@ -437,6 +437,7 @@ def Arith_AndIOp : Arith_IntBinaryOp<"andi", [Commutative, Idempotent]> {
```
}];
let hasFolder = 1;
+ let hasCanonicalizer = 1;
}
//===----------------------------------------------------------------------===//
@@ -465,6 +466,7 @@ def Arith_OrIOp : Arith_IntBinaryOp<"ori", [Commutative, Idempotent]> {
```
}];
let hasFolder = 1;
+ let hasCanonicalizer = 1;
}
//===----------------------------------------------------------------------===//
diff --git a/mlir/lib/Dialect/Arithmetic/IR/ArithmeticCanonicalization.td b/mlir/lib/Dialect/Arithmetic/IR/ArithmeticCanonicalization.td
index 49ce6ec5ae0a9..efe41f048ce38 100644
--- a/mlir/lib/Dialect/Arithmetic/IR/ArithmeticCanonicalization.td
+++ b/mlir/lib/Dialect/Arithmetic/IR/ArithmeticCanonicalization.td
@@ -136,4 +136,32 @@ def BitcastOfBitcast :
def ExtSIOfExtUI :
Pat<(Arith_ExtSIOp (Arith_ExtUIOp $x)), (Arith_ExtUIOp $x)>;
+//===----------------------------------------------------------------------===//
+// AndIOp
+//===----------------------------------------------------------------------===//
+
+// and extui(x), extui(y) -> extui(and(x,y))
+def AndOfExtUI :
+ Pat<(Arith_AndIOp (Arith_ExtUIOp $x), (Arith_ExtUIOp $y)), (Arith_ExtUIOp (Arith_AndIOp $x, $y)),
+ [(Constraint<CPred<"$0.getType() == $1.getType()">> $x, $y)]>;
+
+// and extsi(x), extsi(y) -> extsi(and(x,y))
+def AndOfExtSI :
+ Pat<(Arith_AndIOp (Arith_ExtSIOp $x), (Arith_ExtSIOp $y)), (Arith_ExtSIOp (Arith_AndIOp $x, $y)),
+ [(Constraint<CPred<"$0.getType() == $1.getType()">> $x, $y)]>;
+
+//===----------------------------------------------------------------------===//
+// OrIOp
+//===----------------------------------------------------------------------===//
+
+// or extui(x), extui(y) -> extui(or(x,y))
+def OrOfExtUI :
+ Pat<(Arith_OrIOp (Arith_ExtUIOp $x), (Arith_ExtUIOp $y)), (Arith_ExtUIOp (Arith_OrIOp $x, $y)),
+ [(Constraint<CPred<"$0.getType() == $1.getType()">> $x, $y)]>;
+
+// or extsi(x), extsi(y) -> extsi(or(x,y))
+def OrOfExtSI :
+ Pat<(Arith_OrIOp (Arith_ExtSIOp $x), (Arith_ExtSIOp $y)), (Arith_ExtSIOp (Arith_OrIOp $x, $y)),
+ [(Constraint<CPred<"$0.getType() == $1.getType()">> $x, $y)]>;
+
#endif // ARITHMETIC_PATTERNS
diff --git a/mlir/lib/Dialect/Arithmetic/IR/ArithmeticOps.cpp b/mlir/lib/Dialect/Arithmetic/IR/ArithmeticOps.cpp
index 2fe32597b03f9..59af0a5c999b3 100644
--- a/mlir/lib/Dialect/Arithmetic/IR/ArithmeticOps.cpp
+++ b/mlir/lib/Dialect/Arithmetic/IR/ArithmeticOps.cpp
@@ -901,6 +901,24 @@ bool arith::TruncFOp::areCastCompatible(TypeRange inputs, TypeRange outputs) {
return checkWidthChangeCast<std::less, FloatType>(inputs, outputs);
}
+//===----------------------------------------------------------------------===//
+// AndIOp
+//===----------------------------------------------------------------------===//
+
+void arith::AndIOp::getCanonicalizationPatterns(
+ OwningRewritePatternList &patterns, MLIRContext *context) {
+ patterns.insert<AndOfExtUI, AndOfExtSI>(context);
+}
+
+//===----------------------------------------------------------------------===//
+// OrIOp
+//===----------------------------------------------------------------------===//
+
+void arith::OrIOp::getCanonicalizationPatterns(
+ OwningRewritePatternList &patterns, MLIRContext *context) {
+ patterns.insert<OrOfExtUI, OrOfExtSI>(context);
+}
+
//===----------------------------------------------------------------------===//
// Verifiers for casts between integers and floats.
//===----------------------------------------------------------------------===//
diff --git a/mlir/test/Dialect/Arithmetic/canonicalize.mlir b/mlir/test/Dialect/Arithmetic/canonicalize.mlir
index 87a198cb7c4ab..dff4141a38387 100644
--- a/mlir/test/Dialect/Arithmetic/canonicalize.mlir
+++ b/mlir/test/Dialect/Arithmetic/canonicalize.mlir
@@ -99,6 +99,52 @@ func @extSIOfExtSI(%arg0: i1) -> i64 {
// -----
+// CHECK-LABEL: @andOfExtSI
+// CHECK: %[[comb:.+]] = arith.andi %arg0, %arg1 : i8
+// CHECK: %[[ext:.+]] = arith.extsi %[[comb]] : i8 to i64
+// CHECK: return %[[ext]]
+func @andOfExtSI(%arg0: i8, %arg1: i8) -> i64 {
+ %ext0 = arith.extsi %arg0 : i8 to i64
+ %ext1 = arith.extsi %arg1 : i8 to i64
+ %res = arith.andi %ext0, %ext1 : i64
+ return %res : i64
+}
+
+// CHECK-LABEL: @andOfExtUI
+// CHECK: %[[comb:.+]] = arith.andi %arg0, %arg1 : i8
+// CHECK: %[[ext:.+]] = arith.extui %[[comb]] : i8 to i64
+// CHECK: return %[[ext]]
+func @andOfExtUI(%arg0: i8, %arg1: i8) -> i64 {
+ %ext0 = arith.extui %arg0 : i8 to i64
+ %ext1 = arith.extui %arg1 : i8 to i64
+ %res = arith.andi %ext0, %ext1 : i64
+ return %res : i64
+}
+
+// CHECK-LABEL: @orOfExtSI
+// CHECK: %[[comb:.+]] = arith.ori %arg0, %arg1 : i8
+// CHECK: %[[ext:.+]] = arith.extsi %[[comb]] : i8 to i64
+// CHECK: return %[[ext]]
+func @orOfExtSI(%arg0: i8, %arg1: i8) -> i64 {
+ %ext0 = arith.extsi %arg0 : i8 to i64
+ %ext1 = arith.extsi %arg1 : i8 to i64
+ %res = arith.ori %ext0, %ext1 : i64
+ return %res : i64
+}
+
+// CHECK-LABEL: @orOfExtUI
+// CHECK: %[[comb:.+]] = arith.ori %arg0, %arg1 : i8
+// CHECK: %[[ext:.+]] = arith.extui %[[comb]] : i8 to i64
+// CHECK: return %[[ext]]
+func @orOfExtUI(%arg0: i8, %arg1: i8) -> i64 {
+ %ext0 = arith.extui %arg0 : i8 to i64
+ %ext1 = arith.extui %arg1 : i8 to i64
+ %res = arith.ori %ext0, %ext1 : i64
+ return %res : i64
+}
+
+// -----
+
// CHECK-LABEL: @indexCastOfSignExtend
// CHECK: %[[res:.+]] = arith.index_cast %arg0 : i8 to index
// CHECK: return %[[res]]
More information about the Mlir-commits
mailing list