[llvm] [ValueTracking] Improve constant range computation for `shl` and `and`. (PR #68446)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 6 20:22:57 PDT 2023


================
@@ -0,0 +1,132 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -passes=instsimplify < %s -S | FileCheck %s
+
+define i1 @shl_C_X_ugt(i8 %x) {
+; CHECK-LABEL: @shl_C_X_ugt(
+; CHECK-NEXT:    ret i1 false
+;
+  %shl = shl i8 7, %x
+  %r = icmp ugt i8 %shl, 224
+  ret i1 %r
+}
+
+define i1 @shl_C_X_ugt2(i8 %x) {
+; CHECK-LABEL: @shl_C_X_ugt2(
+; CHECK-NEXT:    ret i1 false
+;
+  %shl = shl i8 5, %x
+  %r = icmp ugt i8 %shl, 192
+  ret i1 %r
+}
+
+define i1 @shl_C_X_ugt_fail(i8 %x) {
+; CHECK-LABEL: @shl_C_X_ugt_fail(
+; CHECK-NEXT:    [[SHL:%.*]] = shl i8 1, [[X:%.*]]
+; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], 127
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %shl = shl i8 1, %x
+  %r = icmp ugt i8 %shl, 127
+  ret i1 %r
+}
+
+define i1 @shl_C_X_ugt_fail2(i8 %x) {
+; CHECK-LABEL: @shl_C_X_ugt_fail2(
+; CHECK-NEXT:    [[SHL:%.*]] = shl i8 3, [[X:%.*]]
+; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -66
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %shl = shl i8 3, %x
+  %r = icmp ugt i8 %shl, 190
+  ret i1 %r
+}
+
+define i1 @shl_C_X_ugt_fail3(i8 %x) {
+; CHECK-LABEL: @shl_C_X_ugt_fail3(
+; CHECK-NEXT:    [[SHL:%.*]] = shl i8 -1, [[X:%.*]]
+; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -2
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %shl = shl i8 -1, %x
+  %r = icmp ugt i8 %shl, 254
+  ret i1 %r
+}
+
+define i1 @shl_C_X_ugt_todo(i8 %x) {
+; CHECK-LABEL: @shl_C_X_ugt_todo(
+; CHECK-NEXT:    [[SHL:%.*]] = shl i8 -127, [[X:%.*]]
+; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -116
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %shl = shl i8 129, %x
+  %r = icmp ugt i8 %shl, 140
+  ret i1 %r
+}
+
+define i1 @shl_X_C_ugt(i8 %x) {
+; CHECK-LABEL: @shl_X_C_ugt(
+; CHECK-NEXT:    ret i1 false
+;
+  %shl = shl i8 %x, 6
+  %r = icmp ugt i8 %shl, 192
+  ret i1 %r
+}
+
+define i1 @shl_X_C_ugt_fail(i8 %x) {
+; CHECK-LABEL: @shl_X_C_ugt_fail(
+; CHECK-NEXT:    [[SHL:%.*]] = shl i8 [[X:%.*]], 6
+; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -65
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %shl = shl i8 %x, 6
+  %r = icmp ugt i8 %shl, 191
+  ret i1 %r
+}
+
+define i1 @shl_X_C_ugt_fail2(i8 %x) {
+; CHECK-LABEL: @shl_X_C_ugt_fail2(
+; CHECK-NEXT:    [[SHL:%.*]] = shl i8 [[X:%.*]], 5
+; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[SHL]], -64
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %shl = shl i8 %x, 5
+  %r = icmp ugt i8 %shl, 192
+  ret i1 %r
+}
+
+define i1 @and_ugt(i8 %xx, i8 %yy) {
+; CHECK-LABEL: @and_ugt(
+; CHECK-NEXT:    ret i1 false
+;
+  %x = or i8 %xx, %yy
+  %negx = sub i8 0, %x
+  %x_p2 = and i8 %negx, %x
+  %r = icmp ugt i8 %x_p2, 128
+  ret i1 %r
+}
+
+define i1 @and_ugt2(i8 %xx, i8 %yy) {
+; CHECK-LABEL: @and_ugt2(
+; CHECK-NEXT:    ret i1 false
+;
+  %x = or i8 %xx, %yy
+  %negx = sub i8 0, %x
+  %x_p2 = and i8 %x, %negx
+  %r = icmp ugt i8 %x_p2, 128
+  ret i1 %r
+}
+
+define i1 @and_ugt_fail(i8 %xx, i8 %yy) {
+; CHECK-LABEL: @and_ugt_fail(
+; CHECK-NEXT:    [[X:%.*]] = or i8 [[XX:%.*]], [[YY:%.*]]
+; CHECK-NEXT:    [[NEGX:%.*]] = sub i8 0, [[X]]
+; CHECK-NEXT:    [[X_P2:%.*]] = and i8 [[X]], [[NEGX]]
+; CHECK-NEXT:    [[R:%.*]] = icmp ugt i8 [[X_P2]], 127
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %x = or i8 %xx, %yy
----------------
dtcxzyw wrote:

```suggestion
  %x = or i8 %xx, %yy ; thwart complexity-based canonicalization
```

https://github.com/llvm/llvm-project/pull/68446


More information about the llvm-commits mailing list