Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / GlobalISel / legalize-sub-v512.mir
blobc83664bc1ec08336dabc8ec1acbea12952a3fc42
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=AVX1
3 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f           -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=AVX512F
4 # RUN: llc -mtriple=x86_64-linux-gnu -mattr=+avx512f,+avx512bw -run-pass=legalizer %s -o - | FileCheck %s --check-prefix=AVX512BW
6 # TODO: add tests for additional configuration after the legalization supported
8 --- |
9   define void @test_sub_v64i8() {
10     %ret = sub <64 x i8> undef, undef
11     ret void
12   }
14   define void @test_sub_v32i16() {
15     %ret = sub <32 x i16> undef, undef
16     ret void
17   }
19   define void @test_sub_v16i32() {
20     %ret = sub <16 x i32> undef, undef
21     ret void
22   }
24   define void @test_sub_v8i64() {
25     %ret = sub <8 x i64> undef, undef
26     ret void
27   }
29 ...
30 ---
31 name:            test_sub_v64i8
32 alignment:       16
33 legalized:       false
34 regBankSelected: false
35 registers:
36   - { id: 0, class: _ }
37   - { id: 1, class: _ }
38   - { id: 2, class: _ }
39 body:             |
40   bb.1 (%ir-block.0):
41     liveins: $zmm0, $zmm1
43     ; AVX1-LABEL: name: test_sub_v64i8
44     ; AVX1: liveins: $zmm0, $zmm1
45     ; AVX1-NEXT: {{  $}}
46     ; AVX1-NEXT: [[DEF:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF
47     ; AVX1-NEXT: [[DEF1:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF
48     ; AVX1-NEXT: [[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>)
49     ; AVX1-NEXT: [[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>)
50     ; AVX1-NEXT: [[SUB:%[0-9]+]]:_(<16 x s8>) = G_SUB [[UV]], [[UV4]]
51     ; AVX1-NEXT: [[SUB1:%[0-9]+]]:_(<16 x s8>) = G_SUB [[UV1]], [[UV5]]
52     ; AVX1-NEXT: [[SUB2:%[0-9]+]]:_(<16 x s8>) = G_SUB [[UV2]], [[UV6]]
53     ; AVX1-NEXT: [[SUB3:%[0-9]+]]:_(<16 x s8>) = G_SUB [[UV3]], [[UV7]]
54     ; AVX1-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<64 x s8>) = G_CONCAT_VECTORS [[SUB]](<16 x s8>), [[SUB1]](<16 x s8>), [[SUB2]](<16 x s8>), [[SUB3]](<16 x s8>)
55     ; AVX1-NEXT: $zmm0 = COPY [[CONCAT_VECTORS]](<64 x s8>)
56     ; AVX1-NEXT: RET 0
57     ;
58     ; AVX512F-LABEL: name: test_sub_v64i8
59     ; AVX512F: liveins: $zmm0, $zmm1
60     ; AVX512F-NEXT: {{  $}}
61     ; AVX512F-NEXT: [[DEF:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF
62     ; AVX512F-NEXT: [[DEF1:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF
63     ; AVX512F-NEXT: [[UV:%[0-9]+]]:_(<32 x s8>), [[UV1:%[0-9]+]]:_(<32 x s8>) = G_UNMERGE_VALUES [[DEF]](<64 x s8>)
64     ; AVX512F-NEXT: [[UV2:%[0-9]+]]:_(<32 x s8>), [[UV3:%[0-9]+]]:_(<32 x s8>) = G_UNMERGE_VALUES [[DEF1]](<64 x s8>)
65     ; AVX512F-NEXT: [[SUB:%[0-9]+]]:_(<32 x s8>) = G_SUB [[UV]], [[UV2]]
66     ; AVX512F-NEXT: [[SUB1:%[0-9]+]]:_(<32 x s8>) = G_SUB [[UV1]], [[UV3]]
67     ; AVX512F-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<64 x s8>) = G_CONCAT_VECTORS [[SUB]](<32 x s8>), [[SUB1]](<32 x s8>)
68     ; AVX512F-NEXT: $zmm0 = COPY [[CONCAT_VECTORS]](<64 x s8>)
69     ; AVX512F-NEXT: RET 0
70     ;
71     ; AVX512BW-LABEL: name: test_sub_v64i8
72     ; AVX512BW: liveins: $zmm0, $zmm1
73     ; AVX512BW-NEXT: {{  $}}
74     ; AVX512BW-NEXT: [[DEF:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF
75     ; AVX512BW-NEXT: [[DEF1:%[0-9]+]]:_(<64 x s8>) = IMPLICIT_DEF
76     ; AVX512BW-NEXT: [[SUB:%[0-9]+]]:_(<64 x s8>) = G_SUB [[DEF]], [[DEF1]]
77     ; AVX512BW-NEXT: $zmm0 = COPY [[SUB]](<64 x s8>)
78     ; AVX512BW-NEXT: RET 0
79     %0(<64 x s8>) = IMPLICIT_DEF
80     %1(<64 x s8>) = IMPLICIT_DEF
81     %2(<64 x s8>) = G_SUB %0, %1
82     $zmm0 = COPY %2
83     RET 0
85 ...
86 ---
87 name:            test_sub_v32i16
88 alignment:       16
89 legalized:       false
90 regBankSelected: false
91 registers:
92   - { id: 0, class: _ }
93   - { id: 1, class: _ }
94   - { id: 2, class: _ }
95 body:             |
96   bb.1 (%ir-block.0):
97     liveins: $zmm0, $zmm1
99     ; AVX1-LABEL: name: test_sub_v32i16
100     ; AVX1: liveins: $zmm0, $zmm1
101     ; AVX1-NEXT: {{  $}}
102     ; AVX1-NEXT: [[DEF:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF
103     ; AVX1-NEXT: [[DEF1:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF
104     ; AVX1-NEXT: [[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>)
105     ; AVX1-NEXT: [[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>)
106     ; AVX1-NEXT: [[SUB:%[0-9]+]]:_(<8 x s16>) = G_SUB [[UV]], [[UV4]]
107     ; AVX1-NEXT: [[SUB1:%[0-9]+]]:_(<8 x s16>) = G_SUB [[UV1]], [[UV5]]
108     ; AVX1-NEXT: [[SUB2:%[0-9]+]]:_(<8 x s16>) = G_SUB [[UV2]], [[UV6]]
109     ; AVX1-NEXT: [[SUB3:%[0-9]+]]:_(<8 x s16>) = G_SUB [[UV3]], [[UV7]]
110     ; AVX1-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<32 x s16>) = G_CONCAT_VECTORS [[SUB]](<8 x s16>), [[SUB1]](<8 x s16>), [[SUB2]](<8 x s16>), [[SUB3]](<8 x s16>)
111     ; AVX1-NEXT: $zmm0 = COPY [[CONCAT_VECTORS]](<32 x s16>)
112     ; AVX1-NEXT: RET 0
113     ;
114     ; AVX512F-LABEL: name: test_sub_v32i16
115     ; AVX512F: liveins: $zmm0, $zmm1
116     ; AVX512F-NEXT: {{  $}}
117     ; AVX512F-NEXT: [[DEF:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF
118     ; AVX512F-NEXT: [[DEF1:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF
119     ; AVX512F-NEXT: [[UV:%[0-9]+]]:_(<16 x s16>), [[UV1:%[0-9]+]]:_(<16 x s16>) = G_UNMERGE_VALUES [[DEF]](<32 x s16>)
120     ; AVX512F-NEXT: [[UV2:%[0-9]+]]:_(<16 x s16>), [[UV3:%[0-9]+]]:_(<16 x s16>) = G_UNMERGE_VALUES [[DEF1]](<32 x s16>)
121     ; AVX512F-NEXT: [[SUB:%[0-9]+]]:_(<16 x s16>) = G_SUB [[UV]], [[UV2]]
122     ; AVX512F-NEXT: [[SUB1:%[0-9]+]]:_(<16 x s16>) = G_SUB [[UV1]], [[UV3]]
123     ; AVX512F-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<32 x s16>) = G_CONCAT_VECTORS [[SUB]](<16 x s16>), [[SUB1]](<16 x s16>)
124     ; AVX512F-NEXT: $zmm0 = COPY [[CONCAT_VECTORS]](<32 x s16>)
125     ; AVX512F-NEXT: RET 0
126     ;
127     ; AVX512BW-LABEL: name: test_sub_v32i16
128     ; AVX512BW: liveins: $zmm0, $zmm1
129     ; AVX512BW-NEXT: {{  $}}
130     ; AVX512BW-NEXT: [[DEF:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF
131     ; AVX512BW-NEXT: [[DEF1:%[0-9]+]]:_(<32 x s16>) = IMPLICIT_DEF
132     ; AVX512BW-NEXT: [[SUB:%[0-9]+]]:_(<32 x s16>) = G_SUB [[DEF]], [[DEF1]]
133     ; AVX512BW-NEXT: $zmm0 = COPY [[SUB]](<32 x s16>)
134     ; AVX512BW-NEXT: RET 0
135     %0(<32 x s16>) = IMPLICIT_DEF
136     %1(<32 x s16>) = IMPLICIT_DEF
137     %2(<32 x s16>) = G_SUB %0, %1
138     $zmm0 = COPY %2
139     RET 0
143 name:            test_sub_v16i32
144 alignment:       16
145 legalized:       false
146 regBankSelected: false
147 registers:
148   - { id: 0, class: _ }
149   - { id: 1, class: _ }
150   - { id: 2, class: _ }
151 body:             |
152   bb.1 (%ir-block.0):
153     liveins: $zmm0, $zmm1
155     ; AVX1-LABEL: name: test_sub_v16i32
156     ; AVX1: liveins: $zmm0, $zmm1
157     ; AVX1-NEXT: {{  $}}
158     ; AVX1-NEXT: [[DEF:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF
159     ; AVX1-NEXT: [[DEF1:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF
160     ; AVX1-NEXT: [[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>)
161     ; AVX1-NEXT: [[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>)
162     ; AVX1-NEXT: [[SUB:%[0-9]+]]:_(<4 x s32>) = G_SUB [[UV]], [[UV4]]
163     ; AVX1-NEXT: [[SUB1:%[0-9]+]]:_(<4 x s32>) = G_SUB [[UV1]], [[UV5]]
164     ; AVX1-NEXT: [[SUB2:%[0-9]+]]:_(<4 x s32>) = G_SUB [[UV2]], [[UV6]]
165     ; AVX1-NEXT: [[SUB3:%[0-9]+]]:_(<4 x s32>) = G_SUB [[UV3]], [[UV7]]
166     ; AVX1-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<16 x s32>) = G_CONCAT_VECTORS [[SUB]](<4 x s32>), [[SUB1]](<4 x s32>), [[SUB2]](<4 x s32>), [[SUB3]](<4 x s32>)
167     ; AVX1-NEXT: $zmm0 = COPY [[CONCAT_VECTORS]](<16 x s32>)
168     ; AVX1-NEXT: RET 0
169     ;
170     ; AVX512F-LABEL: name: test_sub_v16i32
171     ; AVX512F: liveins: $zmm0, $zmm1
172     ; AVX512F-NEXT: {{  $}}
173     ; AVX512F-NEXT: [[DEF:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF
174     ; AVX512F-NEXT: [[DEF1:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF
175     ; AVX512F-NEXT: [[SUB:%[0-9]+]]:_(<16 x s32>) = G_SUB [[DEF]], [[DEF1]]
176     ; AVX512F-NEXT: $zmm0 = COPY [[SUB]](<16 x s32>)
177     ; AVX512F-NEXT: RET 0
178     ;
179     ; AVX512BW-LABEL: name: test_sub_v16i32
180     ; AVX512BW: liveins: $zmm0, $zmm1
181     ; AVX512BW-NEXT: {{  $}}
182     ; AVX512BW-NEXT: [[DEF:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF
183     ; AVX512BW-NEXT: [[DEF1:%[0-9]+]]:_(<16 x s32>) = IMPLICIT_DEF
184     ; AVX512BW-NEXT: [[SUB:%[0-9]+]]:_(<16 x s32>) = G_SUB [[DEF]], [[DEF1]]
185     ; AVX512BW-NEXT: $zmm0 = COPY [[SUB]](<16 x s32>)
186     ; AVX512BW-NEXT: RET 0
187     %0(<16 x s32>) = IMPLICIT_DEF
188     %1(<16 x s32>) = IMPLICIT_DEF
189     %2(<16 x s32>) = G_SUB %0, %1
190     $zmm0 = COPY %2
191     RET 0
195 name:            test_sub_v8i64
196 alignment:       16
197 legalized:       false
198 regBankSelected: false
199 registers:
200   - { id: 0, class: _ }
201   - { id: 1, class: _ }
202   - { id: 2, class: _ }
203 body:             |
204   bb.1 (%ir-block.0):
205     liveins: $zmm0, $zmm1
207     ; AVX1-LABEL: name: test_sub_v8i64
208     ; AVX1: liveins: $zmm0, $zmm1
209     ; AVX1-NEXT: {{  $}}
210     ; AVX1-NEXT: [[DEF:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF
211     ; AVX1-NEXT: [[DEF1:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF
212     ; AVX1-NEXT: [[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>)
213     ; AVX1-NEXT: [[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>)
214     ; AVX1-NEXT: [[SUB:%[0-9]+]]:_(<2 x s64>) = G_SUB [[UV]], [[UV4]]
215     ; AVX1-NEXT: [[SUB1:%[0-9]+]]:_(<2 x s64>) = G_SUB [[UV1]], [[UV5]]
216     ; AVX1-NEXT: [[SUB2:%[0-9]+]]:_(<2 x s64>) = G_SUB [[UV2]], [[UV6]]
217     ; AVX1-NEXT: [[SUB3:%[0-9]+]]:_(<2 x s64>) = G_SUB [[UV3]], [[UV7]]
218     ; AVX1-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<8 x s64>) = G_CONCAT_VECTORS [[SUB]](<2 x s64>), [[SUB1]](<2 x s64>), [[SUB2]](<2 x s64>), [[SUB3]](<2 x s64>)
219     ; AVX1-NEXT: $zmm0 = COPY [[CONCAT_VECTORS]](<8 x s64>)
220     ; AVX1-NEXT: RET 0
221     ;
222     ; AVX512F-LABEL: name: test_sub_v8i64
223     ; AVX512F: liveins: $zmm0, $zmm1
224     ; AVX512F-NEXT: {{  $}}
225     ; AVX512F-NEXT: [[DEF:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF
226     ; AVX512F-NEXT: [[DEF1:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF
227     ; AVX512F-NEXT: [[SUB:%[0-9]+]]:_(<8 x s64>) = G_SUB [[DEF]], [[DEF1]]
228     ; AVX512F-NEXT: $zmm0 = COPY [[SUB]](<8 x s64>)
229     ; AVX512F-NEXT: RET 0
230     ;
231     ; AVX512BW-LABEL: name: test_sub_v8i64
232     ; AVX512BW: liveins: $zmm0, $zmm1
233     ; AVX512BW-NEXT: {{  $}}
234     ; AVX512BW-NEXT: [[DEF:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF
235     ; AVX512BW-NEXT: [[DEF1:%[0-9]+]]:_(<8 x s64>) = IMPLICIT_DEF
236     ; AVX512BW-NEXT: [[SUB:%[0-9]+]]:_(<8 x s64>) = G_SUB [[DEF]], [[DEF1]]
237     ; AVX512BW-NEXT: $zmm0 = COPY [[SUB]](<8 x s64>)
238     ; AVX512BW-NEXT: RET 0
239     %0(<8 x s64>) = IMPLICIT_DEF
240     %1(<8 x s64>) = IMPLICIT_DEF
241     %2(<8 x s64>) = G_SUB %0, %1
242     $zmm0 = COPY %2
243     RET 0