//===----------------------------------------------------------------------===//
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>(
//===----------------------------------------------------------------------===//
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>(
//===----------------------------------------------------------------------===//
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>(
%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
+}