Skip to content

Commit

Permalink
[mlir][Arith] Fold integer shift op with zero.
Browse files Browse the repository at this point in the history
This revision folds arith.shrui, arith.shrsi and arith.shli with zero
rhs to lhs.

Reviewed By: ftynse

Differential Revision: https://reviews.llvm.org/D140749
  • Loading branch information
jacquesguan authored and jacquesguan committed Dec 30, 2022
1 parent e345d42 commit 6c295a9
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
9 changes: 9 additions & 0 deletions mlir/lib/Dialect/Arith/IR/ArithOps.cpp
Expand Up @@ -2221,6 +2221,9 @@ LogicalResult arith::SelectOp::verify() {
//===----------------------------------------------------------------------===//

OpFoldResult arith::ShLIOp::fold(ArrayRef<Attribute> operands) {
// shli(x, 0) -> x
if (matchPattern(getRhs(), m_Zero()))
return getLhs();
// Don't fold if shifting more than the bit width.
bool bounded = false;
auto result = constFoldBinaryOp<IntegerAttr>(
Expand All @@ -2236,6 +2239,9 @@ OpFoldResult arith::ShLIOp::fold(ArrayRef<Attribute> operands) {
//===----------------------------------------------------------------------===//

OpFoldResult arith::ShRUIOp::fold(ArrayRef<Attribute> operands) {
// shrui(x, 0) -> x
if (matchPattern(getRhs(), m_Zero()))
return getLhs();
// Don't fold if shifting more than the bit width.
bool bounded = false;
auto result = constFoldBinaryOp<IntegerAttr>(
Expand All @@ -2251,6 +2257,9 @@ OpFoldResult arith::ShRUIOp::fold(ArrayRef<Attribute> operands) {
//===----------------------------------------------------------------------===//

OpFoldResult arith::ShRSIOp::fold(ArrayRef<Attribute> operands) {
// shrsi(x, 0) -> x
if (matchPattern(getRhs(), m_Zero()))
return getLhs();
// Don't fold if shifting more than the bit width.
bool bounded = false;
auto result = constFoldBinaryOp<IntegerAttr>(
Expand Down
27 changes: 27 additions & 0 deletions mlir/test/Dialect/Arith/canonicalize.mlir
Expand Up @@ -2107,3 +2107,30 @@ func.func @wideMulToMulSIExtendedBadShift2(%a: i32, %b: i32) -> i32 {
%hi = arith.trunci %sh: i64 to i32
return %hi : i32
}

// CHECK-LABEL: @foldShli0
// CHECK-SAME: (%[[ARG:.*]]: i64)
// CHECK: return %[[ARG]] : i64
func.func @foldShli0(%x : i64) -> i64 {
%c0 = arith.constant 0 : i64
%r = arith.shli %x, %c0 : i64
return %r : i64
}

// CHECK-LABEL: @foldShrui0
// CHECK-SAME: (%[[ARG:.*]]: i64)
// CHECK: return %[[ARG]] : i64
func.func @foldShrui0(%x : i64) -> i64 {
%c0 = arith.constant 0 : i64
%r = arith.shrui %x, %c0 : i64
return %r : i64
}

// CHECK-LABEL: @foldShrsi0
// CHECK-SAME: (%[[ARG:.*]]: i64)
// CHECK: return %[[ARG]] : i64
func.func @foldShrsi0(%x : i64) -> i64 {
%c0 = arith.constant 0 : i64
%r = arith.shrsi %x, %c0 : i64
return %r : i64
}

0 comments on commit 6c295a9

Please sign in to comment.