Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Analysis / ValueTracking / knownbits-sat-addsub.ll
blobc2926eaffa58c56c6fe822e74c8278314ac3854d
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=instsimplify -S < %s | FileCheck %s
4 declare i8 @llvm.sadd.sat.i8(i8, i8)
5 declare i8 @llvm.ssub.sat.i8(i8, i8)
6 declare i8 @llvm.uadd.sat.i8(i8, i8)
7 declare i8 @llvm.usub.sat.i8(i8, i8)
9 define i1 @uadd_sat_overflow(i8 %x, i8 %y) {
10 ; CHECK-LABEL: @uadd_sat_overflow(
11 ; CHECK-NEXT:    ret i1 false
13   %lhs = or i8 %x, 128
14   %rhs = or i8 %y, 128
15   %exp = call i8 @llvm.uadd.sat.i8(i8 %lhs, i8 %rhs)
16   %r = icmp eq i8 %exp, 254
17   ret i1 %r
20 define i1 @uadd_sat_overflow_fail(i8 %x, i8 %y) {
21 ; CHECK-LABEL: @uadd_sat_overflow_fail(
22 ; CHECK-NEXT:    [[LHS:%.*]] = or i8 [[X:%.*]], -128
23 ; CHECK-NEXT:    [[RHS:%.*]] = or i8 [[Y:%.*]], 126
24 ; CHECK-NEXT:    [[EXP:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[LHS]], i8 [[RHS]])
25 ; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[EXP]], -2
26 ; CHECK-NEXT:    ret i1 [[R]]
28   %lhs = or i8 %x, 128
29   %rhs = or i8 %y, 126
30   %exp = call i8 @llvm.uadd.sat.i8(i8 %lhs, i8 %rhs)
31   %r = icmp eq i8 %exp, 254
32   ret i1 %r
35 define i1 @usub_sat_overflow(i8 %x, i8 %y) {
36 ; CHECK-LABEL: @usub_sat_overflow(
37 ; CHECK-NEXT:    ret i1 false
39   %lhs = and i8 %x, 127
40   %rhs = or i8 %y, 128
41   %exp = call i8 @llvm.usub.sat.i8(i8 %lhs, i8 %rhs)
42   %r = icmp eq i8 %exp, 1
43   ret i1 %r
46 define i1 @usub_sat_overflow_fail(i8 %x, i8 %y) {
47 ; CHECK-LABEL: @usub_sat_overflow_fail(
48 ; CHECK-NEXT:    [[LHS:%.*]] = and i8 [[X:%.*]], 127
49 ; CHECK-NEXT:    [[RHS:%.*]] = or i8 [[Y:%.*]], 126
50 ; CHECK-NEXT:    [[EXP:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[LHS]], i8 [[RHS]])
51 ; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[EXP]], 1
52 ; CHECK-NEXT:    ret i1 [[R]]
54   %lhs = and i8 %x, 127
55   %rhs = or i8 %y, 126
56   %exp = call i8 @llvm.usub.sat.i8(i8 %lhs, i8 %rhs)
57   %r = icmp eq i8 %exp, 1
58   ret i1 %r
61 define i1 @sadd_sat_overflow_pos(i8 %x, i8 %y) {
62 ; CHECK-LABEL: @sadd_sat_overflow_pos(
63 ; CHECK-NEXT:    ret i1 false
65   %xx = and i8 %x, 127
66   %yy = and i8 %y, 127
67   %lhs = or i8 %xx, 64
68   %rhs = or i8 %yy, 65
69   %exp = call i8 @llvm.sadd.sat.i8(i8 %lhs, i8 %rhs)
70   %r = icmp eq i8 %exp, 128
71   ret i1 %r
74 define i1 @sadd_sat_low_bits(i8 %x, i8 %y) {
75 ; CHECK-LABEL: @sadd_sat_low_bits(
76 ; CHECK-NEXT:    ret i1 false
78   %xx = and i8 %x, 15
79   %yy = and i8 %y, 15
80   %lhs = or i8 %xx, 1
81   %rhs = and i8 %yy, -2
82   %exp = call i8 @llvm.sadd.sat.i8(i8 %lhs, i8 %rhs)
83   %and = and i8 %exp, 1
84   %r = icmp eq i8 %and, 0
85   ret i1 %r
88 define i1 @sadd_sat_fail_may_overflow(i8 %x, i8 %y) {
89 ; CHECK-LABEL: @sadd_sat_fail_may_overflow(
90 ; CHECK-NEXT:    [[LHS:%.*]] = or i8 [[X:%.*]], 1
91 ; CHECK-NEXT:    [[RHS:%.*]] = and i8 [[Y:%.*]], -2
92 ; CHECK-NEXT:    [[EXP:%.*]] = call i8 @llvm.sadd.sat.i8(i8 [[LHS]], i8 [[RHS]])
93 ; CHECK-NEXT:    [[AND:%.*]] = and i8 [[EXP]], 1
94 ; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
95 ; CHECK-NEXT:    ret i1 [[R]]
97   %lhs = or i8 %x, 1
98   %rhs = and i8 %y, -2
99   %exp = call i8 @llvm.sadd.sat.i8(i8 %lhs, i8 %rhs)
100   %and = and i8 %exp, 1
101   %r = icmp eq i8 %and, 0
102   ret i1 %r
105 define i1 @sadd_sat_overflow_neg(i8 %x, i8 %y) {
106 ; CHECK-LABEL: @sadd_sat_overflow_neg(
107 ; CHECK-NEXT:    ret i1 false
109   %lhs = or i8 %x, 192
110   %rhs = or i8 %y, 191
111   %exp = call i8 @llvm.sadd.sat.i8(i8 %lhs, i8 %rhs)
112   %r = icmp eq i8 %exp, 127
113   ret i1 %r
116 define i1 @ssub_sat_overflow_neg(i8 %x, i8 %y) {
117 ; CHECK-LABEL: @ssub_sat_overflow_neg(
118 ; CHECK-NEXT:    ret i1 false
120   %xx = and i8 %x, 112
121   %yy = and i8 %y, 127
122   %lhs = or i8 %xx, 128
123   %rhs = or i8 %yy, 126
124   %exp = call i8 @llvm.ssub.sat.i8(i8 %lhs, i8 %rhs)
125   %r = icmp eq i8 %exp, 32
126   ret i1 %r
129 define i1 @ssub_sat_low_bits(i8 %x, i8 %y) {
130 ; CHECK-LABEL: @ssub_sat_low_bits(
131 ; CHECK-NEXT:    ret i1 false
133   %xx = and i8 %x, 15
134   %yy = and i8 %y, 15
135   %lhs = or i8 %xx, 17
136   %rhs = and i8 %yy, -2
137   %exp = call i8 @llvm.ssub.sat.i8(i8 %lhs, i8 %rhs)
138   %and = and i8 %exp, 1
139   %r = icmp eq i8 %and, 0
140   ret i1 %r
143 define i1 @ssub_sat_fail_may_overflow(i8 %x, i8 %y) {
144 ; CHECK-LABEL: @ssub_sat_fail_may_overflow(
145 ; CHECK-NEXT:    [[XX:%.*]] = and i8 [[X:%.*]], 15
146 ; CHECK-NEXT:    [[YY:%.*]] = and i8 [[Y:%.*]], 15
147 ; CHECK-NEXT:    [[LHS:%.*]] = or i8 [[XX]], 1
148 ; CHECK-NEXT:    [[RHS:%.*]] = and i8 [[YY]], -2
149 ; CHECK-NEXT:    [[EXP:%.*]] = call i8 @llvm.ssub.sat.i8(i8 [[LHS]], i8 [[RHS]])
150 ; CHECK-NEXT:    [[AND:%.*]] = and i8 [[EXP]], 1
151 ; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
152 ; CHECK-NEXT:    ret i1 [[R]]
154   %xx = and i8 %x, 15
155   %yy = and i8 %y, 15
156   %lhs = or i8 %xx, 1
157   %rhs = and i8 %yy, -2
158   %exp = call i8 @llvm.ssub.sat.i8(i8 %lhs, i8 %rhs)
159   %and = and i8 %exp, 1
160   %r = icmp eq i8 %and, 0
161   ret i1 %r
164 define i1 @ssub_sat_overflow_pos(i8 %x, i8 %y) {
165 ; CHECK-LABEL: @ssub_sat_overflow_pos(
166 ; CHECK-NEXT:    ret i1 false
168   %xx = and i8 %x, 24
169   %yy = and i8 %y, 3
170   %lhs = or i8 %xx, 8
171   %rhs = or i8 %yy, 128
172   %exp = call i8 @llvm.ssub.sat.i8(i8 %lhs, i8 %rhs)
173   %r = icmp eq i8 %exp, 128
174   ret i1 %r