Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / X86 / fold-vector-sext-zext.ll
blob3f8bd24c380492e70f3c34f788ba34a6778e897a
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -mattr=+avx | FileCheck %s --check-prefix=X32
3 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx | FileCheck %s --check-prefix=X64
5 ; Verify that the backend correctly folds a sign/zero extend of a vector where
6 ; elements are all constant values or UNDEFs.
7 ; The backend should be able to optimize all the test functions below into
8 ; simple loads from constant pool of the result. That is because the resulting
9 ; vector should be known at static time.
11 define <4 x i16> @test_sext_4i8_4i16() {
12 ; X32-LABEL: test_sext_4i8_4i16:
13 ; X32:       # %bb.0:
14 ; X32-NEXT:    vmovddup {{.*#+}} xmm0 = [0,65535,2,65533,0,65535,2,65533]
15 ; X32-NEXT:    # xmm0 = mem[0,0]
16 ; X32-NEXT:    retl
18 ; X64-LABEL: test_sext_4i8_4i16:
19 ; X64:       # %bb.0:
20 ; X64-NEXT:    vmovddup {{.*#+}} xmm0 = [0,65535,2,65533,0,65535,2,65533]
21 ; X64-NEXT:    # xmm0 = mem[0,0]
22 ; X64-NEXT:    retq
23   %1 = insertelement <4 x i8> undef, i8 0, i32 0
24   %2 = insertelement <4 x i8> %1, i8 -1, i32 1
25   %3 = insertelement <4 x i8> %2, i8 2, i32 2
26   %4 = insertelement <4 x i8> %3, i8 -3, i32 3
27   %5 = sext <4 x i8> %4 to <4 x i16>
28   ret <4 x i16> %5
31 define <4 x i16> @test_sext_4i8_4i16_undef() {
32 ; X32-LABEL: test_sext_4i8_4i16_undef:
33 ; X32:       # %bb.0:
34 ; X32-NEXT:    vmovddup {{.*#+}} xmm0 = [0,65535,0,65533,0,65535,0,65533]
35 ; X32-NEXT:    # xmm0 = mem[0,0]
36 ; X32-NEXT:    retl
38 ; X64-LABEL: test_sext_4i8_4i16_undef:
39 ; X64:       # %bb.0:
40 ; X64-NEXT:    vmovddup {{.*#+}} xmm0 = [0,65535,0,65533,0,65535,0,65533]
41 ; X64-NEXT:    # xmm0 = mem[0,0]
42 ; X64-NEXT:    retq
43   %1 = insertelement <4 x i8> undef, i8 undef, i32 0
44   %2 = insertelement <4 x i8> %1, i8 -1, i32 1
45   %3 = insertelement <4 x i8> %2, i8 undef, i32 2
46   %4 = insertelement <4 x i8> %3, i8 -3, i32 3
47   %5 = sext <4 x i8> %4 to <4 x i16>
48   ret <4 x i16> %5
51 define <4 x i32> @test_sext_4i8_4i32() {
52 ; X32-LABEL: test_sext_4i8_4i32:
53 ; X32:       # %bb.0:
54 ; X32-NEXT:    vmovaps {{.*#+}} xmm0 = [0,4294967295,2,4294967293]
55 ; X32-NEXT:    retl
57 ; X64-LABEL: test_sext_4i8_4i32:
58 ; X64:       # %bb.0:
59 ; X64-NEXT:    vmovaps {{.*#+}} xmm0 = [0,4294967295,2,4294967293]
60 ; X64-NEXT:    retq
61   %1 = insertelement <4 x i8> undef, i8 0, i32 0
62   %2 = insertelement <4 x i8> %1, i8 -1, i32 1
63   %3 = insertelement <4 x i8> %2, i8 2, i32 2
64   %4 = insertelement <4 x i8> %3, i8 -3, i32 3
65   %5 = sext <4 x i8> %4 to <4 x i32>
66   ret <4 x i32> %5
69 define <4 x i32> @test_sext_4i8_4i32_undef() {
70 ; X32-LABEL: test_sext_4i8_4i32_undef:
71 ; X32:       # %bb.0:
72 ; X32-NEXT:    vmovaps {{.*#+}} xmm0 = [0,4294967295,0,4294967293]
73 ; X32-NEXT:    retl
75 ; X64-LABEL: test_sext_4i8_4i32_undef:
76 ; X64:       # %bb.0:
77 ; X64-NEXT:    vmovaps {{.*#+}} xmm0 = [0,4294967295,0,4294967293]
78 ; X64-NEXT:    retq
79   %1 = insertelement <4 x i8> undef, i8 undef, i32 0
80   %2 = insertelement <4 x i8> %1, i8 -1, i32 1
81   %3 = insertelement <4 x i8> %2, i8 undef, i32 2
82   %4 = insertelement <4 x i8> %3, i8 -3, i32 3
83   %5 = sext <4 x i8> %4 to <4 x i32>
84   ret <4 x i32> %5
87 define <4 x i64> @test_sext_4i8_4i64() {
88 ; X32-LABEL: test_sext_4i8_4i64:
89 ; X32:       # %bb.0:
90 ; X32-NEXT:    vmovaps {{.*#+}} ymm0 = [0,0,4294967295,4294967295,2,0,4294967293,4294967295]
91 ; X32-NEXT:    retl
93 ; X64-LABEL: test_sext_4i8_4i64:
94 ; X64:       # %bb.0:
95 ; X64-NEXT:    vmovaps {{.*#+}} ymm0 = [0,18446744073709551615,2,18446744073709551613]
96 ; X64-NEXT:    retq
97   %1 = insertelement <4 x i8> undef, i8 0, i32 0
98   %2 = insertelement <4 x i8> %1, i8 -1, i32 1
99   %3 = insertelement <4 x i8> %2, i8 2, i32 2
100   %4 = insertelement <4 x i8> %3, i8 -3, i32 3
101   %5 = sext <4 x i8> %4 to <4 x i64>
102   ret <4 x i64> %5
105 define <4 x i64> @test_sext_4i8_4i64_undef() {
106 ; X32-LABEL: test_sext_4i8_4i64_undef:
107 ; X32:       # %bb.0:
108 ; X32-NEXT:    vmovaps {{.*#+}} ymm0 = [0,0,4294967295,4294967295,0,0,4294967293,4294967295]
109 ; X32-NEXT:    retl
111 ; X64-LABEL: test_sext_4i8_4i64_undef:
112 ; X64:       # %bb.0:
113 ; X64-NEXT:    vmovaps {{.*#+}} ymm0 = [0,18446744073709551615,0,18446744073709551613]
114 ; X64-NEXT:    retq
115   %1 = insertelement <4 x i8> undef, i8 undef, i32 0
116   %2 = insertelement <4 x i8> %1, i8 -1, i32 1
117   %3 = insertelement <4 x i8> %2, i8 undef, i32 2
118   %4 = insertelement <4 x i8> %3, i8 -3, i32 3
119   %5 = sext <4 x i8> %4 to <4 x i64>
120   ret <4 x i64> %5
123 define <8 x i16> @test_sext_8i8_8i16() {
124 ; X32-LABEL: test_sext_8i8_8i16:
125 ; X32:       # %bb.0:
126 ; X32-NEXT:    vmovaps {{.*#+}} xmm0 = [0,65535,2,65533,4,65531,6,65529]
127 ; X32-NEXT:    retl
129 ; X64-LABEL: test_sext_8i8_8i16:
130 ; X64:       # %bb.0:
131 ; X64-NEXT:    vmovaps {{.*#+}} xmm0 = [0,65535,2,65533,4,65531,6,65529]
132 ; X64-NEXT:    retq
133   %1 = insertelement <8 x i8> undef, i8 0, i32 0
134   %2 = insertelement <8 x i8> %1, i8 -1, i32 1
135   %3 = insertelement <8 x i8> %2, i8 2, i32 2
136   %4 = insertelement <8 x i8> %3, i8 -3, i32 3
137   %5 = insertelement <8 x i8> %4, i8 4, i32 4
138   %6 = insertelement <8 x i8> %5, i8 -5, i32 5
139   %7 = insertelement <8 x i8> %6, i8 6, i32 6
140   %8 = insertelement <8 x i8> %7, i8 -7, i32 7
141   %9 = sext <8 x i8> %8 to <8 x i16>
142   ret <8 x i16> %9
145 define <8 x i32> @test_sext_8i8_8i32() {
146 ; X32-LABEL: test_sext_8i8_8i32:
147 ; X32:       # %bb.0:
148 ; X32-NEXT:    vmovaps {{.*#+}} ymm0 = [0,4294967295,2,4294967293,4,4294967291,6,4294967289]
149 ; X32-NEXT:    retl
151 ; X64-LABEL: test_sext_8i8_8i32:
152 ; X64:       # %bb.0:
153 ; X64-NEXT:    vmovaps {{.*#+}} ymm0 = [0,4294967295,2,4294967293,4,4294967291,6,4294967289]
154 ; X64-NEXT:    retq
155   %1 = insertelement <8 x i8> undef, i8 0, i32 0
156   %2 = insertelement <8 x i8> %1, i8 -1, i32 1
157   %3 = insertelement <8 x i8> %2, i8 2, i32 2
158   %4 = insertelement <8 x i8> %3, i8 -3, i32 3
159   %5 = insertelement <8 x i8> %4, i8 4, i32 4
160   %6 = insertelement <8 x i8> %5, i8 -5, i32 5
161   %7 = insertelement <8 x i8> %6, i8 6, i32 6
162   %8 = insertelement <8 x i8> %7, i8 -7, i32 7
163   %9 = sext <8 x i8> %8 to <8 x i32>
164   ret <8 x i32> %9
167 define <8 x i16> @test_sext_8i8_8i16_undef() {
168 ; X32-LABEL: test_sext_8i8_8i16_undef:
169 ; X32:       # %bb.0:
170 ; X32-NEXT:    vmovaps {{.*#+}} xmm0 = [0,65535,0,65533,0,65531,0,65529]
171 ; X32-NEXT:    retl
173 ; X64-LABEL: test_sext_8i8_8i16_undef:
174 ; X64:       # %bb.0:
175 ; X64-NEXT:    vmovaps {{.*#+}} xmm0 = [0,65535,0,65533,0,65531,0,65529]
176 ; X64-NEXT:    retq
177   %1 = insertelement <8 x i8> undef, i8 undef, i32 0
178   %2 = insertelement <8 x i8> %1, i8 -1, i32 1
179   %3 = insertelement <8 x i8> %2, i8 undef, i32 2
180   %4 = insertelement <8 x i8> %3, i8 -3, i32 3
181   %5 = insertelement <8 x i8> %4, i8 undef, i32 4
182   %6 = insertelement <8 x i8> %5, i8 -5, i32 5
183   %7 = insertelement <8 x i8> %6, i8 undef, i32 6
184   %8 = insertelement <8 x i8> %7, i8 -7, i32 7
185   %9 = sext <8 x i8> %8 to <8 x i16>
186   ret <8 x i16> %9
189 define <8 x i32> @test_sext_8i8_8i32_undef() {
190 ; X32-LABEL: test_sext_8i8_8i32_undef:
191 ; X32:       # %bb.0:
192 ; X32-NEXT:    vmovaps {{.*#+}} ymm0 = [0,0,2,0,4,0,6,0]
193 ; X32-NEXT:    retl
195 ; X64-LABEL: test_sext_8i8_8i32_undef:
196 ; X64:       # %bb.0:
197 ; X64-NEXT:    vmovaps {{.*#+}} ymm0 = [0,0,2,0,4,0,6,0]
198 ; X64-NEXT:    retq
199   %1 = insertelement <8 x i8> undef, i8 0, i32 0
200   %2 = insertelement <8 x i8> %1, i8 undef, i32 1
201   %3 = insertelement <8 x i8> %2, i8 2, i32 2
202   %4 = insertelement <8 x i8> %3, i8 undef, i32 3
203   %5 = insertelement <8 x i8> %4, i8 4, i32 4
204   %6 = insertelement <8 x i8> %5, i8 undef, i32 5
205   %7 = insertelement <8 x i8> %6, i8 6, i32 6
206   %8 = insertelement <8 x i8> %7, i8 undef, i32 7
207   %9 = sext <8 x i8> %8 to <8 x i32>
208   ret <8 x i32> %9
211 define <4 x i16> @test_zext_4i8_4i16() {
212 ; X32-LABEL: test_zext_4i8_4i16:
213 ; X32:       # %bb.0:
214 ; X32-NEXT:    vmovddup {{.*#+}} xmm0 = [0,255,2,253,0,255,2,253]
215 ; X32-NEXT:    # xmm0 = mem[0,0]
216 ; X32-NEXT:    retl
218 ; X64-LABEL: test_zext_4i8_4i16:
219 ; X64:       # %bb.0:
220 ; X64-NEXT:    vmovddup {{.*#+}} xmm0 = [0,255,2,253,0,255,2,253]
221 ; X64-NEXT:    # xmm0 = mem[0,0]
222 ; X64-NEXT:    retq
223   %1 = insertelement <4 x i8> undef, i8 0, i32 0
224   %2 = insertelement <4 x i8> %1, i8 -1, i32 1
225   %3 = insertelement <4 x i8> %2, i8 2, i32 2
226   %4 = insertelement <4 x i8> %3, i8 -3, i32 3
227   %5 = zext <4 x i8> %4 to <4 x i16>
228   ret <4 x i16> %5
231 define <4 x i32> @test_zext_4i8_4i32() {
232 ; X32-LABEL: test_zext_4i8_4i32:
233 ; X32:       # %bb.0:
234 ; X32-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,2,253]
235 ; X32-NEXT:    retl
237 ; X64-LABEL: test_zext_4i8_4i32:
238 ; X64:       # %bb.0:
239 ; X64-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,2,253]
240 ; X64-NEXT:    retq
241   %1 = insertelement <4 x i8> undef, i8 0, i32 0
242   %2 = insertelement <4 x i8> %1, i8 -1, i32 1
243   %3 = insertelement <4 x i8> %2, i8 2, i32 2
244   %4 = insertelement <4 x i8> %3, i8 -3, i32 3
245   %5 = zext <4 x i8> %4 to <4 x i32>
246   ret <4 x i32> %5
249 define <4 x i64> @test_zext_4i8_4i64() {
250 ; X32-LABEL: test_zext_4i8_4i64:
251 ; X32:       # %bb.0:
252 ; X32-NEXT:    vmovaps {{.*#+}} ymm0 = [0,0,255,0,2,0,253,0]
253 ; X32-NEXT:    retl
255 ; X64-LABEL: test_zext_4i8_4i64:
256 ; X64:       # %bb.0:
257 ; X64-NEXT:    vmovaps {{.*#+}} ymm0 = [0,255,2,253]
258 ; X64-NEXT:    retq
259   %1 = insertelement <4 x i8> undef, i8 0, i32 0
260   %2 = insertelement <4 x i8> %1, i8 -1, i32 1
261   %3 = insertelement <4 x i8> %2, i8 2, i32 2
262   %4 = insertelement <4 x i8> %3, i8 -3, i32 3
263   %5 = zext <4 x i8> %4 to <4 x i64>
264   ret <4 x i64> %5
267 define <4 x i16> @test_zext_4i8_4i16_undef() {
268 ; X32-LABEL: test_zext_4i8_4i16_undef:
269 ; X32:       # %bb.0:
270 ; X32-NEXT:    vmovddup {{.*#+}} xmm0 = [0,255,0,253,0,255,0,253]
271 ; X32-NEXT:    # xmm0 = mem[0,0]
272 ; X32-NEXT:    retl
274 ; X64-LABEL: test_zext_4i8_4i16_undef:
275 ; X64:       # %bb.0:
276 ; X64-NEXT:    vmovddup {{.*#+}} xmm0 = [0,255,0,253,0,255,0,253]
277 ; X64-NEXT:    # xmm0 = mem[0,0]
278 ; X64-NEXT:    retq
279   %1 = insertelement <4 x i8> undef, i8 undef, i32 0
280   %2 = insertelement <4 x i8> %1, i8 -1, i32 1
281   %3 = insertelement <4 x i8> %2, i8 undef, i32 2
282   %4 = insertelement <4 x i8> %3, i8 -3, i32 3
283   %5 = zext <4 x i8> %4 to <4 x i16>
284   ret <4 x i16> %5
287 define <4 x i32> @test_zext_4i8_4i32_undef() {
288 ; X32-LABEL: test_zext_4i8_4i32_undef:
289 ; X32:       # %bb.0:
290 ; X32-NEXT:    vmovaps {{.*#+}} xmm0 = [0,0,2,0]
291 ; X32-NEXT:    retl
293 ; X64-LABEL: test_zext_4i8_4i32_undef:
294 ; X64:       # %bb.0:
295 ; X64-NEXT:    vmovaps {{.*#+}} xmm0 = [0,0,2,0]
296 ; X64-NEXT:    retq
297   %1 = insertelement <4 x i8> undef, i8 0, i32 0
298   %2 = insertelement <4 x i8> %1, i8 undef, i32 1
299   %3 = insertelement <4 x i8> %2, i8 2, i32 2
300   %4 = insertelement <4 x i8> %3, i8 undef, i32 3
301   %5 = zext <4 x i8> %4 to <4 x i32>
302   ret <4 x i32> %5
305 define <4 x i64> @test_zext_4i8_4i64_undef() {
306 ; X32-LABEL: test_zext_4i8_4i64_undef:
307 ; X32:       # %bb.0:
308 ; X32-NEXT:    vmovaps {{.*#+}} ymm0 = [0,0,255,0,2,0,0,0]
309 ; X32-NEXT:    retl
311 ; X64-LABEL: test_zext_4i8_4i64_undef:
312 ; X64:       # %bb.0:
313 ; X64-NEXT:    vmovaps {{.*#+}} ymm0 = [0,255,2,0]
314 ; X64-NEXT:    retq
315   %1 = insertelement <4 x i8> undef, i8 undef, i32 0
316   %2 = insertelement <4 x i8> %1, i8 -1, i32 1
317   %3 = insertelement <4 x i8> %2, i8 2, i32 2
318   %4 = insertelement <4 x i8> %3, i8 undef, i32 3
319   %5 = zext <4 x i8> %4 to <4 x i64>
320   ret <4 x i64> %5
323 define <8 x i16> @test_zext_8i8_8i16() {
324 ; X32-LABEL: test_zext_8i8_8i16:
325 ; X32:       # %bb.0:
326 ; X32-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,2,253,4,251,6,249]
327 ; X32-NEXT:    retl
329 ; X64-LABEL: test_zext_8i8_8i16:
330 ; X64:       # %bb.0:
331 ; X64-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,2,253,4,251,6,249]
332 ; X64-NEXT:    retq
333   %1 = insertelement <8 x i8> undef, i8 0, i32 0
334   %2 = insertelement <8 x i8> %1, i8 -1, i32 1
335   %3 = insertelement <8 x i8> %2, i8 2, i32 2
336   %4 = insertelement <8 x i8> %3, i8 -3, i32 3
337   %5 = insertelement <8 x i8> %4, i8 4, i32 4
338   %6 = insertelement <8 x i8> %5, i8 -5, i32 5
339   %7 = insertelement <8 x i8> %6, i8 6, i32 6
340   %8 = insertelement <8 x i8> %7, i8 -7, i32 7
341   %9 = zext <8 x i8> %8 to <8 x i16>
342   ret <8 x i16> %9
345 define <8 x i32> @test_zext_8i8_8i32() {
346 ; X32-LABEL: test_zext_8i8_8i32:
347 ; X32:       # %bb.0:
348 ; X32-NEXT:    vmovaps {{.*#+}} ymm0 = [0,255,2,253,4,251,6,249]
349 ; X32-NEXT:    retl
351 ; X64-LABEL: test_zext_8i8_8i32:
352 ; X64:       # %bb.0:
353 ; X64-NEXT:    vmovaps {{.*#+}} ymm0 = [0,255,2,253,4,251,6,249]
354 ; X64-NEXT:    retq
355   %1 = insertelement <8 x i8> undef, i8 0, i32 0
356   %2 = insertelement <8 x i8> %1, i8 -1, i32 1
357   %3 = insertelement <8 x i8> %2, i8 2, i32 2
358   %4 = insertelement <8 x i8> %3, i8 -3, i32 3
359   %5 = insertelement <8 x i8> %4, i8 4, i32 4
360   %6 = insertelement <8 x i8> %5, i8 -5, i32 5
361   %7 = insertelement <8 x i8> %6, i8 6, i32 6
362   %8 = insertelement <8 x i8> %7, i8 -7, i32 7
363   %9 = zext <8 x i8> %8 to <8 x i32>
364   ret <8 x i32> %9
367 define <8 x i16> @test_zext_8i8_8i16_undef() {
368 ; X32-LABEL: test_zext_8i8_8i16_undef:
369 ; X32:       # %bb.0:
370 ; X32-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,0,253,0,251,0,249]
371 ; X32-NEXT:    retl
373 ; X64-LABEL: test_zext_8i8_8i16_undef:
374 ; X64:       # %bb.0:
375 ; X64-NEXT:    vmovaps {{.*#+}} xmm0 = [0,255,0,253,0,251,0,249]
376 ; X64-NEXT:    retq
377   %1 = insertelement <8 x i8> undef, i8 undef, i32 0
378   %2 = insertelement <8 x i8> %1, i8 -1, i32 1
379   %3 = insertelement <8 x i8> %2, i8 undef, i32 2
380   %4 = insertelement <8 x i8> %3, i8 -3, i32 3
381   %5 = insertelement <8 x i8> %4, i8 undef, i32 4
382   %6 = insertelement <8 x i8> %5, i8 -5, i32 5
383   %7 = insertelement <8 x i8> %6, i8 undef, i32 6
384   %8 = insertelement <8 x i8> %7, i8 -7, i32 7
385   %9 = zext <8 x i8> %8 to <8 x i16>
386   ret <8 x i16> %9
389 define <8 x i32> @test_zext_8i8_8i32_undef() {
390 ; X32-LABEL: test_zext_8i8_8i32_undef:
391 ; X32:       # %bb.0:
392 ; X32-NEXT:    vmovaps {{.*#+}} ymm0 = [0,0,2,253,4,0,6,0]
393 ; X32-NEXT:    retl
395 ; X64-LABEL: test_zext_8i8_8i32_undef:
396 ; X64:       # %bb.0:
397 ; X64-NEXT:    vmovaps {{.*#+}} ymm0 = [0,0,2,253,4,0,6,0]
398 ; X64-NEXT:    retq
399   %1 = insertelement <8 x i8> undef, i8 0, i32 0
400   %2 = insertelement <8 x i8> %1, i8 undef, i32 1
401   %3 = insertelement <8 x i8> %2, i8 2, i32 2
402   %4 = insertelement <8 x i8> %3, i8 -3, i32 3
403   %5 = insertelement <8 x i8> %4, i8 4, i32 4
404   %6 = insertelement <8 x i8> %5, i8 undef, i32 5
405   %7 = insertelement <8 x i8> %6, i8 6, i32 6
406   %8 = insertelement <8 x i8> %7, i8 undef, i32 7
407   %9 = zext <8 x i8> %8 to <8 x i32>
408   ret <8 x i32> %9