Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / Analysis / ValueTracking / phi-known-bits.ll
blob5227661c837347eea646a0e737a3edd71b0a5d65
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=instcombine < %s -S | FileCheck %s
4 define i8 @phi_ugt_high_bits(i8 %x) {
5 ; CHECK-LABEL: @phi_ugt_high_bits(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -65
8 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
9 ; CHECK:       T:
10 ; CHECK-NEXT:    ret i8 64
11 ; CHECK:       F:
12 ; CHECK-NEXT:    br label [[T]]
14 entry:
15   %cmp = icmp ugt i8 %x, 191
16   br i1 %cmp, label %T, label %F
18   %v = phi i8 [ %x, %entry], [-1, %F]
19   %r = and i8 %v, 64
20   ret i8 %r
22   br label %T
25 define i8 @phi_ult_low_bits(i8 %x) {
26 ; CHECK-LABEL: @phi_ult_low_bits(
27 ; CHECK-NEXT:  entry:
28 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i8 [[X:%.*]], -64
29 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
30 ; CHECK:       T:
31 ; CHECK-NEXT:    br label [[F]]
32 ; CHECK:       F:
33 ; CHECK-NEXT:    ret i8 64
35 entry:
36   %cmp = icmp ult i8 %x, 192
37   br i1 %cmp, label %T, label %F
39   br label %F
41   %v = phi i8 [ %x, %entry], [-1, %T]
42   %r = and i8 %v, 64
43   ret i8 %r
46 define i8 @phi_ugt_high_bits_fail(i8 %x) {
47 ; CHECK-LABEL: @phi_ugt_high_bits_fail(
48 ; CHECK-NEXT:  entry:
49 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -66
50 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
51 ; CHECK:       T:
52 ; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
53 ; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 64
54 ; CHECK-NEXT:    ret i8 [[R]]
55 ; CHECK:       F:
56 ; CHECK-NEXT:    br label [[T]]
58 entry:
59   %cmp = icmp ugt i8 %x, 190
60   br i1 %cmp, label %T, label %F
62   %v = phi i8 [ %x, %entry], [-1, %F]
63   %r = and i8 %v, 64
64   ret i8 %r
66   br label %T
69 define i8 @phi_uge_high_bits(i8 %x) {
70 ; CHECK-LABEL: @phi_uge_high_bits(
71 ; CHECK-NEXT:  entry:
72 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], -65
73 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
74 ; CHECK:       T:
75 ; CHECK-NEXT:    ret i8 64
76 ; CHECK:       F:
77 ; CHECK-NEXT:    br label [[T]]
79 entry:
80   %cmp = icmp uge i8 %x, 192
81   br i1 %cmp, label %T, label %F
83   %v = phi i8 [ %x, %entry], [-1, %F]
84   %r = and i8 %v, 64
85   ret i8 %r
87   br label %T
90 define i8 @phi_uge_high_bits_fail(i8 %x) {
91 ; CHECK-LABEL: @phi_uge_high_bits_fail(
92 ; CHECK-NEXT:  entry:
93 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 5
94 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
95 ; CHECK:       T:
96 ; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
97 ; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 1
98 ; CHECK-NEXT:    ret i8 [[R]]
99 ; CHECK:       F:
100 ; CHECK-NEXT:    br label [[T]]
102 entry:
103   %cmp = icmp ugt i8 %x, 5
104   br i1 %cmp, label %T, label %F
106   %v = phi i8 [ %x, %entry], [-1, %F]
107   %r = and i8 %v, 1
108   ret i8 %r
110   br label %T
113 define i8 @phi_sge_high_bits(i8 %x) {
114 ; CHECK-LABEL: @phi_sge_high_bits(
115 ; CHECK-NEXT:  entry:
116 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 95
117 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
118 ; CHECK:       T:
119 ; CHECK-NEXT:    ret i8 96
120 ; CHECK:       F:
121 ; CHECK-NEXT:    br label [[T]]
123 entry:
124   %cmp = icmp sge i8 %x, 96
125   br i1 %cmp, label %T, label %F
127   %v = phi i8 [ %x, %entry], [-1, %F]
128   %r = and i8 %v, 96
129   ret i8 %r
131   br label %T
134 define i8 @phi_sge_high_bits_fail(i8 %x) {
135 ; CHECK-LABEL: @phi_sge_high_bits_fail(
136 ; CHECK-NEXT:  entry:
137 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -2
138 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
139 ; CHECK:       T:
140 ; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
141 ; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 1
142 ; CHECK-NEXT:    ret i8 [[R]]
143 ; CHECK:       F:
144 ; CHECK-NEXT:    br label [[T]]
146 entry:
147   %cmp = icmp sge i8 %x, -1
148   br i1 %cmp, label %T, label %F
150   %v = phi i8 [ %x, %entry], [-1, %F]
151   %r = and i8 %v, 1
152   ret i8 %r
154   br label %T
157 define i8 @phi_sgt_high_bits(i8 %x) {
158 ; CHECK-LABEL: @phi_sgt_high_bits(
159 ; CHECK-NEXT:  entry:
160 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -1
161 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
162 ; CHECK:       T:
163 ; CHECK-NEXT:    ret i8 0
164 ; CHECK:       F:
165 ; CHECK-NEXT:    br label [[T]]
167 entry:
168   %cmp = icmp sgt i8 %x, -1
169   br i1 %cmp, label %T, label %F
171   %v = phi i8 [ %x, %entry], [0, %F]
172   %r = and i8 %v, 128
173   ret i8 %r
175   br label %T
178 define i8 @phi_sgt_high_bits2(i8 %x) {
179 ; CHECK-LABEL: @phi_sgt_high_bits2(
180 ; CHECK-NEXT:  entry:
181 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 63
182 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
183 ; CHECK:       T:
184 ; CHECK-NEXT:    ret i8 64
185 ; CHECK:       F:
186 ; CHECK-NEXT:    br label [[T]]
188 entry:
189   %cmp = icmp sgt i8 %x, 63
190   br i1 %cmp, label %T, label %F
192   %v = phi i8 [ %x, %entry], [-1, %F]
193   %r = and i8 %v, 64
194   ret i8 %r
196   br label %T
199 define i8 @phi_sgt_high_bits_fail(i8 %x) {
200 ; CHECK-LABEL: @phi_sgt_high_bits_fail(
201 ; CHECK-NEXT:  entry:
202 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 62
203 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
204 ; CHECK:       T:
205 ; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
206 ; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 64
207 ; CHECK-NEXT:    ret i8 [[R]]
208 ; CHECK:       F:
209 ; CHECK-NEXT:    br label [[T]]
211 entry:
212   %cmp = icmp sgt i8 %x, 62
213   br i1 %cmp, label %T, label %F
215   %v = phi i8 [ %x, %entry], [-1, %F]
216   %r = and i8 %v, 64
217   ret i8 %r
219   br label %T
222 define i8 @phi_slt_high_bits(i8 %x) {
223 ; CHECK-LABEL: @phi_slt_high_bits(
224 ; CHECK-NEXT:  entry:
225 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 0
226 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
227 ; CHECK:       T:
228 ; CHECK-NEXT:    ret i8 -128
229 ; CHECK:       F:
230 ; CHECK-NEXT:    br label [[T]]
232 entry:
233   %cmp = icmp slt i8 %x, 0
234   br i1 %cmp, label %T, label %F
236   %v = phi i8 [ %x, %entry], [-1, %F]
237   %r = and i8 %v, 128
238   ret i8 %r
240   br label %T
243 define i8 @phi_slt_high_bits2(i8 %x) {
244 ; CHECK-LABEL: @phi_slt_high_bits2(
245 ; CHECK-NEXT:  entry:
246 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -64
247 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
248 ; CHECK:       T:
249 ; CHECK-NEXT:    ret i8 0
250 ; CHECK:       F:
251 ; CHECK-NEXT:    br label [[T]]
253 entry:
254   %cmp = icmp slt i8 %x, -64
255   br i1 %cmp, label %T, label %F
257   %v = phi i8 [ %x, %entry], [0, %F]
258   %r = and i8 %v, 64
259   ret i8 %r
261   br label %T
264 define i8 @phi_slt_high_bits_fail(i8 %x) {
265 ; CHECK-LABEL: @phi_slt_high_bits_fail(
266 ; CHECK-NEXT:  entry:
267 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -63
268 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
269 ; CHECK:       T:
270 ; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ 0, [[F]] ]
271 ; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 64
272 ; CHECK-NEXT:    ret i8 [[R]]
273 ; CHECK:       F:
274 ; CHECK-NEXT:    br label [[T]]
276 entry:
277   %cmp = icmp slt i8 %x, -63
278   br i1 %cmp, label %T, label %F
280   %v = phi i8 [ %x, %entry], [0, %F]
281   %r = and i8 %v, 64
282   ret i8 %r
284   br label %T
287 define i8 @phi_sle_high_bits(i8 %x) {
288 ; CHECK-LABEL: @phi_sle_high_bits(
289 ; CHECK-NEXT:  entry:
290 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -64
291 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
292 ; CHECK:       T:
293 ; CHECK-NEXT:    ret i8 0
294 ; CHECK:       F:
295 ; CHECK-NEXT:    br label [[T]]
297 entry:
298   %cmp = icmp sle i8 %x, -65
299   br i1 %cmp, label %T, label %F
301   %v = phi i8 [ %x, %entry], [0, %F]
302   %r = and i8 %v, 64
303   ret i8 %r
305   br label %T
308 define i8 @phi_sle_low_bits(i8 %x) {
309 ; CHECK-LABEL: @phi_sle_low_bits(
310 ; CHECK-NEXT:  entry:
311 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 65
312 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
313 ; CHECK:       T:
314 ; CHECK-NEXT:    br label [[F]]
315 ; CHECK:       F:
316 ; CHECK-NEXT:    ret i8 64
318 entry:
319   %cmp = icmp sle i8 %x, 64
320   br i1 %cmp, label %T, label %F
322   br label %F
324   %v = phi i8 [ %x, %entry], [-1, %T]
325   %r = and i8 %v, 64
326   ret i8 %r
329 define i8 @phi_sle_high_bits_fail(i8 %x) {
330 ; CHECK-LABEL: @phi_sle_high_bits_fail(
331 ; CHECK-NEXT:  entry:
332 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 1
333 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
334 ; CHECK:       T:
335 ; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
336 ; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], -128
337 ; CHECK-NEXT:    ret i8 [[R]]
338 ; CHECK:       F:
339 ; CHECK-NEXT:    br label [[T]]
341 entry:
342   %cmp = icmp sle i8 %x, 0
343   br i1 %cmp, label %T, label %F
345   %v = phi i8 [ %x, %entry], [-1, %F]
346   %r = and i8 %v, 128
347   ret i8 %r
349   br label %T
352 define i8 @phi_sle_high_bits_fail2(i8 %x) {
353 ; CHECK-LABEL: @phi_sle_high_bits_fail2(
354 ; CHECK-NEXT:  entry:
355 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i8 [[X:%.*]], -63
356 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
357 ; CHECK:       T:
358 ; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
359 ; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 64
360 ; CHECK-NEXT:    ret i8 [[R]]
361 ; CHECK:       F:
362 ; CHECK-NEXT:    br label [[T]]
364 entry:
365   %cmp = icmp sle i8 %x, -64
366   br i1 %cmp, label %T, label %F
368   %v = phi i8 [ %x, %entry], [-1, %F]
369   %r = and i8 %v, 64
370   ret i8 %r
372   br label %T
375 define i8 @phi_ugt_high_bits_and_known(i8 %xx) {
376 ; CHECK-LABEL: @phi_ugt_high_bits_and_known(
377 ; CHECK-NEXT:  entry:
378 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[XX:%.*]], -65
379 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
380 ; CHECK:       T:
381 ; CHECK-NEXT:    ret i8 65
382 ; CHECK:       F:
383 ; CHECK-NEXT:    br label [[T]]
385 entry:
386   %x = or i8 %xx, 1
387   %cmp = icmp ugt i8 %x, 191
388   br i1 %cmp, label %T, label %F
390   %v = phi i8 [ %x, %entry], [-1, %F]
391   %r = and i8 %v, 65
392   ret i8 %r
394   br label %T
397 define i8 @phi_ugt_high_bits_and_known_todo_high_depths(i8 %xx, i8 %y, i8 %z) {
398 ; CHECK-LABEL: @phi_ugt_high_bits_and_known_todo_high_depths(
399 ; CHECK-NEXT:  entry:
400 ; CHECK-NEXT:    [[YY:%.*]] = and i8 [[Y:%.*]], -2
401 ; CHECK-NEXT:    [[XXX:%.*]] = and i8 [[YY]], [[XX:%.*]]
402 ; CHECK-NEXT:    [[ZZ:%.*]] = or i8 [[Z:%.*]], 1
403 ; CHECK-NEXT:    [[X:%.*]] = add i8 [[XXX]], [[ZZ]]
404 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i8 [[X]], -65
405 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
406 ; CHECK:       T:
407 ; CHECK-NEXT:    [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ]
408 ; CHECK-NEXT:    [[R:%.*]] = and i8 [[V]], 65
409 ; CHECK-NEXT:    ret i8 [[R]]
410 ; CHECK:       F:
411 ; CHECK-NEXT:    br label [[T]]
413 entry:
414   %yy = and i8 %y, -2
415   %xxx = and i8 %xx, %yy
416   %zz = or i8 %z, 1
417   %x = add i8 %xxx, %zz
418   %cmp = icmp ugt i8 %x, 191
419   br i1 %cmp, label %T, label %F
421   %v = phi i8 [ %x, %entry], [-1, %F]
422   %r = and i8 %v, 65
423   ret i8 %r
425   br label %T