[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / GlobalISel / legalize-add-v512.mir
blob2aece9512686af9eca2c786adc5cbfc1235e4c09
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx               -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX1
3 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f           -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX512F
4 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f,+avx512bw -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX512BW
6 --- |
7   define void @test_add_v64i8() {
8     %ret = add <64 x i8> undef, undef
9     ret void
10   }
12   define void @test_add_v32i16() {
13     %ret = add <32 x i16> undef, undef
14     ret void
15   }
17   define void @test_add_v16i32() {
18     %ret = add <16 x i32> undef, undef
19     ret void
20   }
22   define void @test_add_v8i64() {
23     %ret = add <8 x i64> undef, undef
24     ret void
25   }
27   define <64 x i8> @test_add_v64i8_2(<64 x i8> %arg1, <64 x i8> %arg2) #0 {
28     %ret = add <64 x i8> %arg1, %arg2
29     ret <64 x i8> %ret
30   }
31 ...
32 ---
33 name:            test_add_v64i8
34 alignment:       16
35 legalized:       false
36 regBankSelected: false
37 registers:
38   - { id: 0, class: _ }
39   - { id: 1, class: _ }
40   - { id: 2, class: _ }
41 body:             |
42   bb.1 (%ir-block.0):
43     liveins: $zmm0, $zmm1
44     ; AVX1-LABEL: name: test_add_v64i8
45     ; AVX1: [[DEF:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF
46     ; AVX1: [[DEF1:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF
47     ; AVX1: [[UV:%[0-9]+]]:_(<16 x s8>), [[UV1:%[0-9]+]]:_(<16 x s8>), [[UV2:%[0-9]+]]:_(<16 x s8>), [[UV3:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[DEF]](<64 x s8>)
48     ; AVX1: [[UV4:%[0-9]+]]:_(<16 x s8>), [[UV5:%[0-9]+]]:_(<16 x s8>), [[UV6:%[0-9]+]]:_(<16 x s8>), [[UV7:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[DEF1]](<64 x s8>)
49     ; AVX1: [[ADD:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV]], [[UV4]]
50     ; AVX1: [[ADD1:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV1]], [[UV5]]
51     ; AVX1: [[ADD2:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV2]], [[UV6]]
52     ; AVX1: [[ADD3:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV3]], [[UV7]]
53     ; AVX1: [[CONCAT_VECTORS:%[0-9]+]]:_(<64 x s8>) = G_CONCAT_VECTORS [[ADD]](<16 x s8>), [[ADD1]](<16 x s8>), [[ADD2]](<16 x s8>), [[ADD3]](<16 x s8>)
54     ; AVX1: $zmm0 = COPY [[CONCAT_VECTORS]](<64 x s8>)
55     ; AVX1: RET 0
56     ; AVX512F-LABEL: name: test_add_v64i8
57     ; AVX512F: [[DEF:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF
58     ; AVX512F: [[DEF1:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF
59     ; AVX512F: [[UV:%[0-9]+]]:_(<32 x s8>), [[UV1:%[0-9]+]]:_(<32 x s8>) = G_UNMERGE_VALUES [[DEF]](<64 x s8>)
60     ; AVX512F: [[UV2:%[0-9]+]]:_(<32 x s8>), [[UV3:%[0-9]+]]:_(<32 x s8>) = G_UNMERGE_VALUES [[DEF1]](<64 x s8>)
61     ; AVX512F: [[ADD:%[0-9]+]]:_(<32 x s8>) = G_ADD [[UV]], [[UV2]]
62     ; AVX512F: [[ADD1:%[0-9]+]]:_(<32 x s8>) = G_ADD [[UV1]], [[UV3]]
63     ; AVX512F: [[CONCAT_VECTORS:%[0-9]+]]:_(<64 x s8>) = G_CONCAT_VECTORS [[ADD]](<32 x s8>), [[ADD1]](<32 x s8>)
64     ; AVX512F: $zmm0 = COPY [[CONCAT_VECTORS]](<64 x s8>)
65     ; AVX512F: RET 0
66     ; AVX512BW-LABEL: name: test_add_v64i8
67     ; AVX512BW: [[DEF:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF
68     ; AVX512BW: [[DEF1:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF
69     ; AVX512BW: [[ADD:%[0-9]+]]:_(<64 x s8>) = G_ADD [[DEF]], [[DEF1]]
70     ; AVX512BW: $zmm0 = COPY [[ADD]](<64 x s8>)
71     ; AVX512BW: RET 0
72     %0(<64 x s8>) = IMPLICIT_DEF
73     %1(<64 x s8>) = IMPLICIT_DEF
74     %2(<64 x s8>) = G_ADD %0, %1
75     $zmm0 = COPY %2
76     RET 0
78 ...
79 ---
80 name:            test_add_v32i16
81 alignment:       16
82 legalized:       false
83 regBankSelected: false
84 registers:
85   - { id: 0, class: _ }
86   - { id: 1, class: _ }
87   - { id: 2, class: _ }
88 body:             |
89   bb.1 (%ir-block.0):
90     liveins: $zmm0, $zmm1
91     ; AVX1-LABEL: name: test_add_v32i16
92     ; AVX1: [[DEF:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF
93     ; AVX1: [[DEF1:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF
94     ; AVX1: [[UV:%[0-9]+]]:_(<8 x s16>), [[UV1:%[0-9]+]]:_(<8 x s16>), [[UV2:%[0-9]+]]:_(<8 x s16>), [[UV3:%[0-9]+]]:_(<8 x s16>) = G_UNMERGE_VALUES [[DEF]](<32 x s16>)
95     ; AVX1: [[UV4:%[0-9]+]]:_(<8 x s16>), [[UV5:%[0-9]+]]:_(<8 x s16>), [[UV6:%[0-9]+]]:_(<8 x s16>), [[UV7:%[0-9]+]]:_(<8 x s16>) = G_UNMERGE_VALUES [[DEF1]](<32 x s16>)
96     ; AVX1: [[ADD:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV]], [[UV4]]
97     ; AVX1: [[ADD1:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV1]], [[UV5]]
98     ; AVX1: [[ADD2:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV2]], [[UV6]]
99     ; AVX1: [[ADD3:%[0-9]+]]:_(<8 x s16>) = G_ADD [[UV3]], [[UV7]]
100     ; AVX1: [[CONCAT_VECTORS:%[0-9]+]]:_(<32 x s16>) = G_CONCAT_VECTORS [[ADD]](<8 x s16>), [[ADD1]](<8 x s16>), [[ADD2]](<8 x s16>), [[ADD3]](<8 x s16>)
101     ; AVX1: $zmm0 = COPY [[CONCAT_VECTORS]](<32 x s16>)
102     ; AVX1: RET 0
103     ; AVX512F-LABEL: name: test_add_v32i16
104     ; AVX512F: [[DEF:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF
105     ; AVX512F: [[DEF1:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF
106     ; AVX512F: [[UV:%[0-9]+]]:_(<16 x s16>), [[UV1:%[0-9]+]]:_(<16 x s16>) = G_UNMERGE_VALUES [[DEF]](<32 x s16>)
107     ; AVX512F: [[UV2:%[0-9]+]]:_(<16 x s16>), [[UV3:%[0-9]+]]:_(<16 x s16>) = G_UNMERGE_VALUES [[DEF1]](<32 x s16>)
108     ; AVX512F: [[ADD:%[0-9]+]]:_(<16 x s16>) = G_ADD [[UV]], [[UV2]]
109     ; AVX512F: [[ADD1:%[0-9]+]]:_(<16 x s16>) = G_ADD [[UV1]], [[UV3]]
110     ; AVX512F: [[CONCAT_VECTORS:%[0-9]+]]:_(<32 x s16>) = G_CONCAT_VECTORS [[ADD]](<16 x s16>), [[ADD1]](<16 x s16>)
111     ; AVX512F: $zmm0 = COPY [[CONCAT_VECTORS]](<32 x s16>)
112     ; AVX512F: RET 0
113     ; AVX512BW-LABEL: name: test_add_v32i16
114     ; AVX512BW: [[DEF:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF
115     ; AVX512BW: [[DEF1:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF
116     ; AVX512BW: [[ADD:%[0-9]+]]:_(<32 x s16>) = G_ADD [[DEF]], [[DEF1]]
117     ; AVX512BW: $zmm0 = COPY [[ADD]](<32 x s16>)
118     ; AVX512BW: RET 0
119     %0(<32 x s16>) = IMPLICIT_DEF
120     %1(<32 x s16>) = IMPLICIT_DEF
121     %2(<32 x s16>) = G_ADD %0, %1
122     $zmm0 = COPY %2
123     RET 0
127 name:            test_add_v16i32
128 alignment:       16
129 legalized:       false
130 regBankSelected: false
131 registers:
132   - { id: 0, class: _ }
133   - { id: 1, class: _ }
134   - { id: 2, class: _ }
135 body:             |
136   bb.1 (%ir-block.0):
137     liveins: $zmm0, $zmm1
138     ; AVX1-LABEL: name: test_add_v16i32
139     ; AVX1: [[DEF:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF
140     ; AVX1: [[DEF1:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF
141     ; AVX1: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>), [[UV2:%[0-9]+]]:_(<4 x s32>), [[UV3:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[DEF]](<16 x s32>)
142     ; AVX1: [[UV4:%[0-9]+]]:_(<4 x s32>), [[UV5:%[0-9]+]]:_(<4 x s32>), [[UV6:%[0-9]+]]:_(<4 x s32>), [[UV7:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[DEF1]](<16 x s32>)
143     ; AVX1: [[ADD:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV]], [[UV4]]
144     ; AVX1: [[ADD1:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV1]], [[UV5]]
145     ; AVX1: [[ADD2:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV2]], [[UV6]]
146     ; AVX1: [[ADD3:%[0-9]+]]:_(<4 x s32>) = G_ADD [[UV3]], [[UV7]]
147     ; AVX1: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[ADD]](<4 x s32>), [[ADD1]](<4 x s32>), [[ADD2]](<4 x s32>), [[ADD3]](<4 x s32>)
148     ; AVX1: $zmm0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
149     ; AVX1: RET 0
150     ; AVX512F-LABEL: name: test_add_v16i32
151     ; AVX512F: [[DEF:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF
152     ; AVX512F: [[DEF1:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF
153     ; AVX512F: [[ADD:%[0-9]+]]:_(<16 x s32>) = G_ADD [[DEF]], [[DEF1]]
154     ; AVX512F: $zmm0 = COPY [[ADD]](<16 x s32>)
155     ; AVX512F: RET 0
156     ; AVX512BW-LABEL: name: test_add_v16i32
157     ; AVX512BW: [[DEF:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF
158     ; AVX512BW: [[DEF1:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF
159     ; AVX512BW: [[ADD:%[0-9]+]]:_(<16 x s32>) = G_ADD [[DEF]], [[DEF1]]
160     ; AVX512BW: $zmm0 = COPY [[ADD]](<16 x s32>)
161     ; AVX512BW: RET 0
162     %0(<16 x s32>) = IMPLICIT_DEF
163     %1(<16 x s32>) = IMPLICIT_DEF
164     %2(<16 x s32>) = G_ADD %0, %1
165     $zmm0 = COPY %2
166     RET 0
170 name:            test_add_v8i64
171 alignment:       16
172 legalized:       false
173 regBankSelected: false
174 registers:
175   - { id: 0, class: _ }
176   - { id: 1, class: _ }
177   - { id: 2, class: _ }
178 body:             |
179   bb.1 (%ir-block.0):
180     liveins: $zmm0, $zmm1
181     ; AVX1-LABEL: name: test_add_v8i64
182     ; AVX1: [[DEF:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF
183     ; AVX1: [[DEF1:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF
184     ; AVX1: [[UV:%[0-9]+]]:_(<2 x s64>), [[UV1:%[0-9]+]]:_(<2 x s64>), [[UV2:%[0-9]+]]:_(<2 x s64>), [[UV3:%[0-9]+]]:_(<2 x s64>) = G_UNMERGE_VALUES [[DEF]](<8 x s64>)
185     ; AVX1: [[UV4:%[0-9]+]]:_(<2 x s64>), [[UV5:%[0-9]+]]:_(<2 x s64>), [[UV6:%[0-9]+]]:_(<2 x s64>), [[UV7:%[0-9]+]]:_(<2 x s64>) = G_UNMERGE_VALUES [[DEF1]](<8 x s64>)
186     ; AVX1: [[ADD:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV]], [[UV4]]
187     ; AVX1: [[ADD1:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV1]], [[UV5]]
188     ; AVX1: [[ADD2:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV2]], [[UV6]]
189     ; AVX1: [[ADD3:%[0-9]+]]:_(<2 x s64>) = G_ADD [[UV3]], [[UV7]]
190     ; AVX1: [[CONCAT_VECTORS:%[0-9]+]]:_(<8 x s64>) = G_CONCAT_VECTORS [[ADD]](<2 x s64>), [[ADD1]](<2 x s64>), [[ADD2]](<2 x s64>), [[ADD3]](<2 x s64>)
191     ; AVX1: $zmm0 = COPY [[CONCAT_VECTORS]](<8 x s64>)
192     ; AVX1: RET 0
193     ; AVX512F-LABEL: name: test_add_v8i64
194     ; AVX512F: [[DEF:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF
195     ; AVX512F: [[DEF1:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF
196     ; AVX512F: [[ADD:%[0-9]+]]:_(<8 x s64>) = G_ADD [[DEF]], [[DEF1]]
197     ; AVX512F: $zmm0 = COPY [[ADD]](<8 x s64>)
198     ; AVX512F: RET 0
199     ; AVX512BW-LABEL: name: test_add_v8i64
200     ; AVX512BW: [[DEF:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF
201     ; AVX512BW: [[DEF1:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF
202     ; AVX512BW: [[ADD:%[0-9]+]]:_(<8 x s64>) = G_ADD [[DEF]], [[DEF1]]
203     ; AVX512BW: $zmm0 = COPY [[ADD]](<8 x s64>)
204     ; AVX512BW: RET 0
205     %0(<8 x s64>) = IMPLICIT_DEF
206     %1(<8 x s64>) = IMPLICIT_DEF
207     %2(<8 x s64>) = G_ADD %0, %1
208     $zmm0 = COPY %2
209     RET 0
213 name:            test_add_v64i8_2
214 alignment:       16
215 legalized:       false
216 regBankSelected: false
217 registers:
218   - { id: 0, class: _ }
219   - { id: 1, class: _ }
220   - { id: 2, class: _ }
221   - { id: 3, class: _ }
222   - { id: 4, class: _ }
223   - { id: 5, class: _ }
224   - { id: 6, class: _ }
225   - { id: 7, class: _ }
226   - { id: 8, class: _ }
229 body:             |
230   bb.1 (%ir-block.0):
231     liveins: $ymm0, $ymm1, $ymm2, $ymm3
232     ; AVX1-LABEL: name: test_add_v64i8_2
233     ; AVX1: [[COPY:%[0-9]+]]:_(<32 x s8>) = COPY $ymm0
234     ; AVX1: [[COPY1:%[0-9]+]]:_(<32 x s8>) = COPY $ymm1
235     ; AVX1: [[COPY2:%[0-9]+]]:_(<32 x s8>) = COPY $ymm2
236     ; AVX1: [[COPY3:%[0-9]+]]:_(<32 x s8>) = COPY $ymm3
237     ; AVX1: [[UV:%[0-9]+]]:_(<16 x s8>), [[UV1:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[COPY]](<32 x s8>)
238     ; AVX1: [[UV2:%[0-9]+]]:_(<16 x s8>), [[UV3:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[COPY1]](<32 x s8>)
239     ; AVX1: [[UV4:%[0-9]+]]:_(<16 x s8>), [[UV5:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[COPY2]](<32 x s8>)
240     ; AVX1: [[UV6:%[0-9]+]]:_(<16 x s8>), [[UV7:%[0-9]+]]:_(<16 x s8>) = G_UNMERGE_VALUES [[COPY3]](<32 x s8>)
241     ; AVX1: [[ADD:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV]], [[UV4]]
242     ; AVX1: [[ADD1:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV1]], [[UV5]]
243     ; AVX1: [[ADD2:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV2]], [[UV6]]
244     ; AVX1: [[ADD3:%[0-9]+]]:_(<16 x s8>) = G_ADD [[UV3]], [[UV7]]
245     ; AVX1: [[CONCAT_VECTORS:%[0-9]+]]:_(<32 x s8>) = G_CONCAT_VECTORS [[ADD]](<16 x s8>), [[ADD1]](<16 x s8>)
246     ; AVX1: [[CONCAT_VECTORS1:%[0-9]+]]:_(<32 x s8>) = G_CONCAT_VECTORS [[ADD2]](<16 x s8>), [[ADD3]](<16 x s8>)
247     ; AVX1: $ymm0 = COPY [[CONCAT_VECTORS]](<32 x s8>)
248     ; AVX1: $ymm1 = COPY [[CONCAT_VECTORS1]](<32 x s8>)
249     ; AVX1: RET 0, implicit $ymm0, implicit $ymm1
250     ; AVX512F-LABEL: name: test_add_v64i8_2
251     ; AVX512F: [[COPY:%[0-9]+]]:_(<32 x s8>) = COPY $ymm0
252     ; AVX512F: [[COPY1:%[0-9]+]]:_(<32 x s8>) = COPY $ymm1
253     ; AVX512F: [[COPY2:%[0-9]+]]:_(<32 x s8>) = COPY $ymm2
254     ; AVX512F: [[COPY3:%[0-9]+]]:_(<32 x s8>) = COPY $ymm3
255     ; AVX512F: [[ADD:%[0-9]+]]:_(<32 x s8>) = G_ADD [[COPY]], [[COPY2]]
256     ; AVX512F: [[ADD1:%[0-9]+]]:_(<32 x s8>) = G_ADD [[COPY1]], [[COPY3]]
257     ; AVX512F: $ymm0 = COPY [[ADD]](<32 x s8>)
258     ; AVX512F: $ymm1 = COPY [[ADD1]](<32 x s8>)
259     ; AVX512F: RET 0, implicit $ymm0, implicit $ymm1
260     ; AVX512BW-LABEL: name: test_add_v64i8_2
261     ; AVX512BW: [[COPY:%[0-9]+]]:_(<32 x s8>) = COPY $ymm0
262     ; AVX512BW: [[COPY1:%[0-9]+]]:_(<32 x s8>) = COPY $ymm1
263     ; AVX512BW: [[COPY2:%[0-9]+]]:_(<32 x s8>) = COPY $ymm2
264     ; AVX512BW: [[COPY3:%[0-9]+]]:_(<32 x s8>) = COPY $ymm3
265     ; AVX512BW: [[CONCAT_VECTORS:%[0-9]+]]:_(<64 x s8>) = G_CONCAT_VECTORS [[COPY]](<32 x s8>), [[COPY1]](<32 x s8>)
266     ; AVX512BW: [[CONCAT_VECTORS1:%[0-9]+]]:_(<64 x s8>) = G_CONCAT_VECTORS [[COPY2]](<32 x s8>), [[COPY3]](<32 x s8>)
267     ; AVX512BW: [[ADD:%[0-9]+]]:_(<64 x s8>) = G_ADD [[CONCAT_VECTORS]], [[CONCAT_VECTORS1]]
268     ; AVX512BW: [[UV:%[0-9]+]]:_(<32 x s8>), [[UV1:%[0-9]+]]:_(<32 x s8>) = G_UNMERGE_VALUES [[ADD]](<64 x s8>)
269     ; AVX512BW: $ymm0 = COPY [[UV]](<32 x s8>)
270     ; AVX512BW: $ymm1 = COPY [[UV1]](<32 x s8>)
271     ; AVX512BW: RET 0, implicit $ymm0, implicit $ymm1
272     %2(<32 x s8>) = COPY $ymm0
273     %3(<32 x s8>) = COPY $ymm1
274     %4(<32 x s8>) = COPY $ymm2
275     %5(<32 x s8>) = COPY $ymm3
276     %0(<64 x s8>) = G_CONCAT_VECTORS %2(<32 x s8>), %3(<32 x s8>)
277     %1(<64 x s8>) = G_CONCAT_VECTORS %4(<32 x s8>), %5(<32 x s8>)
278     %6(<64 x s8>) = G_ADD %0, %1
279     %7(<32 x s8>), %8(<32 x s8>) = G_UNMERGE_VALUES %6(<64 x s8>)
280     $ymm0 = COPY %7(<32 x s8>)
281     $ymm1 = COPY %8(<32 x s8>)
282     RET 0, implicit $ymm0, implicit $ymm1