[AArch64][NFC] NFC for const vector as Instruction operand (#116790)
[llvm-project.git] / llvm / test / Transforms / InstCombine / icmp-power2-and-icmp-shifted-mask.ll
blobedbaffa6a12b9b18d2ae7c83b32a06de94f9c614
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=instcombine -S -o - %s | FileCheck %s
4 ; Issue #54856
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
15   %t4 = and i1 %t1, %t3
16   ret i1 %t4
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
27   %t4 = and i1 %t3, %t1
28   ret i1 %t4
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
40   %t4 = and i1 %t1, %t3
41   ret i1 %t4
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
52   %t4 = and i1 %t3, %t1
53   ret i1 %t4
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
65   %t4 = and i1 %t1, %t3
66   ret i1 %t4
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
77   %t4 = and i1 %t3, %t1
78   ret i1 %t4
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
90   %t4 = and i1 %t1, %t3
91   ret i1 %t4
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
103   ret i1 %t4
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
113   %t2 = and i32 %x, 7
114   %t3 = icmp ne i32 %t2, 7
115   %t4 = and i1 %t1, %t3
116   ret i1 %t4
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
125   %t2 = and i32 %x, 7
126   %t3 = icmp ne i32 %t2, 7
127   %t4 = and i1 %t3, %t1
128   ret i1 %t4
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
138   %t2 = and i32 %x, 6
139   %t3 = icmp ne i32 %t2, 6
140   %t4 = and i1 %t1, %t3
141   ret i1 %t4
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
150   %t2 = and i32 %x, 6
151   %t3 = icmp ne i32 %t2, 6
152   %t4 = and i1 %t3, %t1
153   ret i1 %t4
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
166   %t2 = and i32 %x, 5
167   %t3 = icmp ne i32 %t2, 5
168   %t4 = and i1 %t1, %t3
169   ret i1 %t4
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
181   %t2 = and i32 %x, 5
182   %t3 = icmp ne i32 %t2, 5
183   %t4 = and i1 %t3, %t1
184   ret i1 %t4
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
197   %t2 = and i32 %x, 3
198   %t3 = icmp ne i32 %t2, 3
199   %t4 = and i1 %t1, %t3
200   ret i1 %t4
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
212   %t2 = and i32 %x, 3
213   %t3 = icmp ne i32 %t2, 3
214   %t4 = and i1 %t3, %t1
215   ret i1 %t4
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
231   ret i1 %t4
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
246   ret i1 %t4
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
262   ret i1 %t4
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
277   ret i1 %t4
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
290   %t2 = and i32 %x, 56
291   %t3 = icmp ne i32 %t2, 56
292   %t4 = and i1 %t1, %t3
293   ret i1 %t4
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
305   %t2 = and i32 %x, 56
306   %t3 = icmp ne i32 %t2, 56
307   %t4 = and i1 %t3, %t1
308   ret i1 %t4
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
321   %t2 = and i32 %x, 24
322   %t3 = icmp ne i32 %t2, 24
323   %t4 = and i1 %t1, %t3
324   ret i1 %t4
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
336   %t2 = and i32 %x, 24
337   %t3 = icmp ne i32 %t2, 24
338   %t4 = and i1 %t3, %t1
339   ret i1 %t4
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
352   %t2 = and i32 %x, 12
353   %t3 = icmp ne i32 %t2, 12
354   %t4 = and i1 %t1, %t3
355   ret i1 %t4
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
367   %t2 = and i32 %x, 12
368   %t3 = icmp ne i32 %t2, 12
369   %t4 = and i1 %t3, %t1
370   ret i1 %t4
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
383   ret <1 x i1> %t4
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
395   ret <1 x i1> %t4
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
408   ret <2 x i1> %t4
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
420   ret <2 x i1> %t4
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
433   ret <2 x i1> %t4
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
445   ret <2 x i1> %t4
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
461   ret <2 x i1> %t4
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
476   ret <2 x i1> %t4
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
489   ret <7 x i1> %t4
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
501   ret <7 x i1> %t4
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
514   ret <6 x i1> %t4
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
526   ret <6 x i1> %t4
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
542   ret <1 x i1> %t4
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
557   ret <1 x i1> %t4
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
573   ret <2 x i1> %t4
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
588   ret <2 x i1> %t4
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
604   ret <7 x i1> %t4
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
619   ret <7 x i1> %t4
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
635   ret <6 x i1> %t4
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
650   ret <6 x i1> %t4