[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / InstCombine / icmp-logical.ll
blobcc23b114bd01b938c06c1ab748406add0ef8a118
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -instcombine -S -o - %s | FileCheck %s
4 define i1 @masked_and_notallzeroes(i32 %A) {
5 ; CHECK-LABEL: @masked_and_notallzeroes(
6 ; CHECK-NEXT:    [[MASK1:%.*]] = and i32 [[A:%.*]], 7
7 ; CHECK-NEXT:    [[TST1:%.*]] = icmp ne i32 [[MASK1]], 0
8 ; CHECK-NEXT:    ret i1 [[TST1]]
10   %mask1 = and i32 %A, 7
11   %tst1 = icmp ne i32 %mask1, 0
12   %mask2 = and i32 %A, 39
13   %tst2 = icmp ne i32 %mask2, 0
14   %res = and i1 %tst1, %tst2
15   ret i1 %res
18 define i1 @masked_and_notallzeroes_logical(i32 %A) {
19 ; CHECK-LABEL: @masked_and_notallzeroes_logical(
20 ; CHECK-NEXT:    [[MASK1:%.*]] = and i32 [[A:%.*]], 7
21 ; CHECK-NEXT:    [[TST1:%.*]] = icmp ne i32 [[MASK1]], 0
22 ; CHECK-NEXT:    ret i1 [[TST1]]
24   %mask1 = and i32 %A, 7
25   %tst1 = icmp ne i32 %mask1, 0
26   %mask2 = and i32 %A, 39
27   %tst2 = icmp ne i32 %mask2, 0
28   %res = select i1 %tst1, i1 %tst2, i1 false
29   ret i1 %res
32 define i1 @masked_or_allzeroes(i32 %A) {
33 ; CHECK-LABEL: @masked_or_allzeroes(
34 ; CHECK-NEXT:    [[MASK1:%.*]] = and i32 [[A:%.*]], 7
35 ; CHECK-NEXT:    [[TST1:%.*]] = icmp eq i32 [[MASK1]], 0
36 ; CHECK-NEXT:    ret i1 [[TST1]]
38   %mask1 = and i32 %A, 7
39   %tst1 = icmp eq i32 %mask1, 0
40   %mask2 = and i32 %A, 39
41   %tst2 = icmp eq i32 %mask2, 0
42   %res = or i1 %tst1, %tst2
43   ret i1 %res
46 define i1 @masked_or_allzeroes_logical(i32 %A) {
47 ; CHECK-LABEL: @masked_or_allzeroes_logical(
48 ; CHECK-NEXT:    [[MASK1:%.*]] = and i32 [[A:%.*]], 7
49 ; CHECK-NEXT:    [[TST1:%.*]] = icmp eq i32 [[MASK1]], 0
50 ; CHECK-NEXT:    ret i1 [[TST1]]
52   %mask1 = and i32 %A, 7
53   %tst1 = icmp eq i32 %mask1, 0
54   %mask2 = and i32 %A, 39
55   %tst2 = icmp eq i32 %mask2, 0
56   %res = select i1 %tst1, i1 true, i1 %tst2
57   ret i1 %res
60 define i1 @masked_and_notallones(i32 %A) {
61 ; CHECK-LABEL: @masked_and_notallones(
62 ; CHECK-NEXT:    [[MASK1:%.*]] = and i32 [[A:%.*]], 7
63 ; CHECK-NEXT:    [[TST1:%.*]] = icmp ne i32 [[MASK1]], 7
64 ; CHECK-NEXT:    ret i1 [[TST1]]
66   %mask1 = and i32 %A, 7
67   %tst1 = icmp ne i32 %mask1, 7
68   %mask2 = and i32 %A, 39
69   %tst2 = icmp ne i32 %mask2, 39
70   %res = and i1 %tst1, %tst2
71   ret i1 %res
74 define i1 @masked_and_notallones_logical(i32 %A) {
75 ; CHECK-LABEL: @masked_and_notallones_logical(
76 ; CHECK-NEXT:    [[MASK1:%.*]] = and i32 [[A:%.*]], 7
77 ; CHECK-NEXT:    [[TST1:%.*]] = icmp ne i32 [[MASK1]], 7
78 ; CHECK-NEXT:    ret i1 [[TST1]]
80   %mask1 = and i32 %A, 7
81   %tst1 = icmp ne i32 %mask1, 7
82   %mask2 = and i32 %A, 39
83   %tst2 = icmp ne i32 %mask2, 39
84   %res = select i1 %tst1, i1 %tst2, i1 false
85   ret i1 %res
88 define i1 @masked_or_allones(i32 %A) {
89 ; CHECK-LABEL: @masked_or_allones(
90 ; CHECK-NEXT:    [[MASK1:%.*]] = and i32 [[A:%.*]], 7
91 ; CHECK-NEXT:    [[TST1:%.*]] = icmp eq i32 [[MASK1]], 7
92 ; CHECK-NEXT:    ret i1 [[TST1]]
94   %mask1 = and i32 %A, 7
95   %tst1 = icmp eq i32 %mask1, 7
96   %mask2 = and i32 %A, 39
97   %tst2 = icmp eq i32 %mask2, 39
98   %res = or i1 %tst1, %tst2
99   ret i1 %res
102 define i1 @masked_or_allones_logical(i32 %A) {
103 ; CHECK-LABEL: @masked_or_allones_logical(
104 ; CHECK-NEXT:    [[MASK1:%.*]] = and i32 [[A:%.*]], 7
105 ; CHECK-NEXT:    [[TST1:%.*]] = icmp eq i32 [[MASK1]], 7
106 ; CHECK-NEXT:    ret i1 [[TST1]]
108   %mask1 = and i32 %A, 7
109   %tst1 = icmp eq i32 %mask1, 7
110   %mask2 = and i32 %A, 39
111   %tst2 = icmp eq i32 %mask2, 39
112   %res = select i1 %tst1, i1 true, i1 %tst2
113   ret i1 %res
116 define i1 @masked_and_notA(i32 %A) {
117 ; CHECK-LABEL: @masked_and_notA(
118 ; CHECK-NEXT:    [[MASK2:%.*]] = and i32 [[A:%.*]], 78
119 ; CHECK-NEXT:    [[TST2:%.*]] = icmp ne i32 [[MASK2]], [[A]]
120 ; CHECK-NEXT:    ret i1 [[TST2]]
122   %mask1 = and i32 %A, 14
123   %tst1 = icmp ne i32 %mask1, %A
124   %mask2 = and i32 %A, 78
125   %tst2 = icmp ne i32 %mask2, %A
126   %res = and i1 %tst1, %tst2
127   ret i1 %res
130 define i1 @masked_and_notA_logical(i32 %A) {
131 ; CHECK-LABEL: @masked_and_notA_logical(
132 ; CHECK-NEXT:    [[MASK2:%.*]] = and i32 [[A:%.*]], 78
133 ; CHECK-NEXT:    [[TST2:%.*]] = icmp ne i32 [[MASK2]], [[A]]
134 ; CHECK-NEXT:    ret i1 [[TST2]]
136   %mask1 = and i32 %A, 14
137   %tst1 = icmp ne i32 %mask1, %A
138   %mask2 = and i32 %A, 78
139   %tst2 = icmp ne i32 %mask2, %A
140   %res = select i1 %tst1, i1 %tst2, i1 false
141   ret i1 %res
144 define i1 @masked_and_notA_slightly_optimized(i32 %A) {
145 ; CHECK-LABEL: @masked_and_notA_slightly_optimized(
146 ; CHECK-NEXT:    [[T0:%.*]] = icmp ugt i32 [[A:%.*]], 7
147 ; CHECK-NEXT:    [[MASK2:%.*]] = and i32 [[A]], 39
148 ; CHECK-NEXT:    [[TST2:%.*]] = icmp ne i32 [[MASK2]], [[A]]
149 ; CHECK-NEXT:    [[RES:%.*]] = and i1 [[T0]], [[TST2]]
150 ; CHECK-NEXT:    ret i1 [[RES]]
152   %t0 = icmp uge i32 %A, 8
153   %mask2 = and i32 %A, 39
154   %tst2 = icmp ne i32 %mask2, %A
155   %res = and i1 %t0, %tst2
156   ret i1 %res
159 define i1 @masked_and_notA_slightly_optimized_logical(i32 %A) {
160 ; CHECK-LABEL: @masked_and_notA_slightly_optimized_logical(
161 ; CHECK-NEXT:    [[T0:%.*]] = icmp ugt i32 [[A:%.*]], 7
162 ; CHECK-NEXT:    [[MASK2:%.*]] = and i32 [[A]], 39
163 ; CHECK-NEXT:    [[TST2:%.*]] = icmp ne i32 [[MASK2]], [[A]]
164 ; CHECK-NEXT:    [[RES:%.*]] = and i1 [[T0]], [[TST2]]
165 ; CHECK-NEXT:    ret i1 [[RES]]
167   %t0 = icmp uge i32 %A, 8
168   %mask2 = and i32 %A, 39
169   %tst2 = icmp ne i32 %mask2, %A
170   %res = select i1 %t0, i1 %tst2, i1 false
171   ret i1 %res
174 define i1 @masked_or_A(i32 %A) {
175 ; CHECK-LABEL: @masked_or_A(
176 ; CHECK-NEXT:    [[MASK2:%.*]] = and i32 [[A:%.*]], 78
177 ; CHECK-NEXT:    [[TST2:%.*]] = icmp eq i32 [[MASK2]], [[A]]
178 ; CHECK-NEXT:    ret i1 [[TST2]]
180   %mask1 = and i32 %A, 14
181   %tst1 = icmp eq i32 %mask1, %A
182   %mask2 = and i32 %A, 78
183   %tst2 = icmp eq i32 %mask2, %A
184   %res = or i1 %tst1, %tst2
185   ret i1 %res
188 define i1 @masked_or_A_logical(i32 %A) {
189 ; CHECK-LABEL: @masked_or_A_logical(
190 ; CHECK-NEXT:    [[MASK2:%.*]] = and i32 [[A:%.*]], 78
191 ; CHECK-NEXT:    [[TST2:%.*]] = icmp eq i32 [[MASK2]], [[A]]
192 ; CHECK-NEXT:    ret i1 [[TST2]]
194   %mask1 = and i32 %A, 14
195   %tst1 = icmp eq i32 %mask1, %A
196   %mask2 = and i32 %A, 78
197   %tst2 = icmp eq i32 %mask2, %A
198   %res = select i1 %tst1, i1 true, i1 %tst2
199   ret i1 %res
202 define i1 @masked_or_A_slightly_optimized(i32 %A) {
203 ; CHECK-LABEL: @masked_or_A_slightly_optimized(
204 ; CHECK-NEXT:    [[T0:%.*]] = icmp ult i32 [[A:%.*]], 8
205 ; CHECK-NEXT:    [[MASK2:%.*]] = and i32 [[A]], 39
206 ; CHECK-NEXT:    [[TST2:%.*]] = icmp eq i32 [[MASK2]], [[A]]
207 ; CHECK-NEXT:    [[RES:%.*]] = or i1 [[T0]], [[TST2]]
208 ; CHECK-NEXT:    ret i1 [[RES]]
210   %t0 = icmp ult i32 %A, 8
211   %mask2 = and i32 %A, 39
212   %tst2 = icmp eq i32 %mask2, %A
213   %res = or i1 %t0, %tst2
214   ret i1 %res
217 define i1 @masked_or_A_slightly_optimized_logical(i32 %A) {
218 ; CHECK-LABEL: @masked_or_A_slightly_optimized_logical(
219 ; CHECK-NEXT:    [[T0:%.*]] = icmp ult i32 [[A:%.*]], 8
220 ; CHECK-NEXT:    [[MASK2:%.*]] = and i32 [[A]], 39
221 ; CHECK-NEXT:    [[TST2:%.*]] = icmp eq i32 [[MASK2]], [[A]]
222 ; CHECK-NEXT:    [[RES:%.*]] = or i1 [[T0]], [[TST2]]
223 ; CHECK-NEXT:    ret i1 [[RES]]
225   %t0 = icmp ult i32 %A, 8
226   %mask2 = and i32 %A, 39
227   %tst2 = icmp eq i32 %mask2, %A
228   %res = select i1 %t0, i1 true, i1 %tst2
229   ret i1 %res
232 define i1 @masked_or_allzeroes_notoptimised(i32 %A) {
233 ; CHECK-LABEL: @masked_or_allzeroes_notoptimised(
234 ; CHECK-NEXT:    [[MASK1:%.*]] = and i32 [[A:%.*]], 15
235 ; CHECK-NEXT:    [[TST1:%.*]] = icmp eq i32 [[MASK1]], 0
236 ; CHECK-NEXT:    [[MASK2:%.*]] = and i32 [[A]], 39
237 ; CHECK-NEXT:    [[TST2:%.*]] = icmp eq i32 [[MASK2]], 0
238 ; CHECK-NEXT:    [[RES:%.*]] = or i1 [[TST1]], [[TST2]]
239 ; CHECK-NEXT:    ret i1 [[RES]]
241   %mask1 = and i32 %A, 15
242   %tst1 = icmp eq i32 %mask1, 0
243   %mask2 = and i32 %A, 39
244   %tst2 = icmp eq i32 %mask2, 0
245   %res = or i1 %tst1, %tst2
246   ret i1 %res
249 define i1 @masked_or_allzeroes_notoptimised_logical(i32 %A) {
250 ; CHECK-LABEL: @masked_or_allzeroes_notoptimised_logical(
251 ; CHECK-NEXT:    [[MASK1:%.*]] = and i32 [[A:%.*]], 15
252 ; CHECK-NEXT:    [[TST1:%.*]] = icmp eq i32 [[MASK1]], 0
253 ; CHECK-NEXT:    [[MASK2:%.*]] = and i32 [[A]], 39
254 ; CHECK-NEXT:    [[TST2:%.*]] = icmp eq i32 [[MASK2]], 0
255 ; CHECK-NEXT:    [[RES:%.*]] = or i1 [[TST1]], [[TST2]]
256 ; CHECK-NEXT:    ret i1 [[RES]]
258   %mask1 = and i32 %A, 15
259   %tst1 = icmp eq i32 %mask1, 0
260   %mask2 = and i32 %A, 39
261   %tst2 = icmp eq i32 %mask2, 0
262   %res = select i1 %tst1, i1 true, i1 %tst2
263   ret i1 %res
266 define i1 @nomask_lhs(i32 %in) {
267 ; CHECK-LABEL: @nomask_lhs(
268 ; CHECK-NEXT:    [[MASKED:%.*]] = and i32 [[IN:%.*]], 1
269 ; CHECK-NEXT:    [[TST2:%.*]] = icmp eq i32 [[MASKED]], 0
270 ; CHECK-NEXT:    ret i1 [[TST2]]
272   %tst1 = icmp eq i32 %in, 0
273   %masked = and i32 %in, 1
274   %tst2 = icmp eq i32 %masked, 0
275   %val = or i1 %tst1, %tst2
276   ret i1 %val
279 define i1 @nomask_lhs_logical(i32 %in) {
280 ; CHECK-LABEL: @nomask_lhs_logical(
281 ; CHECK-NEXT:    [[MASKED:%.*]] = and i32 [[IN:%.*]], 1
282 ; CHECK-NEXT:    [[TST2:%.*]] = icmp eq i32 [[MASKED]], 0
283 ; CHECK-NEXT:    ret i1 [[TST2]]
285   %tst1 = icmp eq i32 %in, 0
286   %masked = and i32 %in, 1
287   %tst2 = icmp eq i32 %masked, 0
288   %val = select i1 %tst1, i1 true, i1 %tst2
289   ret i1 %val
292 define i1 @nomask_rhs(i32 %in) {
293 ; CHECK-LABEL: @nomask_rhs(
294 ; CHECK-NEXT:    [[MASKED:%.*]] = and i32 [[IN:%.*]], 1
295 ; CHECK-NEXT:    [[TST1:%.*]] = icmp eq i32 [[MASKED]], 0
296 ; CHECK-NEXT:    ret i1 [[TST1]]
298   %masked = and i32 %in, 1
299   %tst1 = icmp eq i32 %masked, 0
300   %tst2 = icmp eq i32 %in, 0
301   %val = or i1 %tst1, %tst2
302   ret i1 %val
305 define i1 @nomask_rhs_logical(i32 %in) {
306 ; CHECK-LABEL: @nomask_rhs_logical(
307 ; CHECK-NEXT:    [[MASKED:%.*]] = and i32 [[IN:%.*]], 1
308 ; CHECK-NEXT:    [[TST1:%.*]] = icmp eq i32 [[MASKED]], 0
309 ; CHECK-NEXT:    ret i1 [[TST1]]
311   %masked = and i32 %in, 1
312   %tst1 = icmp eq i32 %masked, 0
313   %tst2 = icmp eq i32 %in, 0
314   %val = select i1 %tst1, i1 true, i1 %tst2
315   ret i1 %val
318 ; TODO: This test simplifies to a constant, so the functionality and test could be in InstSimplify.
320 define i1 @fold_mask_cmps_to_false(i32 %x) {
321 ; CHECK-LABEL: @fold_mask_cmps_to_false(
322 ; CHECK-NEXT:    ret i1 false
324   %t1 = and i32 %x, 2147483647
325   %t2 = icmp eq i32 %t1, 0
326   %t3 = icmp eq i32 %x, 2147483647
327   %t4 = and i1 %t3, %t2
328   ret i1 %t4
331 define i1 @fold_mask_cmps_to_false_logical(i32 %x) {
332 ; CHECK-LABEL: @fold_mask_cmps_to_false_logical(
333 ; CHECK-NEXT:    ret i1 false
335   %t1 = and i32 %x, 2147483647
336   %t2 = icmp eq i32 %t1, 0
337   %t3 = icmp eq i32 %x, 2147483647
338   %t4 = select i1 %t3, i1 %t2, i1 false
339   ret i1 %t4
342 ; TODO: This test simplifies to a constant, so the functionality and test could be in InstSimplify.
344 define i1 @fold_mask_cmps_to_true(i32 %x) {
345 ; CHECK-LABEL: @fold_mask_cmps_to_true(
346 ; CHECK-NEXT:    ret i1 true
348   %t1 = and i32 %x, 2147483647
349   %t2 = icmp ne i32 %t1, 0
350   %t3 = icmp ne i32 %x, 2147483647
351   %t4 = or i1 %t3, %t2
352   ret i1 %t4
355 define i1 @fold_mask_cmps_to_true_logical(i32 %x) {
356 ; CHECK-LABEL: @fold_mask_cmps_to_true_logical(
357 ; CHECK-NEXT:    ret i1 true
359   %t1 = and i32 %x, 2147483647
360   %t2 = icmp ne i32 %t1, 0
361   %t3 = icmp ne i32 %x, 2147483647
362   %t4 = select i1 %t3, i1 true, i1 %t2
363   ret i1 %t4
366 ; PR32401 - https://bugs.llvm.org/show_bug.cgi?id=32401
368 define i1 @cmpeq_bitwise(i8 %a, i8 %b, i8 %c, i8 %d) {
369 ; CHECK-LABEL: @cmpeq_bitwise(
370 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i8 [[A:%.*]], [[B:%.*]]
371 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8 [[C:%.*]], [[D:%.*]]
372 ; CHECK-NEXT:    [[CMP:%.*]] = and i1 [[TMP1]], [[TMP2]]
373 ; CHECK-NEXT:    ret i1 [[CMP]]
375   %xor1 = xor i8 %a, %b
376   %xor2 = xor i8 %c, %d
377   %or = or i8 %xor1, %xor2
378   %cmp = icmp eq i8 %or, 0
379   ret i1 %cmp
382 define <2 x i1> @cmpne_bitwise(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c, <2 x i64> %d) {
383 ; CHECK-LABEL: @cmpne_bitwise(
384 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne <2 x i64> [[A:%.*]], [[B:%.*]]
385 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne <2 x i64> [[C:%.*]], [[D:%.*]]
386 ; CHECK-NEXT:    [[CMP:%.*]] = or <2 x i1> [[TMP1]], [[TMP2]]
387 ; CHECK-NEXT:    ret <2 x i1> [[CMP]]
389   %xor1 = xor <2 x i64> %a, %b
390   %xor2 = xor <2 x i64> %c, %d
391   %or = or <2 x i64> %xor1, %xor2
392   %cmp = icmp ne <2 x i64> %or, zeroinitializer
393   ret <2 x i1> %cmp
396 ; ((X & 12) != 0 & (X & 3) == 1) -> no change
397 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_0(i32 %x) {
398 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_0(
399 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 12
400 ; CHECK-NEXT:    [[T2:%.*]] = icmp ne i32 [[T1]], 0
401 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
402 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 1
403 ; CHECK-NEXT:    [[T5:%.*]] = and i1 [[T2]], [[T4]]
404 ; CHECK-NEXT:    ret i1 [[T5]]
406   %t1 = and i32 %x, 12
407   %t2 = icmp ne i32 %t1, 0
408   %t3 = and i32 %x, 3
409   %t4 = icmp eq i32 %t3, 1
410   %t5 = and i1 %t2, %t4
411   ret i1 %t5
414 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_0_logical(i32 %x) {
415 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_0_logical(
416 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 12
417 ; CHECK-NEXT:    [[T2:%.*]] = icmp ne i32 [[T1]], 0
418 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
419 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 1
420 ; CHECK-NEXT:    [[T5:%.*]] = and i1 [[T2]], [[T4]]
421 ; CHECK-NEXT:    ret i1 [[T5]]
423   %t1 = and i32 %x, 12
424   %t2 = icmp ne i32 %t1, 0
425   %t3 = and i32 %x, 3
426   %t4 = icmp eq i32 %t3, 1
427   %t5 = select i1 %t2, i1 %t4, i1 false
428   ret i1 %t5
431 ; ((X & 12) != 0 & (X & 7) == 1) -> (X & 15) == 9
432 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_1(i32 %x) {
433 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_1(
434 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
435 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 9
436 ; CHECK-NEXT:    ret i1 [[TMP2]]
438   %t1 = and i32 %x, 12
439   %t2 = icmp ne i32 %t1, 0
440   %t3 = and i32 %x, 7
441   %t4 = icmp eq i32 %t3, 1
442   %t5 = and i1 %t2, %t4
443   ret i1 %t5
446 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_1_logical(i32 %x) {
447 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_1_logical(
448 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
449 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 9
450 ; CHECK-NEXT:    ret i1 [[TMP2]]
452   %t1 = and i32 %x, 12
453   %t2 = icmp ne i32 %t1, 0
454   %t3 = and i32 %x, 7
455   %t4 = icmp eq i32 %t3, 1
456   %t5 = select i1 %t2, i1 %t4, i1 false
457   ret i1 %t5
460 ; ((X & 14) != 0 & (X & 3) == 1) -> no change
461 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_1b(i32 %x) {
462 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_1b(
463 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 14
464 ; CHECK-NEXT:    [[T2:%.*]] = icmp ne i32 [[T1]], 0
465 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
466 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 1
467 ; CHECK-NEXT:    [[T5:%.*]] = and i1 [[T2]], [[T4]]
468 ; CHECK-NEXT:    ret i1 [[T5]]
470   %t1 = and i32 %x, 14
471   %t2 = icmp ne i32 %t1, 0
472   %t3 = and i32 %x, 3
473   %t4 = icmp eq i32 %t3, 1
474   %t5 = and i1 %t2, %t4
475   ret i1 %t5
478 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_1b_logical(i32 %x) {
479 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_1b_logical(
480 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 14
481 ; CHECK-NEXT:    [[T2:%.*]] = icmp ne i32 [[T1]], 0
482 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
483 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 1
484 ; CHECK-NEXT:    [[T5:%.*]] = and i1 [[T2]], [[T4]]
485 ; CHECK-NEXT:    ret i1 [[T5]]
487   %t1 = and i32 %x, 14
488   %t2 = icmp ne i32 %t1, 0
489   %t3 = and i32 %x, 3
490   %t4 = icmp eq i32 %t3, 1
491   %t5 = select i1 %t2, i1 %t4, i1 false
492   ret i1 %t5
495 ; ((X & 3) != 0 & (X & 7) == 0) -> false
496 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_2(i32 %x) {
497 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_2(
498 ; CHECK-NEXT:    ret i1 false
500   %t1 = and i32 %x, 3
501   %t2 = icmp ne i32 %t1, 0
502   %t3 = and i32 %x, 7
503   %t4 = icmp eq i32 %t3, 0
504   %t5 = and i1 %t2, %t4
505   ret i1 %t5
508 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_2_logical(i32 %x) {
509 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_2_logical(
510 ; CHECK-NEXT:    ret i1 false
512   %t1 = and i32 %x, 3
513   %t2 = icmp ne i32 %t1, 0
514   %t3 = and i32 %x, 7
515   %t4 = icmp eq i32 %t3, 0
516   %t5 = select i1 %t2, i1 %t4, i1 false
517   ret i1 %t5
520 ; ((X & 15) != 0 & (X & 7) == 0) -> (X & 15) == 8
521 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_3(i32 %x) {
522 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_3(
523 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
524 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 8
525 ; CHECK-NEXT:    ret i1 [[TMP2]]
527   %t1 = and i32 %x, 15
528   %t2 = icmp ne i32 %t1, 0
529   %t3 = and i32 %x, 7
530   %t4 = icmp eq i32 %t3, 0
531   %t5 = and i1 %t2, %t4
532   ret i1 %t5
535 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_3_logical(i32 %x) {
536 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_3_logical(
537 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
538 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 8
539 ; CHECK-NEXT:    ret i1 [[TMP2]]
541   %t1 = and i32 %x, 15
542   %t2 = icmp ne i32 %t1, 0
543   %t3 = and i32 %x, 7
544   %t4 = icmp eq i32 %t3, 0
545   %t5 = select i1 %t2, i1 %t4, i1 false
546   ret i1 %t5
549 ; ((X & 15) != 0 & (X & 3) == 0) -> no change
550 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_3b(i32 %x) {
551 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_3b(
552 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 15
553 ; CHECK-NEXT:    [[T2:%.*]] = icmp ne i32 [[T1]], 0
554 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
555 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 0
556 ; CHECK-NEXT:    [[T5:%.*]] = and i1 [[T2]], [[T4]]
557 ; CHECK-NEXT:    ret i1 [[T5]]
559   %t1 = and i32 %x, 15
560   %t2 = icmp ne i32 %t1, 0
561   %t3 = and i32 %x, 3
562   %t4 = icmp eq i32 %t3, 0
563   %t5 = and i1 %t2, %t4
564   ret i1 %t5
567 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_3b_logical(i32 %x) {
568 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_3b_logical(
569 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 15
570 ; CHECK-NEXT:    [[T2:%.*]] = icmp ne i32 [[T1]], 0
571 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
572 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 0
573 ; CHECK-NEXT:    [[T5:%.*]] = and i1 [[T2]], [[T4]]
574 ; CHECK-NEXT:    ret i1 [[T5]]
576   %t1 = and i32 %x, 15
577   %t2 = icmp ne i32 %t1, 0
578   %t3 = and i32 %x, 3
579   %t4 = icmp eq i32 %t3, 0
580   %t5 = select i1 %t2, i1 %t4, i1 false
581   ret i1 %t5
584 ; ((X & 255) != 0 & (X & 15) == 8) -> (X & 15) == 8
585 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_4(i32 %x) {
586 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_4(
587 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
588 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 8
589 ; CHECK-NEXT:    ret i1 [[T4]]
591   %t1 = and i32 %x, 255
592   %t2 = icmp ne i32 %t1, 0
593   %t3 = and i32 %x, 15
594   %t4 = icmp eq i32 %t3, 8
595   %t5 = and i1 %t2, %t4
596   ret i1 %t5
599 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_4_logical(i32 %x) {
600 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_4_logical(
601 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
602 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 8
603 ; CHECK-NEXT:    ret i1 [[T4]]
605   %t1 = and i32 %x, 255
606   %t2 = icmp ne i32 %t1, 0
607   %t3 = and i32 %x, 15
608   %t4 = icmp eq i32 %t3, 8
609   %t5 = select i1 %t2, i1 %t4, i1 false
610   ret i1 %t5
613 ; ((X & 15) != 0 & (X & 15) == 8) -> (X & 15) == 8
614 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_5(i32 %x) {
615 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_5(
616 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
617 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 8
618 ; CHECK-NEXT:    ret i1 [[T4]]
620   %t1 = and i32 %x, 15
621   %t2 = icmp ne i32 %t1, 0
622   %t3 = and i32 %x, 15
623   %t4 = icmp eq i32 %t3, 8
624   %t5 = and i1 %t2, %t4
625   ret i1 %t5
628 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_5_logical(i32 %x) {
629 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_5_logical(
630 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
631 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 8
632 ; CHECK-NEXT:    ret i1 [[T4]]
634   %t1 = and i32 %x, 15
635   %t2 = icmp ne i32 %t1, 0
636   %t3 = and i32 %x, 15
637   %t4 = icmp eq i32 %t3, 8
638   %t5 = select i1 %t2, i1 %t4, i1 false
639   ret i1 %t5
642 ; ((X & 12) != 0 & (X & 15) == 8) -> (X & 15) == 8
643 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_6(i32 %x) {
644 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_6(
645 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
646 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 8
647 ; CHECK-NEXT:    ret i1 [[T4]]
649   %t1 = and i32 %x, 12
650   %t2 = icmp ne i32 %t1, 0
651   %t3 = and i32 %x, 15
652   %t4 = icmp eq i32 %t3, 8
653   %t5 = and i1 %t2, %t4
654   ret i1 %t5
657 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_6_logical(i32 %x) {
658 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_6_logical(
659 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
660 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 8
661 ; CHECK-NEXT:    ret i1 [[T4]]
663   %t1 = and i32 %x, 12
664   %t2 = icmp ne i32 %t1, 0
665   %t3 = and i32 %x, 15
666   %t4 = icmp eq i32 %t3, 8
667   %t5 = select i1 %t2, i1 %t4, i1 false
668   ret i1 %t5
671 ; ((X & 7) != 0 & (X & 15) == 8) -> false
672 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_7(i32 %x) {
673 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_7(
674 ; CHECK-NEXT:    ret i1 false
676   %t1 = and i32 %x, 7
677   %t2 = icmp ne i32 %t1, 0
678   %t3 = and i32 %x, 15
679   %t4 = icmp eq i32 %t3, 8
680   %t5 = and i1 %t2, %t4
681   ret i1 %t5
684 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_7_logical(i32 %x) {
685 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_7_logical(
686 ; CHECK-NEXT:    ret i1 false
688   %t1 = and i32 %x, 7
689   %t2 = icmp ne i32 %t1, 0
690   %t3 = and i32 %x, 15
691   %t4 = icmp eq i32 %t3, 8
692   %t5 = select i1 %t2, i1 %t4, i1 false
693   ret i1 %t5
696 ; ((X & 6) != 0 & (X & 15) == 8) -> false
697 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_7b(i32 %x) {
698 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_7b(
699 ; CHECK-NEXT:    ret i1 false
701   %t1 = and i32 %x, 6
702   %t2 = icmp ne i32 %t1, 0
703   %t3 = and i32 %x, 15
704   %t4 = icmp eq i32 %t3, 8
705   %t5 = and i1 %t2, %t4
706   ret i1 %t5
709 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_7b_logical(i32 %x) {
710 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_7b_logical(
711 ; CHECK-NEXT:    ret i1 false
713   %t1 = and i32 %x, 6
714   %t2 = icmp ne i32 %t1, 0
715   %t3 = and i32 %x, 15
716   %t4 = icmp eq i32 %t3, 8
717   %t5 = select i1 %t2, i1 %t4, i1 false
718   ret i1 %t5
721 ; ((X & 12) == 0 | (X & 3) != 1) -> !((X & 12) != 0 & (X & 3) == 1)) ->
722 ; no change
723 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_0(i32 %x) {
724 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_0(
725 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 12
726 ; CHECK-NEXT:    [[T2:%.*]] = icmp eq i32 [[T1]], 0
727 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
728 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 1
729 ; CHECK-NEXT:    [[T5:%.*]] = or i1 [[T2]], [[T4]]
730 ; CHECK-NEXT:    ret i1 [[T5]]
732   %t1 = and i32 %x, 12
733   %t2 = icmp eq i32 %t1, 0
734   %t3 = and i32 %x, 3
735   %t4 = icmp ne i32 %t3, 1
736   %t5 = or i1 %t2, %t4
737   ret i1 %t5
740 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_0_logical(i32 %x) {
741 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_0_logical(
742 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 12
743 ; CHECK-NEXT:    [[T2:%.*]] = icmp eq i32 [[T1]], 0
744 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
745 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 1
746 ; CHECK-NEXT:    [[T5:%.*]] = or i1 [[T2]], [[T4]]
747 ; CHECK-NEXT:    ret i1 [[T5]]
749   %t1 = and i32 %x, 12
750   %t2 = icmp eq i32 %t1, 0
751   %t3 = and i32 %x, 3
752   %t4 = icmp ne i32 %t3, 1
753   %t5 = select i1 %t2, i1 true, i1 %t4
754   ret i1 %t5
757 ; ((X & 12) == 0 | (X & 7) != 1) -> !((X & 12) != 0 & (X & 7) == 1) ->
758 ; !((X & 15) == 9) -> (X & 15) != 9
759 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_1(i32 %x) {
760 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_1(
761 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
762 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 9
763 ; CHECK-NEXT:    ret i1 [[TMP2]]
765   %t1 = and i32 %x, 12
766   %t2 = icmp eq i32 %t1, 0
767   %t3 = and i32 %x, 7
768   %t4 = icmp ne i32 %t3, 1
769   %t5 = or i1 %t2, %t4
770   ret i1 %t5
773 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_1_logical(i32 %x) {
774 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_1_logical(
775 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
776 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 9
777 ; CHECK-NEXT:    ret i1 [[TMP2]]
779   %t1 = and i32 %x, 12
780   %t2 = icmp eq i32 %t1, 0
781   %t3 = and i32 %x, 7
782   %t4 = icmp ne i32 %t3, 1
783   %t5 = select i1 %t2, i1 true, i1 %t4
784   ret i1 %t5
787 ; ((X & 14) == 0 | (X & 3) != 1) -> !((X & 14) != 0 & (X & 3) == 1) ->
788 ; no change.
789 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_1b(i32 %x) {
790 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_1b(
791 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 14
792 ; CHECK-NEXT:    [[T2:%.*]] = icmp eq i32 [[T1]], 0
793 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
794 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 1
795 ; CHECK-NEXT:    [[T5:%.*]] = or i1 [[T2]], [[T4]]
796 ; CHECK-NEXT:    ret i1 [[T5]]
798   %t1 = and i32 %x, 14
799   %t2 = icmp eq i32 %t1, 0
800   %t3 = and i32 %x, 3
801   %t4 = icmp ne i32 %t3, 1
802   %t5 = or i1 %t2, %t4
803   ret i1 %t5
806 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_1b_logical(i32 %x) {
807 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_1b_logical(
808 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 14
809 ; CHECK-NEXT:    [[T2:%.*]] = icmp eq i32 [[T1]], 0
810 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
811 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 1
812 ; CHECK-NEXT:    [[T5:%.*]] = or i1 [[T2]], [[T4]]
813 ; CHECK-NEXT:    ret i1 [[T5]]
815   %t1 = and i32 %x, 14
816   %t2 = icmp eq i32 %t1, 0
817   %t3 = and i32 %x, 3
818   %t4 = icmp ne i32 %t3, 1
819   %t5 = select i1 %t2, i1 true, i1 %t4
820   ret i1 %t5
823 ; ((X & 3) == 0 | (X & 7) != 0) -> !((X & 3) != 0 & (X & 7) == 0) ->
824 ; !(false) -> true
825 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_2(i32 %x) {
826 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_2(
827 ; CHECK-NEXT:    ret i1 true
829   %t1 = and i32 %x, 3
830   %t2 = icmp eq i32 %t1, 0
831   %t3 = and i32 %x, 7
832   %t4 = icmp ne i32 %t3, 0
833   %t5 = or i1 %t2, %t4
834   ret i1 %t5
837 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_2_logical(i32 %x) {
838 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_2_logical(
839 ; CHECK-NEXT:    ret i1 true
841   %t1 = and i32 %x, 3
842   %t2 = icmp eq i32 %t1, 0
843   %t3 = and i32 %x, 7
844   %t4 = icmp ne i32 %t3, 0
845   %t5 = select i1 %t2, i1 true, i1 %t4
846   ret i1 %t5
849 ; ((X & 15) == 0 | (X & 7) != 0) -> !((X & 15) != 0 & (X & 7) == 0) ->
850 ; !((X & 15) == 8) -> (X & 15) != 8
851 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_3(i32 %x) {
852 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_3(
853 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
854 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 8
855 ; CHECK-NEXT:    ret i1 [[TMP2]]
857   %t1 = and i32 %x, 15
858   %t2 = icmp eq i32 %t1, 0
859   %t3 = and i32 %x, 7
860   %t4 = icmp ne i32 %t3, 0
861   %t5 = or i1 %t2, %t4
862   ret i1 %t5
865 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_3_logical(i32 %x) {
866 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_3_logical(
867 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
868 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 8
869 ; CHECK-NEXT:    ret i1 [[TMP2]]
871   %t1 = and i32 %x, 15
872   %t2 = icmp eq i32 %t1, 0
873   %t3 = and i32 %x, 7
874   %t4 = icmp ne i32 %t3, 0
875   %t5 = select i1 %t2, i1 true, i1 %t4
876   ret i1 %t5
879 ; ((X & 15) == 0 | (X & 3) != 0) -> !((X & 15) != 0 & (X & 3) == 0) ->
880 ; no change.
881 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_3b(i32 %x) {
882 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_3b(
883 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 15
884 ; CHECK-NEXT:    [[T2:%.*]] = icmp eq i32 [[T1]], 0
885 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
886 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 0
887 ; CHECK-NEXT:    [[T5:%.*]] = or i1 [[T2]], [[T4]]
888 ; CHECK-NEXT:    ret i1 [[T5]]
890   %t1 = and i32 %x, 15
891   %t2 = icmp eq i32 %t1, 0
892   %t3 = and i32 %x, 3
893   %t4 = icmp ne i32 %t3, 0
894   %t5 = or i1 %t2, %t4
895   ret i1 %t5
898 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_3b_logical(i32 %x) {
899 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_3b_logical(
900 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 15
901 ; CHECK-NEXT:    [[T2:%.*]] = icmp eq i32 [[T1]], 0
902 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
903 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 0
904 ; CHECK-NEXT:    [[T5:%.*]] = or i1 [[T2]], [[T4]]
905 ; CHECK-NEXT:    ret i1 [[T5]]
907   %t1 = and i32 %x, 15
908   %t2 = icmp eq i32 %t1, 0
909   %t3 = and i32 %x, 3
910   %t4 = icmp ne i32 %t3, 0
911   %t5 = select i1 %t2, i1 true, i1 %t4
912   ret i1 %t5
915 ; ((X & 255) == 0 | (X & 15) != 8) -> !(((X & 255) != 0 & (X & 15) == 8)) ->
916 ; !((X & 15) == 8) -> ((X & 15) != 8)
917 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_4(i32 %x) {
918 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_4(
919 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
920 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 8
921 ; CHECK-NEXT:    ret i1 [[T4]]
923   %t1 = and i32 %x, 255
924   %t2 = icmp eq i32 %t1, 0
925   %t3 = and i32 %x, 15
926   %t4 = icmp ne i32 %t3, 8
927   %t5 = or i1 %t2, %t4
928   ret i1 %t5
931 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_4_logical(i32 %x) {
932 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_4_logical(
933 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
934 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 8
935 ; CHECK-NEXT:    ret i1 [[T4]]
937   %t1 = and i32 %x, 255
938   %t2 = icmp eq i32 %t1, 0
939   %t3 = and i32 %x, 15
940   %t4 = icmp ne i32 %t3, 8
941   %t5 = select i1 %t2, i1 true, i1 %t4
942   ret i1 %t5
945 ; ((X & 15) == 0 | (X & 15) != 8) -> !(((X & 15) != 0 & (X & 15) == 8)) ->
946 ; !((X & 15) == 8) -> ((X & 15) != 8)
947 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_5(i32 %x) {
948 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_5(
949 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
950 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 8
951 ; CHECK-NEXT:    ret i1 [[T4]]
953   %t1 = and i32 %x, 15
954   %t2 = icmp eq i32 %t1, 0
955   %t3 = and i32 %x, 15
956   %t4 = icmp ne i32 %t3, 8
957   %t5 = or i1 %t2, %t4
958   ret i1 %t5
961 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_5_logical(i32 %x) {
962 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_5_logical(
963 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
964 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 8
965 ; CHECK-NEXT:    ret i1 [[T4]]
967   %t1 = and i32 %x, 15
968   %t2 = icmp eq i32 %t1, 0
969   %t3 = and i32 %x, 15
970   %t4 = icmp ne i32 %t3, 8
971   %t5 = select i1 %t2, i1 true, i1 %t4
972   ret i1 %t5
975 ; ((X & 12) == 0 | (X & 15) != 8) -> !(((X & 12) != 0 & (X & 15) == 8)) ->
976 ; !((X & 15) == 8) -> ((X & 15) != 8
977 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_6(i32 %x) {
978 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_6(
979 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
980 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 8
981 ; CHECK-NEXT:    ret i1 [[T4]]
983   %t1 = and i32 %x, 12
984   %t2 = icmp eq i32 %t1, 0
985   %t3 = and i32 %x, 15
986   %t4 = icmp ne i32 %t3, 8
987   %t5 = or i1 %t2, %t4
988   ret i1 %t5
991 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_6_logical(i32 %x) {
992 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_6_logical(
993 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
994 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 8
995 ; CHECK-NEXT:    ret i1 [[T4]]
997   %t1 = and i32 %x, 12
998   %t2 = icmp eq i32 %t1, 0
999   %t3 = and i32 %x, 15
1000   %t4 = icmp ne i32 %t3, 8
1001   %t5 = select i1 %t2, i1 true, i1 %t4
1002   ret i1 %t5
1005 ; ((X & 7) == 0 | (X & 15) != 8) -> !(((X & 7) != 0 & (X & 15) == 8)) ->
1006 ; !(false) -> true
1007 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_7(i32 %x) {
1008 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_7(
1009 ; CHECK-NEXT:    ret i1 true
1011   %t1 = and i32 %x, 7
1012   %t2 = icmp eq i32 %t1, 0
1013   %t3 = and i32 %x, 15
1014   %t4 = icmp ne i32 %t3, 8
1015   %t5 = or i1 %t2, %t4
1016   ret i1 %t5
1019 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_7_logical(i32 %x) {
1020 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_7_logical(
1021 ; CHECK-NEXT:    ret i1 true
1023   %t1 = and i32 %x, 7
1024   %t2 = icmp eq i32 %t1, 0
1025   %t3 = and i32 %x, 15
1026   %t4 = icmp ne i32 %t3, 8
1027   %t5 = select i1 %t2, i1 true, i1 %t4
1028   ret i1 %t5
1031 ; ((X & 6) == 0 | (X & 15) != 8) -> !(((X & 6) != 0 & (X & 15) == 8)) ->
1032 ; !(false) -> true
1033 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_7b(i32 %x) {
1034 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_7b(
1035 ; CHECK-NEXT:    ret i1 true
1037   %t1 = and i32 %x, 6
1038   %t2 = icmp eq i32 %t1, 0
1039   %t3 = and i32 %x, 15
1040   %t4 = icmp ne i32 %t3, 8
1041   %t5 = or i1 %t2, %t4
1042   ret i1 %t5
1045 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_7b_logical(i32 %x) {
1046 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_7b_logical(
1047 ; CHECK-NEXT:    ret i1 true
1049   %t1 = and i32 %x, 6
1050   %t2 = icmp eq i32 %t1, 0
1051   %t3 = and i32 %x, 15
1052   %t4 = icmp ne i32 %t3, 8
1053   %t5 = select i1 %t2, i1 true, i1 %t4
1054   ret i1 %t5
1058 ; ((X & 12) != 0 & (X & 3) == 1) -> no change
1059 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_0(i32 %x) {
1060 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_0(
1061 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 12
1062 ; CHECK-NEXT:    [[T2:%.*]] = icmp ne i32 [[T1]], 0
1063 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
1064 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 1
1065 ; CHECK-NEXT:    [[T5:%.*]] = and i1 [[T4]], [[T2]]
1066 ; CHECK-NEXT:    ret i1 [[T5]]
1068   %t1 = and i32 %x, 12
1069   %t2 = icmp ne i32 %t1, 0
1070   %t3 = and i32 %x, 3
1071   %t4 = icmp eq i32 %t3, 1
1072   %t5 = and i1 %t4, %t2
1073   ret i1 %t5
1076 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_0_logical(i32 %x) {
1077 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_0_logical(
1078 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 12
1079 ; CHECK-NEXT:    [[T2:%.*]] = icmp ne i32 [[T1]], 0
1080 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
1081 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 1
1082 ; CHECK-NEXT:    [[T5:%.*]] = and i1 [[T4]], [[T2]]
1083 ; CHECK-NEXT:    ret i1 [[T5]]
1085   %t1 = and i32 %x, 12
1086   %t2 = icmp ne i32 %t1, 0
1087   %t3 = and i32 %x, 3
1088   %t4 = icmp eq i32 %t3, 1
1089   %t5 = select i1 %t4, i1 %t2, i1 false
1090   ret i1 %t5
1093 ; ((X & 12) != 0 & (X & 7) == 1) -> (X & 15) == 9
1094 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_1(i32 %x) {
1095 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_1(
1096 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
1097 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 9
1098 ; CHECK-NEXT:    ret i1 [[TMP2]]
1100   %t1 = and i32 %x, 12
1101   %t2 = icmp ne i32 %t1, 0
1102   %t3 = and i32 %x, 7
1103   %t4 = icmp eq i32 %t3, 1
1104   %t5 = and i1 %t4, %t2
1105   ret i1 %t5
1108 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_1_logical(i32 %x) {
1109 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_1_logical(
1110 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
1111 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 9
1112 ; CHECK-NEXT:    ret i1 [[TMP2]]
1114   %t1 = and i32 %x, 12
1115   %t2 = icmp ne i32 %t1, 0
1116   %t3 = and i32 %x, 7
1117   %t4 = icmp eq i32 %t3, 1
1118   %t5 = select i1 %t4, i1 %t2, i1 false
1119   ret i1 %t5
1122 ; ((X & 14) != 0 & (X & 3) == 1) -> no change
1123 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_1b(i32 %x) {
1124 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_1b(
1125 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 14
1126 ; CHECK-NEXT:    [[T2:%.*]] = icmp ne i32 [[T1]], 0
1127 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
1128 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 1
1129 ; CHECK-NEXT:    [[T5:%.*]] = and i1 [[T4]], [[T2]]
1130 ; CHECK-NEXT:    ret i1 [[T5]]
1132   %t1 = and i32 %x, 14
1133   %t2 = icmp ne i32 %t1, 0
1134   %t3 = and i32 %x, 3
1135   %t4 = icmp eq i32 %t3, 1
1136   %t5 = and i1 %t4, %t2
1137   ret i1 %t5
1140 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_1b_logical(i32 %x) {
1141 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_1b_logical(
1142 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 14
1143 ; CHECK-NEXT:    [[T2:%.*]] = icmp ne i32 [[T1]], 0
1144 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
1145 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 1
1146 ; CHECK-NEXT:    [[T5:%.*]] = and i1 [[T4]], [[T2]]
1147 ; CHECK-NEXT:    ret i1 [[T5]]
1149   %t1 = and i32 %x, 14
1150   %t2 = icmp ne i32 %t1, 0
1151   %t3 = and i32 %x, 3
1152   %t4 = icmp eq i32 %t3, 1
1153   %t5 = select i1 %t4, i1 %t2, i1 false
1154   ret i1 %t5
1157 ; ((X & 3) != 0 & (X & 7) == 0) -> false
1158 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_2(i32 %x) {
1159 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_2(
1160 ; CHECK-NEXT:    ret i1 false
1162   %t1 = and i32 %x, 3
1163   %t2 = icmp ne i32 %t1, 0
1164   %t3 = and i32 %x, 7
1165   %t4 = icmp eq i32 %t3, 0
1166   %t5 = and i1 %t4, %t2
1167   ret i1 %t5
1170 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_2_logical(i32 %x) {
1171 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_2_logical(
1172 ; CHECK-NEXT:    ret i1 false
1174   %t1 = and i32 %x, 3
1175   %t2 = icmp ne i32 %t1, 0
1176   %t3 = and i32 %x, 7
1177   %t4 = icmp eq i32 %t3, 0
1178   %t5 = select i1 %t4, i1 %t2, i1 false
1179   ret i1 %t5
1182 ; ((X & 15) != 0 & (X & 7) == 0) -> (X & 15) == 8
1183 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_3(i32 %x) {
1184 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_3(
1185 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
1186 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 8
1187 ; CHECK-NEXT:    ret i1 [[TMP2]]
1189   %t1 = and i32 %x, 15
1190   %t2 = icmp ne i32 %t1, 0
1191   %t3 = and i32 %x, 7
1192   %t4 = icmp eq i32 %t3, 0
1193   %t5 = and i1 %t4, %t2
1194   ret i1 %t5
1197 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_3_logical(i32 %x) {
1198 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_3_logical(
1199 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
1200 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 8
1201 ; CHECK-NEXT:    ret i1 [[TMP2]]
1203   %t1 = and i32 %x, 15
1204   %t2 = icmp ne i32 %t1, 0
1205   %t3 = and i32 %x, 7
1206   %t4 = icmp eq i32 %t3, 0
1207   %t5 = select i1 %t4, i1 %t2, i1 false
1208   ret i1 %t5
1211 ; ((X & 15) != 0 & (X & 3) == 0) -> no change
1212 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_3b(i32 %x) {
1213 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_3b(
1214 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 15
1215 ; CHECK-NEXT:    [[T2:%.*]] = icmp ne i32 [[T1]], 0
1216 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
1217 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 0
1218 ; CHECK-NEXT:    [[T5:%.*]] = and i1 [[T4]], [[T2]]
1219 ; CHECK-NEXT:    ret i1 [[T5]]
1221   %t1 = and i32 %x, 15
1222   %t2 = icmp ne i32 %t1, 0
1223   %t3 = and i32 %x, 3
1224   %t4 = icmp eq i32 %t3, 0
1225   %t5 = and i1 %t4, %t2
1226   ret i1 %t5
1229 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_3b_logical(i32 %x) {
1230 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_3b_logical(
1231 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 15
1232 ; CHECK-NEXT:    [[T2:%.*]] = icmp ne i32 [[T1]], 0
1233 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
1234 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 0
1235 ; CHECK-NEXT:    [[T5:%.*]] = and i1 [[T4]], [[T2]]
1236 ; CHECK-NEXT:    ret i1 [[T5]]
1238   %t1 = and i32 %x, 15
1239   %t2 = icmp ne i32 %t1, 0
1240   %t3 = and i32 %x, 3
1241   %t4 = icmp eq i32 %t3, 0
1242   %t5 = select i1 %t4, i1 %t2, i1 false
1243   ret i1 %t5
1246 ; ((X & 255) != 0 & (X & 15) == 8) -> (X & 15) == 8
1247 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_4(i32 %x) {
1248 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_4(
1249 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
1250 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 8
1251 ; CHECK-NEXT:    ret i1 [[T4]]
1253   %t1 = and i32 %x, 255
1254   %t2 = icmp ne i32 %t1, 0
1255   %t3 = and i32 %x, 15
1256   %t4 = icmp eq i32 %t3, 8
1257   %t5 = and i1 %t4, %t2
1258   ret i1 %t5
1261 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_4_logical(i32 %x) {
1262 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_4_logical(
1263 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
1264 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 8
1265 ; CHECK-NEXT:    ret i1 [[T4]]
1267   %t1 = and i32 %x, 255
1268   %t2 = icmp ne i32 %t1, 0
1269   %t3 = and i32 %x, 15
1270   %t4 = icmp eq i32 %t3, 8
1271   %t5 = select i1 %t4, i1 %t2, i1 false
1272   ret i1 %t5
1275 ; ((X & 15) != 0 & (X & 15) == 8) -> (X & 15) == 8
1276 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_5(i32 %x) {
1277 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_5(
1278 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
1279 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 8
1280 ; CHECK-NEXT:    ret i1 [[T4]]
1282   %t1 = and i32 %x, 15
1283   %t2 = icmp ne i32 %t1, 0
1284   %t3 = and i32 %x, 15
1285   %t4 = icmp eq i32 %t3, 8
1286   %t5 = and i1 %t4, %t2
1287   ret i1 %t5
1290 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_5_logical(i32 %x) {
1291 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_5_logical(
1292 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
1293 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 8
1294 ; CHECK-NEXT:    ret i1 [[T4]]
1296   %t1 = and i32 %x, 15
1297   %t2 = icmp ne i32 %t1, 0
1298   %t3 = and i32 %x, 15
1299   %t4 = icmp eq i32 %t3, 8
1300   %t5 = select i1 %t4, i1 %t2, i1 false
1301   ret i1 %t5
1304 ; ((X & 12) != 0 & (X & 15) == 8) -> (X & 15) == 8
1305 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_6(i32 %x) {
1306 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_6(
1307 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
1308 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 8
1309 ; CHECK-NEXT:    ret i1 [[T4]]
1311   %t1 = and i32 %x, 12
1312   %t2 = icmp ne i32 %t1, 0
1313   %t3 = and i32 %x, 15
1314   %t4 = icmp eq i32 %t3, 8
1315   %t5 = and i1 %t4, %t2
1316   ret i1 %t5
1319 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_6_logical(i32 %x) {
1320 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_6_logical(
1321 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
1322 ; CHECK-NEXT:    [[T4:%.*]] = icmp eq i32 [[T3]], 8
1323 ; CHECK-NEXT:    ret i1 [[T4]]
1325   %t1 = and i32 %x, 12
1326   %t2 = icmp ne i32 %t1, 0
1327   %t3 = and i32 %x, 15
1328   %t4 = icmp eq i32 %t3, 8
1329   %t5 = select i1 %t4, i1 %t2, i1 false
1330   ret i1 %t5
1333 ; ((X & 7) != 0 & (X & 15) == 8) -> false
1334 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_7(i32 %x) {
1335 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_7(
1336 ; CHECK-NEXT:    ret i1 false
1338   %t1 = and i32 %x, 7
1339   %t2 = icmp ne i32 %t1, 0
1340   %t3 = and i32 %x, 15
1341   %t4 = icmp eq i32 %t3, 8
1342   %t5 = and i1 %t4, %t2
1343   ret i1 %t5
1346 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_7_logical(i32 %x) {
1347 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_7_logical(
1348 ; CHECK-NEXT:    ret i1 false
1350   %t1 = and i32 %x, 7
1351   %t2 = icmp ne i32 %t1, 0
1352   %t3 = and i32 %x, 15
1353   %t4 = icmp eq i32 %t3, 8
1354   %t5 = select i1 %t4, i1 %t2, i1 false
1355   ret i1 %t5
1358 ; ((X & 6) != 0 & (X & 15) == 8) -> false
1359 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_7b(i32 %x) {
1360 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_7b(
1361 ; CHECK-NEXT:    ret i1 false
1363   %t1 = and i32 %x, 6
1364   %t2 = icmp ne i32 %t1, 0
1365   %t3 = and i32 %x, 15
1366   %t4 = icmp eq i32 %t3, 8
1367   %t5 = and i1 %t4, %t2
1368   ret i1 %t5
1371 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_swapped_7b_logical(i32 %x) {
1372 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_swapped_7b_logical(
1373 ; CHECK-NEXT:    ret i1 false
1375   %t1 = and i32 %x, 6
1376   %t2 = icmp ne i32 %t1, 0
1377   %t3 = and i32 %x, 15
1378   %t4 = icmp eq i32 %t3, 8
1379   %t5 = select i1 %t4, i1 %t2, i1 false
1380   ret i1 %t5
1383 ; ((X & 12) == 0 | (X & 3) != 1) -> !((X & 12) != 0 & (X & 3) == 1)) ->
1384 ; no change
1385 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_0(i32 %x) {
1386 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_0(
1387 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 12
1388 ; CHECK-NEXT:    [[T2:%.*]] = icmp eq i32 [[T1]], 0
1389 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
1390 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 1
1391 ; CHECK-NEXT:    [[T5:%.*]] = or i1 [[T4]], [[T2]]
1392 ; CHECK-NEXT:    ret i1 [[T5]]
1394   %t1 = and i32 %x, 12
1395   %t2 = icmp eq i32 %t1, 0
1396   %t3 = and i32 %x, 3
1397   %t4 = icmp ne i32 %t3, 1
1398   %t5 = or i1 %t4, %t2
1399   ret i1 %t5
1402 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_0_logical(i32 %x) {
1403 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_0_logical(
1404 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 12
1405 ; CHECK-NEXT:    [[T2:%.*]] = icmp eq i32 [[T1]], 0
1406 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
1407 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 1
1408 ; CHECK-NEXT:    [[T5:%.*]] = or i1 [[T4]], [[T2]]
1409 ; CHECK-NEXT:    ret i1 [[T5]]
1411   %t1 = and i32 %x, 12
1412   %t2 = icmp eq i32 %t1, 0
1413   %t3 = and i32 %x, 3
1414   %t4 = icmp ne i32 %t3, 1
1415   %t5 = select i1 %t4, i1 true, i1 %t2
1416   ret i1 %t5
1419 ; ((X & 12) == 0 | (X & 7) != 1) -> !((X & 12) != 0 & (X & 7) == 1) ->
1420 ; !((X & 15) == 9) -> (X & 15) != 9
1421 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_1(i32 %x) {
1422 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_1(
1423 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
1424 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 9
1425 ; CHECK-NEXT:    ret i1 [[TMP2]]
1427   %t1 = and i32 %x, 12
1428   %t2 = icmp eq i32 %t1, 0
1429   %t3 = and i32 %x, 7
1430   %t4 = icmp ne i32 %t3, 1
1431   %t5 = or i1 %t4, %t2
1432   ret i1 %t5
1435 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_1_logical(i32 %x) {
1436 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_1_logical(
1437 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
1438 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 9
1439 ; CHECK-NEXT:    ret i1 [[TMP2]]
1441   %t1 = and i32 %x, 12
1442   %t2 = icmp eq i32 %t1, 0
1443   %t3 = and i32 %x, 7
1444   %t4 = icmp ne i32 %t3, 1
1445   %t5 = select i1 %t4, i1 true, i1 %t2
1446   ret i1 %t5
1449 ; ((X & 14) == 0 | (X & 3) != 1) -> !((X & 14) != 0 & (X & 3) == 1) ->
1450 ; no change.
1451 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_1b(i32 %x) {
1452 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_1b(
1453 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 14
1454 ; CHECK-NEXT:    [[T2:%.*]] = icmp eq i32 [[T1]], 0
1455 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
1456 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 1
1457 ; CHECK-NEXT:    [[T5:%.*]] = or i1 [[T4]], [[T2]]
1458 ; CHECK-NEXT:    ret i1 [[T5]]
1460   %t1 = and i32 %x, 14
1461   %t2 = icmp eq i32 %t1, 0
1462   %t3 = and i32 %x, 3
1463   %t4 = icmp ne i32 %t3, 1
1464   %t5 = or i1 %t4, %t2
1465   ret i1 %t5
1468 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_1b_logical(i32 %x) {
1469 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_1b_logical(
1470 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 14
1471 ; CHECK-NEXT:    [[T2:%.*]] = icmp eq i32 [[T1]], 0
1472 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
1473 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 1
1474 ; CHECK-NEXT:    [[T5:%.*]] = or i1 [[T4]], [[T2]]
1475 ; CHECK-NEXT:    ret i1 [[T5]]
1477   %t1 = and i32 %x, 14
1478   %t2 = icmp eq i32 %t1, 0
1479   %t3 = and i32 %x, 3
1480   %t4 = icmp ne i32 %t3, 1
1481   %t5 = select i1 %t4, i1 true, i1 %t2
1482   ret i1 %t5
1485 ; ((X & 3) == 0 | (X & 7) != 0) -> !((X & 3) != 0 & (X & 7) == 0) ->
1486 ; !(false) -> true
1487 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_2(i32 %x) {
1488 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_2(
1489 ; CHECK-NEXT:    ret i1 true
1491   %t1 = and i32 %x, 3
1492   %t2 = icmp eq i32 %t1, 0
1493   %t3 = and i32 %x, 7
1494   %t4 = icmp ne i32 %t3, 0
1495   %t5 = or i1 %t4, %t2
1496   ret i1 %t5
1499 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_2_logical(i32 %x) {
1500 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_2_logical(
1501 ; CHECK-NEXT:    ret i1 true
1503   %t1 = and i32 %x, 3
1504   %t2 = icmp eq i32 %t1, 0
1505   %t3 = and i32 %x, 7
1506   %t4 = icmp ne i32 %t3, 0
1507   %t5 = select i1 %t4, i1 true, i1 %t2
1508   ret i1 %t5
1511 ; ((X & 15) == 0 | (X & 7) != 0) -> !((X & 15) != 0 & (X & 7) == 0) ->
1512 ; !((X & 15) == 8) -> (X & 15) != 8
1513 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_3(i32 %x) {
1514 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_3(
1515 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
1516 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 8
1517 ; CHECK-NEXT:    ret i1 [[TMP2]]
1519   %t1 = and i32 %x, 15
1520   %t2 = icmp eq i32 %t1, 0
1521   %t3 = and i32 %x, 7
1522   %t4 = icmp ne i32 %t3, 0
1523   %t5 = or i1 %t4, %t2
1524   ret i1 %t5
1527 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_3_logical(i32 %x) {
1528 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_3_logical(
1529 ; CHECK-NEXT:    [[TMP1:%.*]] = and i32 [[X:%.*]], 15
1530 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 8
1531 ; CHECK-NEXT:    ret i1 [[TMP2]]
1533   %t1 = and i32 %x, 15
1534   %t2 = icmp eq i32 %t1, 0
1535   %t3 = and i32 %x, 7
1536   %t4 = icmp ne i32 %t3, 0
1537   %t5 = select i1 %t4, i1 true, i1 %t2
1538   ret i1 %t5
1541 ; ((X & 15) == 0 | (X & 3) != 0) -> !((X & 15) != 0 & (X & 3) == 0) ->
1542 ; no change.
1543 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_3b(i32 %x) {
1544 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_3b(
1545 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 15
1546 ; CHECK-NEXT:    [[T2:%.*]] = icmp eq i32 [[T1]], 0
1547 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
1548 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 0
1549 ; CHECK-NEXT:    [[T5:%.*]] = or i1 [[T4]], [[T2]]
1550 ; CHECK-NEXT:    ret i1 [[T5]]
1552   %t1 = and i32 %x, 15
1553   %t2 = icmp eq i32 %t1, 0
1554   %t3 = and i32 %x, 3
1555   %t4 = icmp ne i32 %t3, 0
1556   %t5 = or i1 %t4, %t2
1557   ret i1 %t5
1560 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_3b_logical(i32 %x) {
1561 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_3b_logical(
1562 ; CHECK-NEXT:    [[T1:%.*]] = and i32 [[X:%.*]], 15
1563 ; CHECK-NEXT:    [[T2:%.*]] = icmp eq i32 [[T1]], 0
1564 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X]], 3
1565 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 0
1566 ; CHECK-NEXT:    [[T5:%.*]] = or i1 [[T4]], [[T2]]
1567 ; CHECK-NEXT:    ret i1 [[T5]]
1569   %t1 = and i32 %x, 15
1570   %t2 = icmp eq i32 %t1, 0
1571   %t3 = and i32 %x, 3
1572   %t4 = icmp ne i32 %t3, 0
1573   %t5 = select i1 %t4, i1 true, i1 %t2
1574   ret i1 %t5
1577 ; ((X & 255) == 0 | (X & 15) != 8) -> !(((X & 255) != 0 & (X & 15) == 8)) ->
1578 ; !((X & 15) == 8) -> ((X & 15) != 8)
1579 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_4(i32 %x) {
1580 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_4(
1581 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
1582 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 8
1583 ; CHECK-NEXT:    ret i1 [[T4]]
1585   %t1 = and i32 %x, 255
1586   %t2 = icmp eq i32 %t1, 0
1587   %t3 = and i32 %x, 15
1588   %t4 = icmp ne i32 %t3, 8
1589   %t5 = or i1 %t4, %t2
1590   ret i1 %t5
1593 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_4_logical(i32 %x) {
1594 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_4_logical(
1595 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
1596 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 8
1597 ; CHECK-NEXT:    ret i1 [[T4]]
1599   %t1 = and i32 %x, 255
1600   %t2 = icmp eq i32 %t1, 0
1601   %t3 = and i32 %x, 15
1602   %t4 = icmp ne i32 %t3, 8
1603   %t5 = select i1 %t4, i1 true, i1 %t2
1604   ret i1 %t5
1607 ; ((X & 15) == 0 | (X & 15) != 8) -> !(((X & 15) != 0 & (X & 15) == 8)) ->
1608 ; !((X & 15) == 8) -> ((X & 15) != 8)
1609 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_5(i32 %x) {
1610 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_5(
1611 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
1612 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 8
1613 ; CHECK-NEXT:    ret i1 [[T4]]
1615   %t1 = and i32 %x, 15
1616   %t2 = icmp eq i32 %t1, 0
1617   %t3 = and i32 %x, 15
1618   %t4 = icmp ne i32 %t3, 8
1619   %t5 = or i1 %t4, %t2
1620   ret i1 %t5
1623 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_5_logical(i32 %x) {
1624 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_5_logical(
1625 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
1626 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 8
1627 ; CHECK-NEXT:    ret i1 [[T4]]
1629   %t1 = and i32 %x, 15
1630   %t2 = icmp eq i32 %t1, 0
1631   %t3 = and i32 %x, 15
1632   %t4 = icmp ne i32 %t3, 8
1633   %t5 = select i1 %t4, i1 true, i1 %t2
1634   ret i1 %t5
1637 ; ((X & 12) == 0 | (X & 15) != 8) -> !(((X & 12) != 0 & (X & 15) == 8)) ->
1638 ; !((X & 15) == 8) -> ((X & 15) != 8
1639 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_6(i32 %x) {
1640 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_6(
1641 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
1642 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 8
1643 ; CHECK-NEXT:    ret i1 [[T4]]
1645   %t1 = and i32 %x, 12
1646   %t2 = icmp eq i32 %t1, 0
1647   %t3 = and i32 %x, 15
1648   %t4 = icmp ne i32 %t3, 8
1649   %t5 = or i1 %t4, %t2
1650   ret i1 %t5
1653 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_6_logical(i32 %x) {
1654 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_6_logical(
1655 ; CHECK-NEXT:    [[T3:%.*]] = and i32 [[X:%.*]], 15
1656 ; CHECK-NEXT:    [[T4:%.*]] = icmp ne i32 [[T3]], 8
1657 ; CHECK-NEXT:    ret i1 [[T4]]
1659   %t1 = and i32 %x, 12
1660   %t2 = icmp eq i32 %t1, 0
1661   %t3 = and i32 %x, 15
1662   %t4 = icmp ne i32 %t3, 8
1663   %t5 = select i1 %t4, i1 true, i1 %t2
1664   ret i1 %t5
1667 ; ((X & 7) == 0 | (X & 15) != 8) -> !(((X & 7) != 0 & (X & 15) == 8)) ->
1668 ; !(false) -> true
1669 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_7(i32 %x) {
1670 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_7(
1671 ; CHECK-NEXT:    ret i1 true
1673   %t1 = and i32 %x, 7
1674   %t2 = icmp eq i32 %t1, 0
1675   %t3 = and i32 %x, 15
1676   %t4 = icmp ne i32 %t3, 8
1677   %t5 = or i1 %t4, %t2
1678   ret i1 %t5
1681 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_7_logical(i32 %x) {
1682 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_7_logical(
1683 ; CHECK-NEXT:    ret i1 true
1685   %t1 = and i32 %x, 7
1686   %t2 = icmp eq i32 %t1, 0
1687   %t3 = and i32 %x, 15
1688   %t4 = icmp ne i32 %t3, 8
1689   %t5 = select i1 %t4, i1 true, i1 %t2
1690   ret i1 %t5
1693 ; ((X & 6) == 0 | (X & 15) != 8) -> !(((X & 6) != 0 & (X & 15) == 8)) ->
1694 ; !(false) -> true
1695 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_7b(i32 %x) {
1696 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_7b(
1697 ; CHECK-NEXT:    ret i1 true
1699   %t1 = and i32 %x, 6
1700   %t2 = icmp eq i32 %t1, 0
1701   %t3 = and i32 %x, 15
1702   %t4 = icmp ne i32 %t3, 8
1703   %t5 = or i1 %t4, %t2
1704   ret i1 %t5
1707 define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_7b_logical(i32 %x) {
1708 ; CHECK-LABEL: @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_7b_logical(
1709 ; CHECK-NEXT:    ret i1 true
1711   %t1 = and i32 %x, 6
1712   %t2 = icmp eq i32 %t1, 0
1713   %t3 = and i32 %x, 15
1714   %t4 = icmp ne i32 %t3, 8
1715   %t5 = select i1 %t4, i1 true, i1 %t2
1716   ret i1 %t5