xref: /llvm-project/llvm/test/Analysis/ValueTracking/knownbits-div.ll (revision 124547eae8a610a9a77fe3e219e9cd98a2580cfe)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=instsimplify -S < %s | FileCheck %s
3
4define i1 @sdiv_neg_neg_high_bits(i8 %x, i8 %y) {
5; CHECK-LABEL: @sdiv_neg_neg_high_bits(
6; CHECK-NEXT:    ret i1 false
7;
8  %num = or i8 %x, 128
9  %denum = or i8 %y, 131
10  %div = sdiv i8 %num, %denum
11  %and = and i8 %div, 128
12  %r = icmp eq i8 %and, 128
13  ret i1 %r
14}
15
16define i1 @sdiv_pos_neg_high_bits(i8 %x, i8 %y) {
17; CHECK-LABEL: @sdiv_pos_neg_high_bits(
18; CHECK-NEXT:    ret i1 false
19;
20  %xx = and i8 %x, 127
21  %num = or i8 %xx, 49
22  %denum = or i8 %y, 241
23  %div = sdiv i8 %num, %denum
24  %and = and i8 %div, 128
25  %r = icmp eq i8 %and, 0
26  ret i1 %r
27}
28
29define i1 @sdiv_pos_neg_high_bits_fail_maybez(i8 %x, i8 %y) {
30; CHECK-LABEL: @sdiv_pos_neg_high_bits_fail_maybez(
31; CHECK-NEXT:    [[XX:%.*]] = and i8 [[X:%.*]], 127
32; CHECK-NEXT:    [[NUM:%.*]] = or i8 [[XX]], 49
33; CHECK-NEXT:    [[DENUM:%.*]] = or i8 [[Y:%.*]], -64
34; CHECK-NEXT:    [[DIV:%.*]] = sdiv i8 [[NUM]], [[DENUM]]
35; CHECK-NEXT:    [[AND:%.*]] = and i8 [[DIV]], -128
36; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
37; CHECK-NEXT:    ret i1 [[R]]
38;
39  %xx = and i8 %x, 127
40  %num = or i8 %xx, 49
41  %denum = or i8 %y, 192
42  %div = sdiv i8 %num, %denum
43  %and = and i8 %div, 128
44  %r = icmp eq i8 %and, 0
45  ret i1 %r
46}
47
48define i1 @sdiv_exact_pos_neg_high_bits(i8 %x, i8 %y) {
49; CHECK-LABEL: @sdiv_exact_pos_neg_high_bits(
50; CHECK-NEXT:    ret i1 false
51;
52  %xx = and i8 %x, 127
53  %num = or i8 %xx, 49
54  %denum = or i8 %y, 192
55  %div = sdiv exact i8 %num, %denum
56  %and = and i8 %div, 128
57  %r = icmp eq i8 %and, 0
58  ret i1 %r
59}
60
61define i1 @sdiv_neg_pos_high_bits(i8 %x, i8 %y) {
62; CHECK-LABEL: @sdiv_neg_pos_high_bits(
63; CHECK-NEXT:    ret i1 false
64;
65  %xx = and i8 %x, 159
66  %num = or i8 %xx, 129
67  %yy = and i8 %y, 15
68  %denum = or i8 %yy, 9
69  %div = sdiv i8 %num, %denum
70  %and = and i8 %div, 128
71  %r = icmp eq i8 %and, 0
72  ret i1 %r
73}
74
75define i1 @sdiv_neg_pos_high_bits_fail_maybez(i8 %x, i8 %y) {
76; CHECK-LABEL: @sdiv_neg_pos_high_bits_fail_maybez(
77; CHECK-NEXT:    [[NUM:%.*]] = or i8 [[X:%.*]], -128
78; CHECK-NEXT:    [[YY:%.*]] = and i8 [[Y:%.*]], 15
79; CHECK-NEXT:    [[DENUM:%.*]] = or i8 [[YY]], 9
80; CHECK-NEXT:    [[DIV:%.*]] = sdiv i8 [[NUM]], [[DENUM]]
81; CHECK-NEXT:    [[AND:%.*]] = and i8 [[DIV]], -128
82; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
83; CHECK-NEXT:    ret i1 [[R]]
84;
85  %num = or i8 %x, 128
86  %yy = and i8 %y, 15
87  %denum = or i8 %yy, 9
88  %div = sdiv i8 %num, %denum
89  %and = and i8 %div, 128
90  %r = icmp eq i8 %and, 0
91  ret i1 %r
92}
93
94define i1 @sdiv_exact_odd_odd(i8 %x, i8 %y) {
95; CHECK-LABEL: @sdiv_exact_odd_odd(
96; CHECK-NEXT:    ret i1 false
97;
98  %num = or i8 %x, 1
99  %denum = or i8 %y, 1
100  %div = sdiv exact i8 %num, %denum
101  %and = and i8 %div, 1
102  %r = icmp eq i8 %and, 0
103  ret i1 %r
104}
105
106define i1 @sdiv_exact_even_odd(i8 %x, i8 %y) {
107; CHECK-LABEL: @sdiv_exact_even_odd(
108; CHECK-NEXT:    ret i1 false
109;
110  %num = and i8 %x, -2
111  %denum = or i8 %y, 1
112  %div = sdiv exact i8 %num, %denum
113  %and = and i8 %div, 1
114  %r = icmp eq i8 %and, 1
115  ret i1 %r
116}
117
118define i1 @sdiv_exact_even_even_fail_unknown(i8 %x, i8 %y) {
119; CHECK-LABEL: @sdiv_exact_even_even_fail_unknown(
120; CHECK-NEXT:    [[NUM:%.*]] = and i8 [[X:%.*]], -2
121; CHECK-NEXT:    [[DENUM:%.*]] = and i8 [[Y:%.*]], -2
122; CHECK-NEXT:    [[DIV:%.*]] = sdiv exact i8 [[NUM]], [[DENUM]]
123; CHECK-NEXT:    [[AND:%.*]] = and i8 [[DIV]], 1
124; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 1
125; CHECK-NEXT:    ret i1 [[R]]
126;
127  %num = and i8 %x, -2
128  %denum = and i8 %y, -2
129  %div = sdiv exact i8 %num, %denum
130  %and = and i8 %div, 1
131  %r = icmp eq i8 %and, 1
132  ret i1 %r
133}
134
135define i1 @sdiv_exact_even_even_fail_unknown2(i8 %x, i8 %y) {
136; CHECK-LABEL: @sdiv_exact_even_even_fail_unknown2(
137; CHECK-NEXT:    [[NUM:%.*]] = and i8 [[X:%.*]], -2
138; CHECK-NEXT:    [[DENUM:%.*]] = and i8 [[Y:%.*]], -2
139; CHECK-NEXT:    [[DIV:%.*]] = sdiv exact i8 [[NUM]], [[DENUM]]
140; CHECK-NEXT:    [[AND:%.*]] = and i8 [[DIV]], 1
141; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
142; CHECK-NEXT:    ret i1 [[R]]
143;
144  %num = and i8 %x, -2
145  %denum = and i8 %y, -2
146  %div = sdiv exact i8 %num, %denum
147  %and = and i8 %div, 1
148  %r = icmp eq i8 %and, 0
149  ret i1 %r
150}
151
152define i1 @udiv_high_bits(i8 %x, i8 %y) {
153; CHECK-LABEL: @udiv_high_bits(
154; CHECK-NEXT:    ret i1 false
155;
156  %num = and i8 %x, 129
157  %denum = or i8 %y, 31
158  %div = udiv i8 %num, %denum
159  %and = and i8 %div, 8
160  %r = icmp eq i8 %and, 8
161  ret i1 %r
162}
163
164define i1 @udiv_exact_odd_odd(i8 %x, i8 %y) {
165; CHECK-LABEL: @udiv_exact_odd_odd(
166; CHECK-NEXT:    ret i1 false
167;
168  %num = or i8 %x, 1
169  %denum = or i8 %y, 1
170  %div = udiv exact i8 %num, %denum
171  %and = and i8 %div, 1
172  %r = icmp eq i8 %and, 0
173  ret i1 %r
174}
175
176define i1 @udiv_exact_even_odd(i8 %x, i8 %y) {
177; CHECK-LABEL: @udiv_exact_even_odd(
178; CHECK-NEXT:    ret i1 false
179;
180  %num = and i8 %x, -2
181  %denum = or i8 %y, 1
182  %div = udiv exact i8 %num, %denum
183  %and = and i8 %div, 1
184  %r = icmp eq i8 %and, 1
185  ret i1 %r
186}
187
188define i1 @udiv_exact_even_even_fail_unknown(i8 %x, i8 %y) {
189; CHECK-LABEL: @udiv_exact_even_even_fail_unknown(
190; CHECK-NEXT:    [[NUM:%.*]] = and i8 [[X:%.*]], -2
191; CHECK-NEXT:    [[DENUM:%.*]] = and i8 [[Y:%.*]], -2
192; CHECK-NEXT:    [[DIV:%.*]] = udiv exact i8 [[NUM]], [[DENUM]]
193; CHECK-NEXT:    [[AND:%.*]] = and i8 [[DIV]], 1
194; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 1
195; CHECK-NEXT:    ret i1 [[R]]
196;
197  %num = and i8 %x, -2
198  %denum = and i8 %y, -2
199  %div = udiv exact i8 %num, %denum
200  %and = and i8 %div, 1
201  %r = icmp eq i8 %and, 1
202  ret i1 %r
203}
204
205define i1 @udiv_exact_even_even_fail_unknown2(i8 %x, i8 %y) {
206; CHECK-LABEL: @udiv_exact_even_even_fail_unknown2(
207; CHECK-NEXT:    [[NUM:%.*]] = and i8 [[X:%.*]], -2
208; CHECK-NEXT:    [[DENUM:%.*]] = and i8 [[Y:%.*]], -2
209; CHECK-NEXT:    [[DIV:%.*]] = udiv exact i8 [[NUM]], [[DENUM]]
210; CHECK-NEXT:    [[AND:%.*]] = and i8 [[DIV]], 1
211; CHECK-NEXT:    [[R:%.*]] = icmp eq i8 [[AND]], 0
212; CHECK-NEXT:    ret i1 [[R]]
213;
214  %num = and i8 %x, -2
215  %denum = and i8 %y, -2
216  %div = udiv exact i8 %num, %denum
217  %and = and i8 %div, 1
218  %r = icmp eq i8 %and, 0
219  ret i1 %r
220}
221