xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-shuffle-vector.mir (revision 1d0d2dfce7c8967fe58f28ec14a75b9186a3fc55)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple aarch64-apple-ios  -run-pass=aarch64-prelegalizer-combiner %s -o - | FileCheck %s
3
4# Check that we canonicalize shuffle_vector(Src1, Src2, mask(0,1,2,3))
5# into concat_vector(Src1, Src2).
6---
7name: shuffle_vector_to_concat_vector_0123
8tracksRegLiveness: true
9body:             |
10  bb.1:
11    liveins: $d0, $d1
12
13    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_0123
14    ; CHECK: liveins: $d0, $d1
15    ; CHECK-NEXT: {{  $}}
16    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
17    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
18    ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s32>) = G_CONCAT_VECTORS [[COPY]](<2 x s32>), [[COPY1]](<2 x s32>)
19    ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<4 x s32>)
20    %0:_(<2 x s32>) = COPY $d0
21    %1:_(<2 x s32>) = COPY $d1
22    %2:_(<4 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(0, 1, 2, 3)
23    RET_ReallyLR implicit %2
24...
25# Check that we canonicalize shuffle_vector(Src1, Src2, mask(2,3,0,1,2,3))
26# into concat_vector(Src2, Src1, Src2).
27---
28name: shuffle_vector_to_concat_vector_230123
29tracksRegLiveness: true
30body:             |
31  bb.1:
32    liveins: $d0, $d1
33
34    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_230123
35    ; CHECK: liveins: $d0, $d1
36    ; CHECK-NEXT: {{  $}}
37    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
38    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
39    ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<6 x s32>) = G_CONCAT_VECTORS [[COPY1]](<2 x s32>), [[COPY]](<2 x s32>), [[COPY1]](<2 x s32>)
40    ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<6 x s32>)
41    %0:_(<2 x s32>) = COPY $d0
42    %1:_(<2 x s32>) = COPY $d1
43    %2:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(2,3,0,1,2,3)
44    RET_ReallyLR implicit %2
45...
46# Check that we canonicalize shuffle_vector(Src1, Src2, mask(2,undef,0,1,undef,3))
47# into concat_vector(Src2, Src1, Src2).
48---
49name: shuffle_vector_to_concat_vector_2undef01undef3
50tracksRegLiveness: true
51body:             |
52  bb.1:
53    liveins: $d0, $d1
54
55    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_2undef01undef3
56    ; CHECK: liveins: $d0, $d1
57    ; CHECK-NEXT: {{  $}}
58    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
59    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
60    ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<6 x s32>) = G_CONCAT_VECTORS [[COPY1]](<2 x s32>), [[COPY]](<2 x s32>), [[COPY1]](<2 x s32>)
61    ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<6 x s32>)
62    %0:_(<2 x s32>) = COPY $d0
63    %1:_(<2 x s32>) = COPY $d1
64    %2:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(2,-1,0,1,-1,3)
65    RET_ReallyLR implicit %2
66...
67# Check that we don't canonicalize shuffle_vector into concat_vectors
68# when the sources get half mixed.
69---
70name: shuffle_vector_to_concat_vector_mixed_src_200123_neg
71tracksRegLiveness: true
72body:             |
73  bb.1:
74    liveins: $d0, $d1
75
76    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_mixed_src_200123_neg
77    ; CHECK: liveins: $d0, $d1
78    ; CHECK-NEXT: {{  $}}
79    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
80    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
81    ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<6 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<2 x s32>), [[COPY1]], shufflemask(2, 0, 0, 1, 2, 3)
82    ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<6 x s32>)
83    %0:_(<2 x s32>) = COPY $d0
84    %1:_(<2 x s32>) = COPY $d1
85    %2:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(2,0,0,1,2,3)
86    RET_ReallyLR implicit %2
87...
88# Check that we produce implicit_def while canonicalizing shuffle_vector(Src1, Src2, mask(2,undef,undef,undef,undef,1))
89# into concat_vector(Src2, undef, Src1).
90---
91name: shuffle_vector_to_concat_vector_2undef1
92tracksRegLiveness: true
93body:             |
94  bb.1:
95    liveins: $d0, $d1
96
97    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_2undef1
98    ; CHECK: liveins: $d0, $d1
99    ; CHECK-NEXT: {{  $}}
100    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
101    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
102    ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<2 x s32>) = G_IMPLICIT_DEF
103    ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<6 x s32>) = G_CONCAT_VECTORS [[COPY1]](<2 x s32>), [[DEF]](<2 x s32>), [[COPY]](<2 x s32>)
104    ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<6 x s32>)
105    %0:_(<2 x s32>) = COPY $d0
106    %1:_(<2 x s32>) = COPY $d1
107    %2:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(2,-1,-1,-1,-1,1)
108    RET_ReallyLR implicit %2
109...
110# Check that we don't canonicalize shuffle_vector into concat_vectors
111# if a source is flipped.
112---
113name: shuffle_vector_to_concat_vector_src_flipped_230132_neg
114tracksRegLiveness: true
115body:             |
116  bb.1:
117    liveins: $d0, $d1
118
119    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_src_flipped_230132_neg
120    ; CHECK: liveins: $d0, $d1
121    ; CHECK-NEXT: {{  $}}
122    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
123    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
124    ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<6 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<2 x s32>), [[COPY1]], shufflemask(2, 3, 0, 1, 3, 2)
125    ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<6 x s32>)
126    %0:_(<2 x s32>) = COPY $d0
127    %1:_(<2 x s32>) = COPY $d1
128    %2:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(2,3,0,1,3,2)
129    RET_ReallyLR implicit %2
130...
131# Check that we don't canonicalize shuffle_vector into concat_vectors
132# if a source is flipped and the other half is undef.
133---
134name: shuffle_vector_to_concat_vector_src_flipped_23013undef_neg
135tracksRegLiveness: true
136body:             |
137  bb.1:
138    liveins: $d0, $d1
139
140    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_src_flipped_23013undef_neg
141    ; CHECK: liveins: $d0, $d1
142    ; CHECK-NEXT: {{  $}}
143    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $d0
144    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $d1
145    ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<6 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<2 x s32>), [[COPY1]], shufflemask(2, 3, 0, 1, 3, undef)
146    ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<6 x s32>)
147    %0:_(<2 x s32>) = COPY $d0
148    %1:_(<2 x s32>) = COPY $d1
149    %2:_(<6 x s32>) = G_SHUFFLE_VECTOR %0(<2 x s32>), %1(<2 x s32>), shufflemask(2,3,0,1,3,-1)
150    RET_ReallyLR implicit %2
151...
152
153# Check that we canonicalize shuffle_vector(Src1, Src2, mask(0,1,2,3,4,5,6,7))
154# into concat_vector(Src1, Src2) with bigger vector type.
155---
156name: shuffle_vector_to_concat_vector_01234567
157tracksRegLiveness: true
158body:             |
159  bb.1:
160    liveins: $q0, $q1
161
162    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_01234567
163    ; CHECK: liveins: $q0, $q1
164    ; CHECK-NEXT: {{  $}}
165    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
166    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1
167    ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<8 x s32>) = G_CONCAT_VECTORS [[COPY]](<4 x s32>), [[COPY1]](<4 x s32>)
168    ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<8 x s32>)
169    %0:_(<4 x s32>) = COPY $q0
170    %1:_(<4 x s32>) = COPY $q1
171    %2:_(<8 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(0, 1, 2, 3, 4, 5, 6, 7)
172    RET_ReallyLR implicit %2
173...
174# Check that we canonicalize shuffle_vector(Src1, Src2, mask(4,5,6,7,0,1,2,3))
175# into concat_vector(Src2, Src1, Src2) with bigger vector type.
176---
177name: shuffle_vector_to_concat_vector_45670123
178tracksRegLiveness: true
179body:             |
180  bb.1:
181    liveins: $q0, $q1
182
183    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_45670123
184    ; CHECK: liveins: $q0, $q1
185    ; CHECK-NEXT: {{  $}}
186    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
187    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1
188    ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<12 x s32>) = G_CONCAT_VECTORS [[COPY1]](<4 x s32>), [[COPY]](<4 x s32>), [[COPY1]](<4 x s32>)
189    ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<12 x s32>)
190    %0:_(<4 x s32>) = COPY $q0
191    %1:_(<4 x s32>) = COPY $q1
192    %2:_(<12 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(4,5,6,7,0,1,2,3,4,5,6,7)
193    RET_ReallyLR implicit %2
194...
195# Check that we canonicalize shuffle_vector(Src1, Src2, mask(4,5,undef,undef,0,1,2,3,undef,undef,6,7))
196# into concat_vector(Src2, Src1, Src2) with bigger vector type.
197---
198name: shuffle_vector_to_concat_vector_45undefundef0123undefundef67
199tracksRegLiveness: true
200body:             |
201  bb.1:
202    liveins: $q0, $q1
203
204    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_45undefundef0123undefundef67
205    ; CHECK: liveins: $q0, $q1
206    ; CHECK-NEXT: {{  $}}
207    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
208    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1
209    ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<12 x s32>) = G_CONCAT_VECTORS [[COPY1]](<4 x s32>), [[COPY]](<4 x s32>), [[COPY1]](<4 x s32>)
210    ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<12 x s32>)
211    %0:_(<4 x s32>) = COPY $q0
212    %1:_(<4 x s32>) = COPY $q1
213    %2:_(<12 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(4,5,-1,-1,0,1,2,3,-1,-1,6,7)
214    RET_ReallyLR implicit %2
215...
216# Check that we don't canonicalize shuffle_vector into concat_vectors
217# when the sources get half mixed with bigger vector type.
218---
219name: shuffle_vector_to_concat_vector_mixed_src_456000123_neg
220tracksRegLiveness: true
221body:             |
222  bb.1:
223    liveins: $q0, $q1
224
225    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_mixed_src_456000123_neg
226    ; CHECK: liveins: $q0, $q1
227    ; CHECK-NEXT: {{  $}}
228    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
229    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1
230    ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<8 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<4 x s32>), [[COPY1]], shufflemask(4, 5, 6, 0, 0, 1, 2, 3)
231    ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<8 x s32>)
232    %0:_(<4 x s32>) = COPY $q0
233    %1:_(<4 x s32>) = COPY $q1
234    %2:_(<8 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(4,5,6,0,0,1,2,3)
235    RET_ReallyLR implicit %2
236...
237# Check that we produce implicit_def while canonicalizing shuffle_vector(Src1, Src2, mask(2,undef,undef,undef,undef,1))
238# into concat_vector(Src2, undef, Src1) with bigger vector type.
239---
240name: shuffle_vector_to_concat_vector_45undefundefundefundefundefundefundefundef23
241tracksRegLiveness: true
242body:             |
243  bb.1:
244    liveins: $q0, $q1
245
246    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_45undefundefundefundefundefundefundefundef23
247    ; CHECK: liveins: $q0, $q1
248    ; CHECK-NEXT: {{  $}}
249    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
250    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1
251    ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
252    ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<12 x s32>) = G_CONCAT_VECTORS [[COPY1]](<4 x s32>), [[DEF]](<4 x s32>), [[COPY]](<4 x s32>)
253    ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<12 x s32>)
254    %0:_(<4 x s32>) = COPY $q0
255    %1:_(<4 x s32>) = COPY $q1
256    %2:_(<12 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(4,5,-1,-1,-1,-1,-1,-1,-1,-1,2,3)
257    RET_ReallyLR implicit %2
258...
259# Check that we don't canonicalize shuffle_vector into concat_vectors
260# when we grab less than the full vectors.
261---
262name: shuffle_vector_to_concat_vector_4501_neg
263tracksRegLiveness: true
264body:             |
265  bb.1:
266    liveins: $q0, $q1
267
268    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_4501_neg
269    ; CHECK: liveins: $q0, $q1
270    ; CHECK-NEXT: {{  $}}
271    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
272    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1
273    ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<4 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<4 x s32>), [[COPY1]], shufflemask(4, 5, 0, 1)
274    ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<4 x s32>)
275    %0:_(<4 x s32>) = COPY $q0
276    %1:_(<4 x s32>) = COPY $q1
277    %2:_(<4 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(4,5,0,1)
278    RET_ReallyLR implicit %2
279...
280# Check that we don't canonicalize shuffle_vector into concat_vectors
281# if a source is flipped and the other half is undef with bigger vector.
282---
283name: shuffle_vector_to_concat_vector_src_flipped_4567012367undefundef_neg
284tracksRegLiveness: true
285body:             |
286  bb.1:
287    liveins: $q0, $q1
288
289    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_src_flipped_4567012367undefundef_neg
290    ; CHECK: liveins: $q0, $q1
291    ; CHECK-NEXT: {{  $}}
292    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0
293    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x s32>) = COPY $q1
294    ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<12 x s32>) = G_SHUFFLE_VECTOR [[COPY]](<4 x s32>), [[COPY1]], shufflemask(4, 5, 6, 7, 0, 1, 2, 3, 6, 7, undef, undef)
295    ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<12 x s32>)
296    %0:_(<4 x s32>) = COPY $q0
297    %1:_(<4 x s32>) = COPY $q1
298    %2:_(<12 x s32>) = G_SHUFFLE_VECTOR %0(<4 x s32>), %1(<4 x s32>), shufflemask(4,5,6,7,0,1,2,3,6,7,-1,-1)
299    RET_ReallyLR implicit %2
300...
301# Check that we canonicalize shuffle_vector(Src1, Src2, mask(4,5,undef,undef,0,1,2,3,undef,undef,6,7))
302# into concat_vector(Src2, Src1, Src2) with vector of pointers.
303---
304name: shuffle_vector_to_concat_vector_45undefundef0123undefundef67_ptr
305tracksRegLiveness: true
306body:             |
307  bb.1:
308    liveins: $q0_q1, $q2_q3
309
310    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_45undefundef0123undefundef67_ptr
311    ; CHECK: liveins: $q0_q1, $q2_q3
312    ; CHECK-NEXT: {{  $}}
313    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x p0>) = COPY $q0_q1
314    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x p0>) = COPY $q2_q3
315    ; CHECK-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<12 x p0>) = G_CONCAT_VECTORS [[COPY1]](<4 x p0>), [[COPY]](<4 x p0>), [[COPY1]](<4 x p0>)
316    ; CHECK-NEXT: RET_ReallyLR implicit [[CONCAT_VECTORS]](<12 x p0>)
317    %0:_(<4 x p0>) = COPY $q0_q1
318    %1:_(<4 x p0>) = COPY $q2_q3
319    %2:_(<12 x p0>) = G_SHUFFLE_VECTOR %0(<4 x p0>), %1(<4 x p0>), shufflemask(4,5,-1,-1,0,1,2,3,-1,-1,6,7)
320    RET_ReallyLR implicit %2
321...
322# Check that we don't canonicalize shuffle_vector into concat_vectors
323# when the sources get half mixed with vector of pointers.
324---
325name: shuffle_vector_to_concat_vector_mixed_src_456000123_neg_ptr
326tracksRegLiveness: true
327body:             |
328  bb.1:
329    liveins: $q0_q1, $q2_q3
330
331    ; CHECK-LABEL: name: shuffle_vector_to_concat_vector_mixed_src_456000123_neg_ptr
332    ; CHECK: liveins: $q0_q1, $q2_q3
333    ; CHECK-NEXT: {{  $}}
334    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x p0>) = COPY $q0_q1
335    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<4 x p0>) = COPY $q2_q3
336    ; CHECK-NEXT: [[SHUF:%[0-9]+]]:_(<8 x p0>) = G_SHUFFLE_VECTOR [[COPY]](<4 x p0>), [[COPY1]], shufflemask(4, 5, 6, 0, 0, 1, 2, 3)
337    ; CHECK-NEXT: RET_ReallyLR implicit [[SHUF]](<8 x p0>)
338    %0:_(<4 x p0>) = COPY $q0_q1
339    %1:_(<4 x p0>) = COPY $q2_q3
340    %2:_(<8 x p0>) = G_SHUFFLE_VECTOR %0(<4 x p0>), %1(<4 x p0>), shufflemask(4,5,6,0,0,1,2,3)
341    RET_ReallyLR implicit %2
342...
343
344# Check that shuffle_vector gets combined into concat_vectors then the
345# concat_vectors gets combined into build_vector.
346---
347name: shuffle_vector_to_build_vector_ptr
348tracksRegLiveness: true
349body:             |
350  bb.1:
351    liveins: $x0, $x1, $x2, $x3
352
353    ; CHECK-LABEL: name: shuffle_vector_to_build_vector_ptr
354    ; CHECK: liveins: $x0, $x1, $x2, $x3
355    ; CHECK-NEXT: {{  $}}
356    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
357    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
358    ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $x2
359    ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(p0) = COPY $x3
360    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x p0>) = G_BUILD_VECTOR [[COPY]](p0), [[COPY1]](p0), [[COPY2]](p0), [[COPY3]](p0)
361    ; CHECK-NEXT: RET_ReallyLR implicit [[BUILD_VECTOR]](<4 x p0>)
362    %0:_(p0) = COPY $x0
363    %1:_(p0) = COPY $x1
364    %2:_(p0) = COPY $x2
365    %3:_(p0) = COPY $x3
366    %4:_(<2 x p0>) = G_BUILD_VECTOR %0(p0), %1
367    %5:_(<2 x p0>) = G_BUILD_VECTOR %2(p0), %3
368    %6:_(<4 x p0>) = G_SHUFFLE_VECTOR %4(<2 x p0>), %5(<2 x p0>), shufflemask(0,1,2,3)
369    RET_ReallyLR implicit %6
370...
371
372# Check that shuffle_vector on scalars gets combined into build_vector.
373---
374name: shuffle_vector_on_scalars_to_build_vector_ptr
375tracksRegLiveness: true
376body:             |
377  bb.1:
378    liveins: $x0, $x1
379
380    ; CHECK-LABEL: name: shuffle_vector_on_scalars_to_build_vector_ptr
381    ; CHECK: liveins: $x0, $x1
382    ; CHECK-NEXT: {{  $}}
383    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
384    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
385    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x p0>) = G_BUILD_VECTOR [[COPY]](p0), [[COPY1]](p0), [[COPY]](p0), [[COPY1]](p0)
386    ; CHECK-NEXT: RET_ReallyLR implicit [[BUILD_VECTOR]](<4 x p0>)
387    %0:_(p0) = COPY $x0
388    %1:_(p0) = COPY $x1
389    %6:_(<4 x p0>) = G_SHUFFLE_VECTOR %0, %1, shufflemask(0,1,0,1)
390    RET_ReallyLR implicit %6
391...
392
393# Check that shuffle_vector on scalars gets combined into build_vector,
394# even if we swap the order of the operands.
395---
396name: shuffle_vector_on_scalars_to_build_vector_swap_ptr
397tracksRegLiveness: true
398body:             |
399  bb.1:
400    liveins: $x0, $x1
401
402    ; CHECK-LABEL: name: shuffle_vector_on_scalars_to_build_vector_swap_ptr
403    ; CHECK: liveins: $x0, $x1
404    ; CHECK-NEXT: {{  $}}
405    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
406    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
407    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x p0>) = G_BUILD_VECTOR [[COPY1]](p0), [[COPY]](p0)
408    ; CHECK-NEXT: RET_ReallyLR implicit [[BUILD_VECTOR]](<2 x p0>)
409    %0:_(p0) = COPY $x0
410    %1:_(p0) = COPY $x1
411    %6:_(<2 x p0>) = G_SHUFFLE_VECTOR %0, %1, shufflemask(1,0)
412    RET_ReallyLR implicit %6
413...
414
415# Check that we properly use undef values when shuffle_vector
416# on scalars gets lowered to build_vector.
417---
418name: shuffle_vector_on_scalars_to_build_vector_with_undef
419tracksRegLiveness: true
420body:             |
421  bb.1:
422    liveins: $x0, $x1
423
424    ; CHECK-LABEL: name: shuffle_vector_on_scalars_to_build_vector_with_undef
425    ; CHECK: liveins: $x0, $x1
426    ; CHECK-NEXT: {{  $}}
427    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
428    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
429    ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF
430    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s64>) = G_BUILD_VECTOR [[COPY]](s64), [[DEF]](s64), [[DEF]](s64), [[COPY1]](s64)
431    ; CHECK-NEXT: RET_ReallyLR implicit [[BUILD_VECTOR]](<4 x s64>)
432    %0:_(s64) = COPY $x0
433    %1:_(s64) = COPY $x1
434    %6:_(<4 x s64>) = G_SHUFFLE_VECTOR %0, %1, shufflemask(0,-1,-1,1)
435    RET_ReallyLR implicit %6
436...
437
438# Check that shuffle_vector on scalars gets combined into a plain
439# copy when the resulting type is a scalar as well and the sizes
440# are compatible.
441---
442name: shuffle_vector_on_scalars_to_copy_ptr
443tracksRegLiveness: true
444body:             |
445  bb.1:
446    liveins: $x0
447
448    ; CHECK-LABEL: name: shuffle_vector_on_scalars_to_copy_ptr
449    ; CHECK: liveins: $x0
450    ; CHECK-NEXT: {{  $}}
451    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
452    ; CHECK-NEXT: RET_ReallyLR implicit [[COPY]](p0)
453    %0:_(p0) = COPY $x0
454    %6:_(p0) = G_SHUFFLE_VECTOR %0, %0, shufflemask(0)
455    RET_ReallyLR implicit %6
456...
457---
458name: shuffle_vector_to_copy_lhs
459tracksRegLiveness: true
460body:             |
461  bb.1:
462    liveins: $x0, $x1
463
464    ; CHECK-LABEL: name: shuffle_vector_to_copy_lhs
465    ; CHECK: liveins: $x0, $x1
466    ; CHECK-NEXT: {{  $}}
467    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $x0
468    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
469    ; CHECK-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[COPY]](<2 x s32>), [[C]](s64)
470    ; CHECK-NEXT: RET_ReallyLR implicit [[EVEC]](s32)
471    %0:_(<2 x s32>) = COPY $x0
472    %1:_(<2 x s32>) = COPY $x1
473    %6:_(s32) = G_SHUFFLE_VECTOR %0, %1, shufflemask(1)
474    RET_ReallyLR implicit %6
475...
476---
477name: shuffle_vector_to_copy_rhs
478tracksRegLiveness: true
479body:             |
480  bb.1:
481    liveins: $x0, $x1
482
483    ; CHECK-LABEL: name: shuffle_vector_to_copy_rhs
484    ; CHECK: liveins: $x0, $x1
485    ; CHECK-NEXT: {{  $}}
486    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $x1
487    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
488    ; CHECK-NEXT: [[EVEC:%[0-9]+]]:_(s32) = G_EXTRACT_VECTOR_ELT [[COPY]](<2 x s32>), [[C]](s64)
489    ; CHECK-NEXT: RET_ReallyLR implicit [[EVEC]](s32)
490    %0:_(<2 x s32>) = COPY $x0
491    %1:_(<2 x s32>) = COPY $x1
492    %6:_(s32) = G_SHUFFLE_VECTOR %0, %1, shufflemask(2)
493    RET_ReallyLR implicit %6
494...
495---
496name: shuffle_vector_to_copy_undef
497tracksRegLiveness: true
498body:             |
499  bb.1:
500    liveins: $x0, $x1
501
502    ; CHECK-LABEL: name: shuffle_vector_to_copy_undef
503    ; CHECK: liveins: $x0, $x1
504    ; CHECK-NEXT: {{  $}}
505    ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
506    ; CHECK-NEXT: RET_ReallyLR implicit [[DEF]](s32)
507    %0:_(<2 x s32>) = COPY $x0
508    %1:_(<2 x s32>) = COPY $x1
509    %6:_(s32) = G_SHUFFLE_VECTOR %0, %1, shufflemask(-1)
510    RET_ReallyLR implicit %6
511...
512