1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=instcombine -S -o - %s | FileCheck %s
6 ; ((X u< 0x8000000) & ((X & 0x60000000) != 0x60000000)) -> X u< 0x60000000
7 define i1 @icmp_power2_and_icmp_shifted_mask_2147483648_1610612736(i32 %x) {
8 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_2147483648_1610612736(
9 ; CHECK-NEXT: [[T4:%.*]] = icmp ult i32 [[X:%.*]], 1610612736
10 ; CHECK-NEXT: ret i1 [[T4]]
12 %t1 = icmp ult i32 %x, 2147483648
13 %t2 = and i32 %x, 1610612736
14 %t3 = icmp ne i32 %t2, 1610612736
19 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_2147483648_1610612736(i32 %x) {
20 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_2147483648_1610612736(
21 ; CHECK-NEXT: [[T4:%.*]] = icmp ult i32 [[X:%.*]], 1610612736
22 ; CHECK-NEXT: ret i1 [[T4]]
24 %t1 = icmp ult i32 %x, 2147483648
25 %t2 = and i32 %x, 1610612736
26 %t3 = icmp ne i32 %t2, 1610612736
31 ; ((X u< 0x8000000) & ((X & 0x7FFFFFFF) != 0x7FFFFFFF)) -> X u< 0x7FFFFFFF
32 define i1 @icmp_power2_and_icmp_shifted_mask_2147483648_2147483647(i32 %x) {
33 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_2147483648_2147483647(
34 ; CHECK-NEXT: [[T4:%.*]] = icmp ult i32 [[X:%.*]], 2147483647
35 ; CHECK-NEXT: ret i1 [[T4]]
37 %t1 = icmp ult i32 %x, 2147483648
38 %t2 = and i32 %x, 2147483647
39 %t3 = icmp ne i32 %t2, 2147483647
44 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_2147483648_2147483647(i32 %x) {
45 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_2147483648_2147483647(
46 ; CHECK-NEXT: [[T4:%.*]] = icmp ult i32 [[X:%.*]], 2147483647
47 ; CHECK-NEXT: ret i1 [[T4]]
49 %t1 = icmp ult i32 %x, 2147483648
50 %t2 = and i32 %x, 2147483647
51 %t3 = icmp ne i32 %t2, 2147483647
56 ; ((X u< 0x4000000) & ((X & 0x30000000) != 0x30000000)) -> X u< 0x30000000
57 define i1 @icmp_power2_and_icmp_shifted_mask_2147483648_805306368(i32 %x) {
58 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_2147483648_805306368(
59 ; CHECK-NEXT: [[T4:%.*]] = icmp ult i32 [[X:%.*]], 805306368
60 ; CHECK-NEXT: ret i1 [[T4]]
62 %t1 = icmp ult i32 %x, 1073741824
63 %t2 = and i32 %x, 805306368
64 %t3 = icmp ne i32 %t2, 805306368
69 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_2147483648_805306368(i32 %x) {
70 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_2147483648_805306368(
71 ; CHECK-NEXT: [[T4:%.*]] = icmp ult i32 [[X:%.*]], 805306368
72 ; CHECK-NEXT: ret i1 [[T4]]
74 %t1 = icmp ult i32 %x, 1073741824
75 %t2 = and i32 %x, 805306368
76 %t3 = icmp ne i32 %t2, 805306368
81 ; ((X u< 0x40000000) & ((X & 0x3FFFFFFF) != 0x3FFFFFFF)) -> X u< 0x3FFFFFFF
82 define i1 @icmp_power2_and_icmp_shifted_mask_1073741824_1073741823(i32 %x) {
83 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_1073741824_1073741823(
84 ; CHECK-NEXT: [[T4:%.*]] = icmp ult i32 [[X:%.*]], 1073741823
85 ; CHECK-NEXT: ret i1 [[T4]]
87 %t1 = icmp ult i32 %x, 1073741824
88 %t2 = and i32 %x, 1073741823
89 %t3 = icmp ne i32 %t2, 1073741823
94 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_1073741824_1073741823(i32 %x) {
95 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_1073741824_1073741823(
96 ; CHECK-NEXT: [[T4:%.*]] = icmp ult i32 [[X:%.*]], 1073741823
97 ; CHECK-NEXT: ret i1 [[T4]]
99 %t1 = icmp ult i32 %x, 1073741824
100 %t2 = and i32 %x, 1073741823
101 %t3 = icmp ne i32 %t2, 1073741823
102 %t4 = and i1 %t3, %t1
106 ; ((X u< 8) & ((X & 7) != 7)) -> X u< 7
107 define i1 @icmp_power2_and_icmp_shifted_mask_8_7(i32 %x) {
108 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_8_7(
109 ; CHECK-NEXT: [[T4:%.*]] = icmp ult i32 [[X:%.*]], 7
110 ; CHECK-NEXT: ret i1 [[T4]]
112 %t1 = icmp ult i32 %x, 8
114 %t3 = icmp ne i32 %t2, 7
115 %t4 = and i1 %t1, %t3
119 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_8_7(i32 %x) {
120 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_8_7(
121 ; CHECK-NEXT: [[T4:%.*]] = icmp ult i32 [[X:%.*]], 7
122 ; CHECK-NEXT: ret i1 [[T4]]
124 %t1 = icmp ult i32 %x, 8
126 %t3 = icmp ne i32 %t2, 7
127 %t4 = and i1 %t3, %t1
131 ; ((X u< 8) & ((X & 6) != 6)) -> X u< 6
132 define i1 @icmp_power2_and_icmp_shifted_mask_8_6(i32 %x) {
133 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_8_6(
134 ; CHECK-NEXT: [[T4:%.*]] = icmp ult i32 [[X:%.*]], 6
135 ; CHECK-NEXT: ret i1 [[T4]]
137 %t1 = icmp ult i32 %x, 8
139 %t3 = icmp ne i32 %t2, 6
140 %t4 = and i1 %t1, %t3
144 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_8_6(i32 %x) {
145 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_8_6(
146 ; CHECK-NEXT: [[T4:%.*]] = icmp ult i32 [[X:%.*]], 6
147 ; CHECK-NEXT: ret i1 [[T4]]
149 %t1 = icmp ult i32 %x, 8
151 %t3 = icmp ne i32 %t2, 6
152 %t4 = and i1 %t3, %t1
156 ; ((X u< 8) & ((X & 5) != 5)) -> no change
157 define i1 @icmp_power2_and_icmp_shifted_mask_8_5_gap_in_mask_fail(i32 %x) {
158 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_8_5_gap_in_mask_fail(
159 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 8
160 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 5
161 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 5
162 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T1]], [[T3]]
163 ; CHECK-NEXT: ret i1 [[T4]]
165 %t1 = icmp ult i32 %x, 8
167 %t3 = icmp ne i32 %t2, 5
168 %t4 = and i1 %t1, %t3
172 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_8_5_gap_in_mask_fail(i32 %x) {
173 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_8_5_gap_in_mask_fail(
174 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 8
175 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 5
176 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 5
177 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T3]], [[T1]]
178 ; CHECK-NEXT: ret i1 [[T4]]
180 %t1 = icmp ult i32 %x, 8
182 %t3 = icmp ne i32 %t2, 5
183 %t4 = and i1 %t3, %t1
187 ; ((X u< 8) & ((X & 3) != 3)) -> no change
188 define i1 @icmp_power2_and_icmp_shifted_mask_8_3_gap_between_masks_fail(i32 %x) {
189 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_8_3_gap_between_masks_fail(
190 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 8
191 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 3
192 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 3
193 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T1]], [[T3]]
194 ; CHECK-NEXT: ret i1 [[T4]]
196 %t1 = icmp ult i32 %x, 8
198 %t3 = icmp ne i32 %t2, 3
199 %t4 = and i1 %t1, %t3
203 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_8_3_gap_between_masks_fail(i32 %x) {
204 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_8_3_gap_between_masks_fail(
205 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 8
206 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 3
207 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 3
208 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T3]], [[T1]]
209 ; CHECK-NEXT: ret i1 [[T4]]
211 %t1 = icmp ult i32 %x, 8
213 %t3 = icmp ne i32 %t2, 3
214 %t4 = and i1 %t3, %t1
218 ; ((X u< 0x100) & ((X & 0x0EF) != 0x0EF)) -> no change
219 define i1 @icmp_power2_and_icmp_shifted_mask_256_239_gap_in_mask_fail(i32 %x) {
220 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_256_239_gap_in_mask_fail(
221 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 256
222 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 239
223 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 239
224 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T1]], [[T3]]
225 ; CHECK-NEXT: ret i1 [[T4]]
227 %t1 = icmp ult i32 %x, 256
228 %t2 = and i32 %x, 239
229 %t3 = icmp ne i32 %t2, 239
230 %t4 = and i1 %t1, %t3
234 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_256_239_gap_in_mask_fail(i32 %x) {
235 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_256_239_gap_in_mask_fail(
236 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 256
237 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 239
238 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 239
239 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T3]], [[T1]]
240 ; CHECK-NEXT: ret i1 [[T4]]
242 %t1 = icmp ult i32 %x, 256
243 %t2 = and i32 %x, 239
244 %t3 = icmp ne i32 %t2, 239
245 %t4 = and i1 %t3, %t1
249 ; ((X u< 0x08) & ((X & 0x70) != 0x70)) -> no change
250 define i1 @icmp_power2_and_icmp_shifted_mask_8_112_mask_to_left_fail(i32 %x) {
251 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_8_112_mask_to_left_fail(
252 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 8
253 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 112
254 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 112
255 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T1]], [[T3]]
256 ; CHECK-NEXT: ret i1 [[T4]]
258 %t1 = icmp ult i32 %x, 8
259 %t2 = and i32 %x, 112
260 %t3 = icmp ne i32 %t2, 112
261 %t4 = and i1 %t1, %t3
265 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_8_112_mask_to_left_fail(i32 %x) {
266 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_8_112_mask_to_left_fail(
267 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 8
268 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 112
269 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 112
270 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T3]], [[T1]]
271 ; CHECK-NEXT: ret i1 [[T4]]
273 %t1 = icmp ult i32 %x, 8
274 %t2 = and i32 %x, 112
275 %t3 = icmp ne i32 %t2, 112
276 %t4 = and i1 %t3, %t1
280 ; ((X u< 0x08) & ((X & 0x38) != 0x38))) -> no change
281 define i1 @icmp_power2_and_icmp_shifted_mask_8_56_mask_overlap_fail(i32 %x) {
282 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_8_56_mask_overlap_fail(
283 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 8
284 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 56
285 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 56
286 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T1]], [[T3]]
287 ; CHECK-NEXT: ret i1 [[T4]]
289 %t1 = icmp ult i32 %x, 8
291 %t3 = icmp ne i32 %t2, 56
292 %t4 = and i1 %t1, %t3
296 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_8_56_mask_overlap_fail(i32 %x) {
297 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_8_56_mask_overlap_fail(
298 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 8
299 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 56
300 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 56
301 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T3]], [[T1]]
302 ; CHECK-NEXT: ret i1 [[T4]]
304 %t1 = icmp ult i32 %x, 8
306 %t3 = icmp ne i32 %t2, 56
307 %t4 = and i1 %t3, %t1
311 ; ((X u< 0x08) & ((X & 0x18) != 0x18)) -> no change
312 define i1 @icmp_power2_and_icmp_shifted_mask_8_24_mask_overlap_fail(i32 %x) {
313 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_8_24_mask_overlap_fail(
314 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 8
315 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 24
316 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 24
317 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T1]], [[T3]]
318 ; CHECK-NEXT: ret i1 [[T4]]
320 %t1 = icmp ult i32 %x, 8
322 %t3 = icmp ne i32 %t2, 24
323 %t4 = and i1 %t1, %t3
327 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_8_24_mask_overlap_fail(i32 %x) {
328 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_8_24_mask_overlap_fail(
329 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 8
330 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 24
331 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 24
332 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T3]], [[T1]]
333 ; CHECK-NEXT: ret i1 [[T4]]
335 %t1 = icmp ult i32 %x, 8
337 %t3 = icmp ne i32 %t2, 24
338 %t4 = and i1 %t3, %t1
342 ; ((X u< 0x8) & ((X & 0xC) != 0xC)) -> no change
343 define i1 @icmp_power2_and_icmp_shifted_mask_8_12_mask_overlap_fail(i32 %x) {
344 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_8_12_mask_overlap_fail(
345 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 8
346 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 12
347 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 12
348 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T1]], [[T3]]
349 ; CHECK-NEXT: ret i1 [[T4]]
351 %t1 = icmp ult i32 %x, 8
353 %t3 = icmp ne i32 %t2, 12
354 %t4 = and i1 %t1, %t3
358 define i1 @icmp_power2_and_icmp_shifted_mask_swapped_8_12_mask_overlap_fail(i32 %x) {
359 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_swapped_8_12_mask_overlap_fail(
360 ; CHECK-NEXT: [[T1:%.*]] = icmp ult i32 [[X:%.*]], 8
361 ; CHECK-NEXT: [[T2:%.*]] = and i32 [[X]], 12
362 ; CHECK-NEXT: [[T3:%.*]] = icmp ne i32 [[T2]], 12
363 ; CHECK-NEXT: [[T4:%.*]] = and i1 [[T3]], [[T1]]
364 ; CHECK-NEXT: ret i1 [[T4]]
366 %t1 = icmp ult i32 %x, 8
368 %t3 = icmp ne i32 %t2, 12
369 %t4 = and i1 %t3, %t1
373 ; Vector of 1 reduction
374 define <1 x i1> @icmp_power2_and_icmp_shifted_mask_vector_2147483648_2147483647(<1 x i32> %x) {
375 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_2147483648_2147483647(
376 ; CHECK-NEXT: [[T4:%.*]] = icmp ult <1 x i32> [[X:%.*]], splat (i32 2147483647)
377 ; CHECK-NEXT: ret <1 x i1> [[T4]]
379 %t1 = icmp ult <1 x i32> %x, <i32 2147483648>
380 %t2 = and <1 x i32> %x, <i32 2147483647>
381 %t3 = icmp ne <1 x i32> %t2, <i32 2147483647>
382 %t4 = and <1 x i1> %t1, %t3
386 define <1 x i1> @icmp_power2_and_icmp_shifted_mask_vector_swapped_2147483648_2147483647(<1 x i32> %x) {
387 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_swapped_2147483648_2147483647(
388 ; CHECK-NEXT: [[T4:%.*]] = icmp ult <1 x i32> [[X:%.*]], splat (i32 2147483647)
389 ; CHECK-NEXT: ret <1 x i1> [[T4]]
391 %t1 = icmp ult <1 x i32> %x, <i32 2147483648>
392 %t2 = and <1 x i32> %x, <i32 2147483647>
393 %t3 = icmp ne <1 x i32> %t2, <i32 2147483647>
394 %t4 = and <1 x i1> %t3, %t1
398 ; Vector of 2 reduction
399 define <2 x i1> @icmp_power2_and_icmp_shifted_mask_vector_2147483648_1610612736_2147483647(<2 x i32> %x) {
400 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_2147483648_1610612736_2147483647(
401 ; CHECK-NEXT: [[T4:%.*]] = icmp ult <2 x i32> [[X:%.*]], <i32 1610612736, i32 2147483647>
402 ; CHECK-NEXT: ret <2 x i1> [[T4]]
404 %t1 = icmp ult <2 x i32> %x, <i32 2147483648, i32 2147483648>
405 %t2 = and <2 x i32> %x, <i32 1610612736, i32 2147483647>
406 %t3 = icmp ne <2 x i32> %t2, <i32 1610612736, i32 2147483647>
407 %t4 = and <2 x i1> %t1, %t3
411 define <2 x i1> @icmp_power2_and_icmp_shifted_mask_vector_swapped_2147483648_1610612736_2147483647(<2 x i32> %x) {
412 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_swapped_2147483648_1610612736_2147483647(
413 ; CHECK-NEXT: [[T4:%.*]] = icmp ult <2 x i32> [[X:%.*]], <i32 1610612736, i32 2147483647>
414 ; CHECK-NEXT: ret <2 x i1> [[T4]]
416 %t1 = icmp ult <2 x i32> %x, <i32 2147483648, i32 2147483648>
417 %t2 = and <2 x i32> %x, <i32 1610612736, i32 2147483647>
418 %t3 = icmp ne <2 x i32> %t2, <i32 1610612736, i32 2147483647>
419 %t4 = and <2 x i1> %t3, %t1
423 ; Vector of 2 reduction with splat containing poison
424 define <2 x i1> @icmp_power2_and_icmp_shifted_mask_vector_splat_poison_2147483648_1610612736_2147483647(<2 x i32> %x) {
425 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_splat_poison_2147483648_1610612736_2147483647(
426 ; CHECK-NEXT: [[T4:%.*]] = icmp ult <2 x i32> [[X:%.*]], <i32 1610612736, i32 2147483647>
427 ; CHECK-NEXT: ret <2 x i1> [[T4]]
429 %t1 = icmp ult <2 x i32> %x, <i32 2147483648, i32 poison>
430 %t2 = and <2 x i32> %x, <i32 1610612736, i32 2147483647>
431 %t3 = icmp ne <2 x i32> %t2, <i32 1610612736, i32 2147483647>
432 %t4 = and <2 x i1> %t1, %t3
436 define <2 x i1> @icmp_power2_and_icmp_shifted_mask_vector_swapped_splat_poison_2147483648_1610612736_2147483647(<2 x i32> %x) {
437 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_swapped_splat_poison_2147483648_1610612736_2147483647(
438 ; CHECK-NEXT: [[T4:%.*]] = icmp ult <2 x i32> [[X:%.*]], <i32 1610612736, i32 2147483647>
439 ; CHECK-NEXT: ret <2 x i1> [[T4]]
441 %t1 = icmp ult <2 x i32> %x, <i32 2147483648, i32 poison>
442 %t2 = and <2 x i32> %x, <i32 1610612736, i32 2147483647>
443 %t3 = icmp ne <2 x i32> %t2, <i32 1610612736, i32 2147483647>
444 %t4 = and <2 x i1> %t3, %t1
448 ; Vector of 2 reduction with splat containing undef
449 define <2 x i1> @icmp_power2_and_icmp_shifted_mask_vector_splat_undef_2147483648_1610612736_2147483647(<2 x i32> %x) {
450 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_splat_undef_2147483648_1610612736_2147483647(
451 ; CHECK-NEXT: [[T1:%.*]] = icmp ult <2 x i32> [[X:%.*]], <i32 -2147483648, i32 undef>
452 ; CHECK-NEXT: [[T2:%.*]] = and <2 x i32> [[X]], <i32 1610612736, i32 2147483647>
453 ; CHECK-NEXT: [[T3:%.*]] = icmp ne <2 x i32> [[T2]], <i32 1610612736, i32 2147483647>
454 ; CHECK-NEXT: [[T4:%.*]] = and <2 x i1> [[T1]], [[T3]]
455 ; CHECK-NEXT: ret <2 x i1> [[T4]]
457 %t1 = icmp ult <2 x i32> %x, <i32 2147483648, i32 undef>
458 %t2 = and <2 x i32> %x, <i32 1610612736, i32 2147483647>
459 %t3 = icmp ne <2 x i32> %t2, <i32 1610612736, i32 2147483647>
460 %t4 = and <2 x i1> %t1, %t3
464 define <2 x i1> @icmp_power2_and_icmp_shifted_mask_vector_swapped_splat_undef_2147483648_1610612736_2147483647(<2 x i32> %x) {
465 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_swapped_splat_undef_2147483648_1610612736_2147483647(
466 ; CHECK-NEXT: [[T1:%.*]] = icmp ult <2 x i32> [[X:%.*]], <i32 -2147483648, i32 undef>
467 ; CHECK-NEXT: [[T2:%.*]] = and <2 x i32> [[X]], <i32 1610612736, i32 2147483647>
468 ; CHECK-NEXT: [[T3:%.*]] = icmp ne <2 x i32> [[T2]], <i32 1610612736, i32 2147483647>
469 ; CHECK-NEXT: [[T4:%.*]] = and <2 x i1> [[T3]], [[T1]]
470 ; CHECK-NEXT: ret <2 x i1> [[T4]]
472 %t1 = icmp ult <2 x i32> %x, <i32 2147483648, i32 undef>
473 %t2 = and <2 x i32> %x, <i32 1610612736, i32 2147483647>
474 %t3 = icmp ne <2 x i32> %t2, <i32 1610612736, i32 2147483647>
475 %t4 = and <2 x i1> %t3, %t1
479 ; Vector of 7 reduction
480 define <7 x i1> @icmp_power2_and_icmp_shifted_mask_vector_128_others(<7 x i8> %x) {
481 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_128_others(
482 ; CHECK-NEXT: [[T4:%.*]] = icmp ult <7 x i8> [[X:%.*]], <i8 127, i8 126, i8 124, i8 120, i8 112, i8 96, i8 64>
483 ; CHECK-NEXT: ret <7 x i1> [[T4]]
485 %t1 = icmp ult <7 x i8> %x, <i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128>
486 %t2 = and <7 x i8> %x, <i8 127, i8 126, i8 124, i8 120, i8 112, i8 96, i8 64>
487 %t3 = icmp ne <7 x i8> %t2, <i8 127, i8 126, i8 124, i8 120, i8 112, i8 96, i8 64>
488 %t4 = and <7 x i1> %t1, %t3
492 define <7 x i1> @icmp_power2_and_icmp_shifted_mask_vector_swapped_128_others(<7 x i8> %x) {
493 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_swapped_128_others(
494 ; CHECK-NEXT: [[T4:%.*]] = icmp ult <7 x i8> [[X:%.*]], <i8 127, i8 126, i8 124, i8 120, i8 112, i8 96, i8 64>
495 ; CHECK-NEXT: ret <7 x i1> [[T4]]
497 %t1 = icmp ult <7 x i8> %x, <i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128>
498 %t2 = and <7 x i8> %x, <i8 127, i8 126, i8 124, i8 120, i8 112, i8 96, i8 64>
499 %t3 = icmp ne <7 x i8> %t2, <i8 127, i8 126, i8 124, i8 120, i8 112, i8 96, i8 64>
500 %t4 = and <7 x i1> %t3, %t1
504 ; Vector of 6 reduction
505 define <6 x i1> @icmp_power2_and_icmp_shifted_mask_vector_64_others(<6 x i8> %x) {
506 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_64_others(
507 ; CHECK-NEXT: [[T4:%.*]] = icmp ult <6 x i8> [[X:%.*]], <i8 63, i8 62, i8 60, i8 56, i8 48, i8 32>
508 ; CHECK-NEXT: ret <6 x i1> [[T4]]
510 %t1 = icmp ult <6 x i8> %x, <i8 64, i8 64, i8 64, i8 64, i8 64, i8 64>
511 %t2 = and <6 x i8> %x, <i8 63, i8 62, i8 60, i8 56, i8 48, i8 32>
512 %t3 = icmp ne <6 x i8> %t2, <i8 63, i8 62, i8 60, i8 56, i8 48, i8 32>
513 %t4 = and <6 x i1> %t1, %t3
517 define <6 x i1> @icmp_power2_and_icmp_shifted_mask_vector_swapped_64_others(<6 x i8> %x) {
518 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_swapped_64_others(
519 ; CHECK-NEXT: [[T4:%.*]] = icmp ult <6 x i8> [[X:%.*]], <i8 63, i8 62, i8 60, i8 56, i8 48, i8 32>
520 ; CHECK-NEXT: ret <6 x i1> [[T4]]
522 %t1 = icmp ult <6 x i8> %x, <i8 64, i8 64, i8 64, i8 64, i8 64, i8 64>
523 %t2 = and <6 x i8> %x, <i8 63, i8 62, i8 60, i8 56, i8 48, i8 32>
524 %t3 = icmp ne <6 x i8> %t2, <i8 63, i8 62, i8 60, i8 56, i8 48, i8 32>
525 %t4 = and <6 x i1> %t1, %t3
529 ; Vector of 0 of 1 compatible, no change
530 define <1 x i1> @icmp_power2_and_icmp_shifted_mask_vector_2147483648_2147482647_gap_in_mask_fail(<1 x i32> %x) {
531 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_2147483648_2147482647_gap_in_mask_fail(
532 ; CHECK-NEXT: [[T1:%.*]] = icmp sgt <1 x i32> [[X:%.*]], splat (i32 -1)
533 ; CHECK-NEXT: [[T2:%.*]] = and <1 x i32> [[X]], splat (i32 2147482647)
534 ; CHECK-NEXT: [[T3:%.*]] = icmp ne <1 x i32> [[T2]], splat (i32 2147482647)
535 ; CHECK-NEXT: [[T4:%.*]] = and <1 x i1> [[T1]], [[T3]]
536 ; CHECK-NEXT: ret <1 x i1> [[T4]]
538 %t1 = icmp ult <1 x i32> %x, <i32 2147483648>
539 %t2 = and <1 x i32> %x, <i32 2147482647>
540 %t3 = icmp ne <1 x i32> %t2, <i32 2147482647>
541 %t4 = and <1 x i1> %t1, %t3
545 define <1 x i1> @icmp_power2_and_icmp_shifted_mask_vector_swapped_2147483648_2147482647_gap_in_mask_fail(<1 x i32> %x) {
546 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_swapped_2147483648_2147482647_gap_in_mask_fail(
547 ; CHECK-NEXT: [[T1:%.*]] = icmp sgt <1 x i32> [[X:%.*]], splat (i32 -1)
548 ; CHECK-NEXT: [[T2:%.*]] = and <1 x i32> [[X]], splat (i32 2147482647)
549 ; CHECK-NEXT: [[T3:%.*]] = icmp ne <1 x i32> [[T2]], splat (i32 2147482647)
550 ; CHECK-NEXT: [[T4:%.*]] = and <1 x i1> [[T3]], [[T1]]
551 ; CHECK-NEXT: ret <1 x i1> [[T4]]
553 %t1 = icmp ult <1 x i32> %x, <i32 2147483648>
554 %t2 = and <1 x i32> %x, <i32 2147482647>
555 %t3 = icmp ne <1 x i32> %t2, <i32 2147482647>
556 %t4 = and <1 x i1> %t3, %t1
560 ; Vector 1 of 2 compatible, no change
561 define <2 x i1> @icmp_power2_and_icmp_shifted_mask_vector_2147483648_1073741823_gap_between_masks_fail(<2 x i32> %x) {
562 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_2147483648_1073741823_gap_between_masks_fail(
563 ; CHECK-NEXT: [[T1:%.*]] = icmp sgt <2 x i32> [[X:%.*]], splat (i32 -1)
564 ; CHECK-NEXT: [[T2:%.*]] = and <2 x i32> [[X]], <i32 1610612736, i32 1073741823>
565 ; CHECK-NEXT: [[T3:%.*]] = icmp ne <2 x i32> [[T2]], <i32 1610612736, i32 1073741823>
566 ; CHECK-NEXT: [[T4:%.*]] = and <2 x i1> [[T1]], [[T3]]
567 ; CHECK-NEXT: ret <2 x i1> [[T4]]
569 %t1 = icmp ult <2 x i32> %x, <i32 2147483648, i32 2147483648>
570 %t2 = and <2 x i32> %x, <i32 1610612736, i32 1073741823>
571 %t3 = icmp ne <2 x i32> %t2, <i32 1610612736, i32 1073741823>
572 %t4 = and <2 x i1> %t1, %t3
576 define <2 x i1> @icmp_power2_and_icmp_shifted_mask_vector_swapped_2147483648_1073741823_gap_between_masks_fail(<2 x i32> %x) {
577 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_swapped_2147483648_1073741823_gap_between_masks_fail(
578 ; CHECK-NEXT: [[T1:%.*]] = icmp sgt <2 x i32> [[X:%.*]], splat (i32 -1)
579 ; CHECK-NEXT: [[T2:%.*]] = and <2 x i32> [[X]], <i32 1610612736, i32 1073741823>
580 ; CHECK-NEXT: [[T3:%.*]] = icmp ne <2 x i32> [[T2]], <i32 1610612736, i32 1073741823>
581 ; CHECK-NEXT: [[T4:%.*]] = and <2 x i1> [[T3]], [[T1]]
582 ; CHECK-NEXT: ret <2 x i1> [[T4]]
584 %t1 = icmp ult <2 x i32> %x, <i32 2147483648, i32 2147483648>
585 %t2 = and <2 x i32> %x, <i32 1610612736, i32 1073741823>
586 %t3 = icmp ne <2 x i32> %t2, <i32 1610612736, i32 1073741823>
587 %t4 = and <2 x i1> %t3, %t1
591 ; Vector 1 of 7 compatible, no change
592 define <7 x i1> @icmp_power2_and_icmp_shifted_mask_vector_128_1_of_7_fail(<7 x i8> %x) {
593 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_128_1_of_7_fail(
594 ; CHECK-NEXT: [[T1:%.*]] = icmp sgt <7 x i8> [[X:%.*]], splat (i8 -1)
595 ; CHECK-NEXT: [[T2:%.*]] = and <7 x i8> [[X]], <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32, i8 64>
596 ; CHECK-NEXT: [[T3:%.*]] = icmp ne <7 x i8> [[T2]], <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32, i8 64>
597 ; CHECK-NEXT: [[T4:%.*]] = and <7 x i1> [[T1]], [[T3]]
598 ; CHECK-NEXT: ret <7 x i1> [[T4]]
600 %t1 = icmp ult <7 x i8> %x, <i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128>
601 %t2 = and <7 x i8> %x, <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32, i8 64>
602 %t3 = icmp ne <7 x i8> %t2, <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32, i8 64>
603 %t4 = and <7 x i1> %t1, %t3
607 define <7 x i1> @icmp_power2_and_icmp_shifted_mask_vector_swapped_128_1_of_7_fail(<7 x i8> %x) {
608 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_swapped_128_1_of_7_fail(
609 ; CHECK-NEXT: [[T1:%.*]] = icmp sgt <7 x i8> [[X:%.*]], splat (i8 -1)
610 ; CHECK-NEXT: [[T2:%.*]] = and <7 x i8> [[X]], <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32, i8 64>
611 ; CHECK-NEXT: [[T3:%.*]] = icmp ne <7 x i8> [[T2]], <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32, i8 64>
612 ; CHECK-NEXT: [[T4:%.*]] = and <7 x i1> [[T3]], [[T1]]
613 ; CHECK-NEXT: ret <7 x i1> [[T4]]
615 %t1 = icmp ult <7 x i8> %x, <i8 128, i8 128, i8 128, i8 128, i8 128, i8 128, i8 128>
616 %t2 = and <7 x i8> %x, <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32, i8 64>
617 %t3 = icmp ne <7 x i8> %t2, <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32, i8 64>
618 %t4 = and <7 x i1> %t3, %t1
622 ; Vector 0 of 6 compatible, no change
623 define <6 x i1> @icmp_power2_and_icmp_shifted_mask_vector_128_0_of_6_fail(<6 x i8> %x) {
624 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_128_0_of_6_fail(
625 ; CHECK-NEXT: [[T1:%.*]] = icmp sgt <6 x i8> [[X:%.*]], splat (i8 -1)
626 ; CHECK-NEXT: [[T2:%.*]] = and <6 x i8> [[X]], <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32>
627 ; CHECK-NEXT: [[T3:%.*]] = icmp ne <6 x i8> [[T2]], <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32>
628 ; CHECK-NEXT: [[T4:%.*]] = and <6 x i1> [[T1]], [[T3]]
629 ; CHECK-NEXT: ret <6 x i1> [[T4]]
631 %t1 = icmp ult <6 x i8> %x, <i8 128, i8 128, i8 128, i8 128, i8 128, i8 128>
632 %t2 = and <6 x i8> %x, <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32>
633 %t3 = icmp ne <6 x i8> %t2, <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32>
634 %t4 = and <6 x i1> %t1, %t3
638 define <6 x i1> @icmp_power2_and_icmp_shifted_mask_vector_swapped_128_0_of_6_fail(<6 x i8> %x) {
639 ; CHECK-LABEL: @icmp_power2_and_icmp_shifted_mask_vector_swapped_128_0_of_6_fail(
640 ; CHECK-NEXT: [[T1:%.*]] = icmp sgt <6 x i8> [[X:%.*]], splat (i8 -1)
641 ; CHECK-NEXT: [[T2:%.*]] = and <6 x i8> [[X]], <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32>
642 ; CHECK-NEXT: [[T3:%.*]] = icmp ne <6 x i8> [[T2]], <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32>
643 ; CHECK-NEXT: [[T4:%.*]] = and <6 x i1> [[T3]], [[T1]]
644 ; CHECK-NEXT: ret <6 x i1> [[T4]]
646 %t1 = icmp ult <6 x i8> %x, <i8 128, i8 128, i8 128, i8 128, i8 128, i8 128>
647 %t2 = and <6 x i8> %x, <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32>
648 %t3 = icmp ne <6 x i8> %t2, <i8 125, i8 122, i8 116, i8 104, i8 80, i8 32>
649 %t4 = and <6 x i1> %t3, %t1