1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs -mtriple aarch64-unknown-unknown %s -o - | FileCheck %s
7 tracksRegLiveness: true
10 machineFunctionInfo: {}
14 ; CHECK-LABEL: name: add_lhs_sub_reg
15 ; CHECK: liveins: $w0, $w1
17 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
18 ; CHECK-NEXT: $w0 = COPY [[COPY]](s32)
21 %2:_(s32) = G_SUB %0, %1
22 %3:_(s32) = G_ADD %2, %1
26 name: add_lhs_sub_reg_wide
28 tracksRegLiveness: true
31 machineFunctionInfo: {}
35 ; CHECK-LABEL: name: add_lhs_sub_reg_wide
36 ; CHECK: liveins: $q0, $q1
38 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s128) = COPY $q0
39 ; CHECK-NEXT: $q0 = COPY [[COPY]](s128)
42 %2:_(s128) = G_SUB %0, %1
43 %3:_(s128) = G_ADD %2, %1
47 name: add_lhs_sub_reg_vec
49 tracksRegLiveness: true
52 machineFunctionInfo: {}
56 ; CHECK-LABEL: name: add_lhs_sub_reg_vec
57 ; CHECK: liveins: $x0, $x1
59 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $x0
60 ; CHECK-NEXT: $x0 = COPY [[COPY]](<4 x s16>)
61 %0:_(<4 x s16>) = COPY $x0
62 %1:_(<4 x s16>) = COPY $x1
63 %2:_(<4 x s16>) = G_SUB %0, %1
64 %3:_(<4 x s16>) = G_ADD %2, %1
70 tracksRegLiveness: true
73 machineFunctionInfo: {}
77 ; CHECK-LABEL: name: add_rhs_sub_reg
78 ; CHECK: liveins: $w0, $w1
80 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
81 ; CHECK-NEXT: $w0 = COPY [[COPY]](s32)
84 %2:_(s32) = G_SUB %0, %1
85 %3:_(s32) = G_ADD %1, %2
89 name: add_rhs_sub_reg_wide
91 tracksRegLiveness: true
94 machineFunctionInfo: {}
98 ; CHECK-LABEL: name: add_rhs_sub_reg_wide
99 ; CHECK: liveins: $q0, $q1
101 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s128) = COPY $q0
102 ; CHECK-NEXT: $q0 = COPY [[COPY]](s128)
103 %0:_(s128) = COPY $q0
104 %1:_(s128) = COPY $q1
105 %2:_(s128) = G_SUB %0, %1
106 %3:_(s128) = G_ADD %1, %2
110 name: add_rhs_sub_reg_vec
112 tracksRegLiveness: true
115 machineFunctionInfo: {}
119 ; CHECK-LABEL: name: add_rhs_sub_reg_vec
120 ; CHECK: liveins: $x0, $x1
122 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $x0
123 ; CHECK-NEXT: $x0 = COPY [[COPY]](<4 x s16>)
124 %0:_(<4 x s16>) = COPY $x0
125 %1:_(<4 x s16>) = COPY $x1
126 %2:_(<4 x s16>) = G_SUB %0, %1
127 %3:_(<4 x s16>) = G_ADD %1, %2
132 tracksRegLiveness: true
136 ; CHECK-LABEL: name: fadd_by_zero
137 ; CHECK: liveins: $d0
139 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $d0
140 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_FCONSTANT double 0.000000e+00
141 ; CHECK-NEXT: [[FADD:%[0-9]+]]:_(s64) = G_FADD [[COPY]], [[C]]
142 ; CHECK-NEXT: $d0 = COPY [[FADD]](s64)
144 %1:_(s64) = G_FCONSTANT double 0.000000e+00
145 %2:_(s64) = G_FADD %0, %1(s64)
149 name: fadd_vector_by_zero
151 tracksRegLiveness: true
154 machineFunctionInfo: {}
158 ; CHECK-LABEL: name: fadd_vector_by_zero
159 ; CHECK: liveins: $q0
161 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
162 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 0.000000e+00
163 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32)
164 ; CHECK-NEXT: [[FADD:%[0-9]+]]:_(<4 x s32>) = G_FADD [[COPY]], [[BUILD_VECTOR]]
165 ; CHECK-NEXT: $q0 = COPY [[FADD]](<4 x s32>)
166 %0:_(<4 x s32>) = COPY $q0
167 %1:_(s32) = G_FCONSTANT float 0.0
168 %2:_(<4 x s32>) = G_BUILD_VECTOR %1(s32), %1(s32), %1(s32), %1(s32)
169 %3:_(<4 x s32>) = G_FADD %0, %2(<4 x s32>)
170 $q0 = COPY %3(<4 x s32>)
174 name: fadd_by_neg_zero
175 tracksRegLiveness: true
179 ; CHECK-LABEL: name: fadd_by_neg_zero
180 ; CHECK: liveins: $d0
182 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $d0
183 ; CHECK-NEXT: $d0 = COPY [[COPY]](s64)
185 %1:_(s64) = G_FCONSTANT double -0.000000e+00
186 %2:_(s64) = G_FADD %0, %1(s64)
190 name: fadd_vector_by_neg_zero
192 tracksRegLiveness: true
195 machineFunctionInfo: {}
199 ; CHECK-LABEL: name: fadd_vector_by_neg_zero
200 ; CHECK: liveins: $q0
202 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
203 ; CHECK-NEXT: $q0 = COPY [[COPY]](<4 x s32>)
204 %0:_(<4 x s32>) = COPY $q0
205 %1:_(s32) = G_FCONSTANT float -0.0
206 %2:_(<4 x s32>) = G_BUILD_VECTOR %1(s32), %1(s32), %1(s32), %1(s32)
207 %3:_(<4 x s32>) = G_FADD %0, %2(<4 x s32>)
208 $q0 = COPY %3(<4 x s32>)
211 name: saddl_v8i8_v8i32
212 tracksRegLiveness: true
217 ; CHECK-LABEL: name: saddl_v8i8_v8i32
218 ; CHECK: liveins: $d0, $d1
220 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
221 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s8>) = COPY $d1
222 ; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(<8 x s16>) = G_SEXT [[COPY]](<8 x s8>)
223 ; CHECK-NEXT: [[SEXT1:%[0-9]+]]:_(<8 x s16>) = G_SEXT [[COPY1]](<8 x s8>)
224 ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(<8 x s16>) = G_ADD [[SEXT]], [[SEXT1]]
225 ; CHECK-NEXT: [[SEXT2:%[0-9]+]]:_(<8 x s32>) = G_SEXT [[ADD]](<8 x s16>)
226 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[SEXT2]](<8 x s32>)
227 ; CHECK-NEXT: $q0 = COPY [[UV]](<4 x s32>)
228 ; CHECK-NEXT: $q1 = COPY [[UV1]](<4 x s32>)
229 ; CHECK-NEXT: RET_ReallyLR implicit $q0, implicit $q1
230 %0:_(<8 x s8>) = COPY $d0
231 %1:_(<8 x s8>) = COPY $d1
232 %2:_(<8 x s32>) = G_SEXT %0(<8 x s8>)
233 %3:_(<8 x s32>) = G_SEXT %1(<8 x s8>)
234 %4:_(<8 x s32>) = G_ADD %2, %3
235 %5:_(<4 x s32>), %6:_(<4 x s32>) = G_UNMERGE_VALUES %4(<8 x s32>)
236 $q0 = COPY %5(<4 x s32>)
237 $q1 = COPY %6(<4 x s32>)
238 RET_ReallyLR implicit $q0, implicit $q1
242 name: uaddl_v8i8_v8i32
243 tracksRegLiveness: true
248 ; CHECK-LABEL: name: uaddl_v8i8_v8i32
249 ; CHECK: liveins: $d0, $d1
251 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
252 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s8>) = COPY $d1
253 ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(<8 x s16>) = G_ZEXT [[COPY]](<8 x s8>)
254 ; CHECK-NEXT: [[ZEXT1:%[0-9]+]]:_(<8 x s16>) = G_ZEXT [[COPY1]](<8 x s8>)
255 ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(<8 x s16>) = G_ADD [[ZEXT]], [[ZEXT1]]
256 ; CHECK-NEXT: [[ZEXT2:%[0-9]+]]:_(<8 x s32>) = G_ZEXT [[ADD]](<8 x s16>)
257 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[ZEXT2]](<8 x s32>)
258 ; CHECK-NEXT: $q0 = COPY [[UV]](<4 x s32>)
259 ; CHECK-NEXT: $q1 = COPY [[UV1]](<4 x s32>)
260 ; CHECK-NEXT: RET_ReallyLR implicit $q0, implicit $q1
261 %0:_(<8 x s8>) = COPY $d0
262 %1:_(<8 x s8>) = COPY $d1
263 %2:_(<8 x s32>) = G_ZEXT %0(<8 x s8>)
264 %3:_(<8 x s32>) = G_ZEXT %1(<8 x s8>)
265 %4:_(<8 x s32>) = G_ADD %2, %3
266 %5:_(<4 x s32>), %6:_(<4 x s32>) = G_UNMERGE_VALUES %4(<8 x s32>)
267 $q0 = COPY %5(<4 x s32>)
268 $q1 = COPY %6(<4 x s32>)
269 RET_ReallyLR implicit $q0, implicit $q1
273 name: ssubl_v8i8_v8i32
274 tracksRegLiveness: true
279 ; CHECK-LABEL: name: ssubl_v8i8_v8i32
280 ; CHECK: liveins: $d0, $d1
282 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
283 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s8>) = COPY $d1
284 ; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(<8 x s16>) = G_SEXT [[COPY]](<8 x s8>)
285 ; CHECK-NEXT: [[SEXT1:%[0-9]+]]:_(<8 x s16>) = G_SEXT [[COPY1]](<8 x s8>)
286 ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(<8 x s16>) = G_SUB [[SEXT]], [[SEXT1]]
287 ; CHECK-NEXT: [[SEXT2:%[0-9]+]]:_(<8 x s32>) = G_SEXT [[SUB]](<8 x s16>)
288 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[SEXT2]](<8 x s32>)
289 ; CHECK-NEXT: $q0 = COPY [[UV]](<4 x s32>)
290 ; CHECK-NEXT: $q1 = COPY [[UV1]](<4 x s32>)
291 ; CHECK-NEXT: RET_ReallyLR implicit $q0, implicit $q1
292 %0:_(<8 x s8>) = COPY $d0
293 %1:_(<8 x s8>) = COPY $d1
294 %2:_(<8 x s32>) = G_SEXT %0(<8 x s8>)
295 %3:_(<8 x s32>) = G_SEXT %1(<8 x s8>)
296 %4:_(<8 x s32>) = G_SUB %2, %3
297 %5:_(<4 x s32>), %6:_(<4 x s32>) = G_UNMERGE_VALUES %4(<8 x s32>)
298 $q0 = COPY %5(<4 x s32>)
299 $q1 = COPY %6(<4 x s32>)
300 RET_ReallyLR implicit $q0, implicit $q1
304 name: usubl_v8i8_v8i32
305 tracksRegLiveness: true
310 ; CHECK-LABEL: name: usubl_v8i8_v8i32
311 ; CHECK: liveins: $d0, $d1
313 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s8>) = COPY $d0
314 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<8 x s8>) = COPY $d1
315 ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(<8 x s16>) = G_ZEXT [[COPY]](<8 x s8>)
316 ; CHECK-NEXT: [[ZEXT1:%[0-9]+]]:_(<8 x s16>) = G_ZEXT [[COPY1]](<8 x s8>)
317 ; CHECK-NEXT: [[SUB:%[0-9]+]]:_(<8 x s16>) = G_SUB [[ZEXT]], [[ZEXT1]]
318 ; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(<8 x s32>) = G_SEXT [[SUB]](<8 x s16>)
319 ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<4 x s32>), [[UV1:%[0-9]+]]:_(<4 x s32>) = G_UNMERGE_VALUES [[SEXT]](<8 x s32>)
320 ; CHECK-NEXT: $q0 = COPY [[UV]](<4 x s32>)
321 ; CHECK-NEXT: $q1 = COPY [[UV1]](<4 x s32>)
322 ; CHECK-NEXT: RET_ReallyLR implicit $q0, implicit $q1
323 %0:_(<8 x s8>) = COPY $d0
324 %1:_(<8 x s8>) = COPY $d1
325 %2:_(<8 x s32>) = G_ZEXT %0(<8 x s8>)
326 %3:_(<8 x s32>) = G_ZEXT %1(<8 x s8>)
327 %4:_(<8 x s32>) = G_SUB %2, %3
328 %5:_(<4 x s32>), %6:_(<4 x s32>) = G_UNMERGE_VALUES %4(<8 x s32>)
329 $q0 = COPY %5(<4 x s32>)
330 $q1 = COPY %6(<4 x s32>)
331 RET_ReallyLR implicit $q0, implicit $q1