• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=aarch64 -run-pass=aarch64-postlegalizer-lowering -verify-machineinstrs %s -o - | FileCheck %s
3
4---
5name:            splat_4xi32
6alignment:       4
7legalized:       true
8tracksRegLiveness: true
9body:             |
10  bb.1.entry:
11    liveins: $w0
12
13    ; CHECK-LABEL: name: splat_4xi32
14    ; CHECK: liveins: $w0
15    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
16    ; CHECK: [[DUP:%[0-9]+]]:_(<4 x s32>) = G_DUP [[COPY]](s32)
17    ; CHECK: $q0 = COPY [[DUP]](<4 x s32>)
18    ; CHECK: RET_ReallyLR implicit $q0
19    %0:_(s32) = COPY $w0
20    %2:_(<4 x s32>) = G_IMPLICIT_DEF
21    %3:_(s32) = G_CONSTANT i32 0
22    %1:_(<4 x s32>) = G_INSERT_VECTOR_ELT %2, %0(s32), %3(s32)
23    %4:_(<4 x s32>) = G_SHUFFLE_VECTOR %1(<4 x s32>), %2, shufflemask(0, 0, 0, 0)
24    $q0 = COPY %4(<4 x s32>)
25    RET_ReallyLR implicit $q0
26
27...
28---
29name:            splat_2xi64
30alignment:       4
31legalized:       true
32tracksRegLiveness: true
33body:             |
34  bb.1.entry:
35    liveins: $x0
36
37    ; CHECK-LABEL: name: splat_2xi64
38    ; CHECK: liveins: $x0
39    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
40    ; CHECK: [[DUP:%[0-9]+]]:_(<2 x s64>) = G_DUP [[COPY]](s64)
41    ; CHECK: $q0 = COPY [[DUP]](<2 x s64>)
42    ; CHECK: RET_ReallyLR implicit $q0
43    %0:_(s64) = COPY $x0
44    %2:_(<2 x s64>) = G_IMPLICIT_DEF
45    %3:_(s32) = G_CONSTANT i32 0
46    %1:_(<2 x s64>) = G_INSERT_VECTOR_ELT %2, %0(s64), %3(s32)
47    %4:_(<2 x s64>) = G_SHUFFLE_VECTOR %1(<2 x s64>), %2, shufflemask(0, 0)
48    $q0 = COPY %4(<2 x s64>)
49    RET_ReallyLR implicit $q0
50
51...
52---
53name:            splat_2xi32
54alignment:       4
55legalized:       true
56tracksRegLiveness: true
57body:             |
58  bb.1.entry:
59    liveins: $w0
60
61    ; CHECK-LABEL: name: splat_2xi32
62    ; CHECK: liveins: $w0
63    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
64    ; CHECK: [[DUP:%[0-9]+]]:_(<2 x s32>) = G_DUP [[COPY]](s32)
65    ; CHECK: $d0 = COPY [[DUP]](<2 x s32>)
66    ; CHECK: RET_ReallyLR implicit $d0
67    %0:_(s32) = COPY $w0
68    %2:_(<2 x s32>) = G_IMPLICIT_DEF
69    %3:_(s32) = G_CONSTANT i32 0
70    %1:_(<2 x s32>) = G_INSERT_VECTOR_ELT %2, %0(s32), %3(s32)
71    %4:_(<2 x s32>) = G_SHUFFLE_VECTOR %1(<2 x s32>), %2, shufflemask(0, 0)
72    $d0 = COPY %4(<2 x s32>)
73    RET_ReallyLR implicit $d0
74
75...
76---
77name:            splat_4xf32
78alignment:       4
79legalized:       true
80tracksRegLiveness: true
81body:             |
82  bb.1.entry:
83    liveins: $s0
84
85    ; CHECK-LABEL: name: splat_4xf32
86    ; CHECK: liveins: $s0
87    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $s0
88    ; CHECK: [[DUP:%[0-9]+]]:_(<4 x s32>) = G_DUP [[COPY]](s32)
89    ; CHECK: $q0 = COPY [[DUP]](<4 x s32>)
90    ; CHECK: RET_ReallyLR implicit $q0
91    %0:_(s32) = COPY $s0
92    %2:_(<4 x s32>) = G_IMPLICIT_DEF
93    %3:_(s32) = G_CONSTANT i32 0
94    %1:_(<4 x s32>) = G_INSERT_VECTOR_ELT %2, %0(s32), %3(s32)
95    %4:_(<4 x s32>) = G_SHUFFLE_VECTOR %1(<4 x s32>), %2, shufflemask(0, 0, 0, 0)
96    $q0 = COPY %4(<4 x s32>)
97    RET_ReallyLR implicit $q0
98
99...
100---
101name:            splat_2xf64
102alignment:       4
103legalized:       true
104tracksRegLiveness: true
105body:             |
106  bb.1.entry:
107    liveins: $d0
108
109    ; CHECK-LABEL: name: splat_2xf64
110    ; CHECK: liveins: $d0
111    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $d0
112    ; CHECK: [[DUP:%[0-9]+]]:_(<2 x s64>) = G_DUP [[COPY]](s64)
113    ; CHECK: $q0 = COPY [[DUP]](<2 x s64>)
114    ; CHECK: RET_ReallyLR implicit $q0
115    %0:_(s64) = COPY $d0
116    %2:_(<2 x s64>) = G_IMPLICIT_DEF
117    %3:_(s32) = G_CONSTANT i32 0
118    %1:_(<2 x s64>) = G_INSERT_VECTOR_ELT %2, %0(s64), %3(s32)
119    %4:_(<2 x s64>) = G_SHUFFLE_VECTOR %1(<2 x s64>), %2, shufflemask(0, 0)
120    $q0 = COPY %4(<2 x s64>)
121    RET_ReallyLR implicit $q0
122
123...
124---
125name:            splat_2xf32
126alignment:       4
127legalized:       true
128tracksRegLiveness: true
129body:             |
130  bb.1.entry:
131    liveins: $s0
132
133    ; CHECK-LABEL: name: splat_2xf32
134    ; CHECK: liveins: $s0
135    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $s0
136    ; CHECK: [[DUP:%[0-9]+]]:_(<2 x s32>) = G_DUP [[COPY]](s32)
137    ; CHECK: $d0 = COPY [[DUP]](<2 x s32>)
138    ; CHECK: RET_ReallyLR implicit $d0
139    %0:_(s32) = COPY $s0
140    %2:_(<2 x s32>) = G_IMPLICIT_DEF
141    %3:_(s32) = G_CONSTANT i32 0
142    %1:_(<2 x s32>) = G_INSERT_VECTOR_ELT %2, %0(s32), %3(s32)
143    %4:_(<2 x s32>) = G_SHUFFLE_VECTOR %1(<2 x s32>), %2, shufflemask(0, 0)
144    $d0 = COPY %4(<2 x s32>)
145    RET_ReallyLR implicit $d0
146
147...
148---
149name:            splat_2xf64_copies
150alignment:       4
151legalized:       true
152tracksRegLiveness: true
153body:             |
154  bb.1.entry:
155    liveins: $d0
156
157    ; This test is exactly the same as splat_2xf64, except it adds two copies.
158    ; These copies shouldn't get in the way of matching the dup pattern.
159    ; CHECK-LABEL: name: splat_2xf64_copies
160    ; CHECK: liveins: $d0
161    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $d0
162    ; CHECK: [[DUP:%[0-9]+]]:_(<2 x s64>) = G_DUP [[COPY]](s64)
163    ; CHECK: $q0 = COPY [[DUP]](<2 x s64>)
164    ; CHECK: RET_ReallyLR implicit $q0
165    %0:_(s64) = COPY $d0
166    %2:_(<2 x s64>) = G_IMPLICIT_DEF
167    %6:_(<2 x s64>) = COPY %2
168    %3:_(s32) = G_CONSTANT i32 0
169    %1:_(<2 x s64>) = G_INSERT_VECTOR_ELT %6, %0(s64), %3(s32)
170    %7:_(<2 x s64>) = COPY %1
171    %4:_(<2 x s64>) = G_SHUFFLE_VECTOR %7(<2 x s64>), %2, shufflemask(0, 0)
172    $q0 = COPY %4(<2 x s64>)
173    RET_ReallyLR implicit $q0
174
175...
176---
177name:            not_all_zeros
178alignment:       4
179legalized:       true
180tracksRegLiveness: true
181body:             |
182  bb.1.entry:
183    liveins: $x0
184    ; Make sure that we don't do the optimization when it's not all zeroes.
185    ; CHECK-LABEL: name: not_all_zeros
186    ; CHECK: liveins: $x0
187    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
188    ; CHECK: [[DEF:%[0-9]+]]:_(<2 x s64>) = G_IMPLICIT_DEF
189    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
190    ; CHECK: [[IVEC:%[0-9]+]]:_(<2 x s64>) = G_INSERT_VECTOR_ELT [[DEF]], [[COPY]](s64), [[C]](s32)
191    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
192    ; CHECK: [[EXT:%[0-9]+]]:_(<2 x s64>) = G_EXT [[IVEC]], [[DEF]], [[C1]](s32)
193    ; CHECK: $q0 = COPY [[EXT]](<2 x s64>)
194    ; CHECK: RET_ReallyLR implicit $q0
195    %0:_(s64) = COPY $x0
196    %2:_(<2 x s64>) = G_IMPLICIT_DEF
197    %3:_(s32) = G_CONSTANT i32 0
198    %1:_(<2 x s64>) = G_INSERT_VECTOR_ELT %2, %0(s64), %3(s32)
199    %4:_(<2 x s64>) = G_SHUFFLE_VECTOR %1(<2 x s64>), %2, shufflemask(0, 1)
200    $q0 = COPY %4(<2 x s64>)
201    RET_ReallyLR implicit $q0
202
203...
204---
205name:            all_undef
206alignment:       4
207legalized:       true
208tracksRegLiveness: true
209body:             |
210  bb.1.entry:
211    liveins: $x0
212    ; If all the elements are undefined, we consider it a splat. In this case,
213    ; we can choose 0 as our index.
214    ;
215    ; We should get a G_DUP here.
216    ;
217    ; CHECK-LABEL: name: all_undef
218    ; CHECK: liveins: $x0
219    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
220    ; CHECK: [[DUP:%[0-9]+]]:_(<2 x s64>) = G_DUP [[COPY]](s64)
221    ; CHECK: $q0 = COPY [[DUP]](<2 x s64>)
222    ; CHECK: RET_ReallyLR implicit $q0
223    %0:_(s64) = COPY $x0
224    %2:_(<2 x s64>) = G_IMPLICIT_DEF
225    %3:_(s32) = G_CONSTANT i32 0
226    %1:_(<2 x s64>) = G_INSERT_VECTOR_ELT %2, %0(s64), %3(s32)
227    %4:_(<2 x s64>) = G_SHUFFLE_VECTOR %1(<2 x s64>), %2, shufflemask(-1, -1)
228    $q0 = COPY %4(<2 x s64>)
229    RET_ReallyLR implicit $q0
230
231...
232---
233name:            one_undef
234alignment:       4
235legalized:       true
236tracksRegLiveness: true
237body:             |
238  bb.1.entry:
239    liveins: $s0
240    ; Make sure we can skip past undef values.
241    ;
242    ; We should get a G_DUP here.
243    ;
244    ; CHECK-LABEL: name: one_undef
245    ; CHECK: liveins: $s0
246    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $s0
247    ; CHECK: [[DUP:%[0-9]+]]:_(<4 x s32>) = G_DUP [[COPY]](s32)
248    ; CHECK: $q0 = COPY [[DUP]](<4 x s32>)
249    ; CHECK: RET_ReallyLR implicit $q0
250    %0:_(s32) = COPY $s0
251    %2:_(<4 x s32>) = G_IMPLICIT_DEF
252    %3:_(s32) = G_CONSTANT i32 0
253    %1:_(<4 x s32>) = G_INSERT_VECTOR_ELT %2, %0(s32), %3(s32)
254    %4:_(<4 x s32>) = G_SHUFFLE_VECTOR %1(<4 x s32>), %2, shufflemask(0, -1, 0, 0)
255    $q0 = COPY %4(<4 x s32>)
256    RET_ReallyLR implicit $q0
257
258...
259---
260name:            not_all_zeros_with_undefs
261alignment:       4
262legalized:       true
263tracksRegLiveness: true
264body:             |
265  bb.1.entry:
266    liveins: $s0
267    ; Check a non-splat mask with an undef value. We shouldn't get a G_DUP here.
268    ;
269    ; CHECK-LABEL: name: not_all_zeros_with_undefs
270    ; CHECK: liveins: $s0
271    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $s0
272    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
273    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
274    ; CHECK: [[IVEC:%[0-9]+]]:_(<4 x s32>) = G_INSERT_VECTOR_ELT [[DEF]], [[COPY]](s32), [[C]](s32)
275    ; CHECK: [[SHUF:%[0-9]+]]:_(<4 x s32>) = G_SHUFFLE_VECTOR [[IVEC]](<4 x s32>), [[DEF]], shufflemask(undef, 0, 0, 3)
276    ; CHECK: $q0 = COPY [[SHUF]](<4 x s32>)
277    ; CHECK: RET_ReallyLR implicit $q0
278    %0:_(s32) = COPY $s0
279    %2:_(<4 x s32>) = G_IMPLICIT_DEF
280    %3:_(s32) = G_CONSTANT i32 0
281    %1:_(<4 x s32>) = G_INSERT_VECTOR_ELT %2, %0(s32), %3(s32)
282    %4:_(<4 x s32>) = G_SHUFFLE_VECTOR %1(<4 x s32>), %2, shufflemask(-1, 0, 0, 3)
283    $q0 = COPY %4(<4 x s32>)
284    RET_ReallyLR implicit $q0
285
286...
287---
288name:            splat_4xi16
289alignment:       4
290legalized:       true
291tracksRegLiveness: true
292body:             |
293  bb.1.entry:
294    liveins: $h0
295    ; CHECK-LABEL: name: splat_4xi16
296    ; CHECK: liveins: $h0
297    ; CHECK: %copy:_(s16) = COPY $h0
298    ; CHECK: %splat:_(<4 x s16>) = G_DUP %copy(s16)
299    ; CHECK: $d0 = COPY %splat(<4 x s16>)
300    ; CHECK: RET_ReallyLR implicit $d0
301    %copy:_(s16) = COPY $h0
302    %undef:_(<4 x s16>) = G_IMPLICIT_DEF
303    %cst:_(s32) = G_CONSTANT i32 0
304    %ins:_(<4 x s16>) = G_INSERT_VECTOR_ELT %undef, %copy(s16), %cst(s32)
305    %splat:_(<4 x s16>) = G_SHUFFLE_VECTOR %ins(<4 x s16>), %undef, shufflemask(0, 0, 0, 0)
306    $d0 = COPY %splat(<4 x s16>)
307    RET_ReallyLR implicit $d0
308
309...
310---
311name:            splat_8xi8
312alignment:       4
313legalized:       true
314tracksRegLiveness: true
315body:             |
316  bb.1.entry:
317    liveins: $w0
318    ; CHECK-LABEL: name: splat_8xi8
319    ; CHECK: liveins: $w0
320    ; CHECK: %copy:_(s32) = COPY $w0
321    ; CHECK: %splat:_(<8 x s8>) = G_DUP %copy(s32)
322    ; CHECK: $d0 = COPY %splat(<8 x s8>)
323    ; CHECK: RET_ReallyLR implicit $d0
324    %copy:_(s32) = COPY $w0
325    %undef:_(<8 x s8>) = G_IMPLICIT_DEF
326    %cst:_(s32) = G_CONSTANT i32 0
327    %ins:_(<8 x s8>) = G_INSERT_VECTOR_ELT %undef, %copy(s32), %cst(s32)
328    %splat:_(<8 x s8>) = G_SHUFFLE_VECTOR %ins(<8 x s8>), %undef, shufflemask(0, 0, 0, 0, 0, 0, 0, 0)
329    $d0 = COPY %splat(<8 x s8>)
330    RET_ReallyLR implicit $d0
331
332...
333---
334name:            build_vector
335alignment:       4
336legalized:       true
337tracksRegLiveness: true
338body:             |
339  bb.1.entry:
340    liveins: $w0, $w1, $w2, $w3
341    ; The G_SHUFFLE_VECTOR is fed by a G_BUILD_VECTOR, and the 0th input
342    ; operand is not a constant. We should get a G_DUP.
343    ;
344    ; CHECK-LABEL: name: build_vector
345    ; CHECK: liveins: $w0, $w1, $w2, $w3
346    ; CHECK: %lane:_(s32) = COPY $w0
347    ; CHECK: %shuf:_(<4 x s32>) = G_DUP %lane(s32)
348    ; CHECK: $q0 = COPY %shuf(<4 x s32>)
349    ; CHECK: RET_ReallyLR implicit $q0
350    %lane:_(s32) = COPY $w0
351    %b:_(s32) = COPY $w1
352    %c:_(s32) = COPY $w2
353    %d:_(s32) = COPY $w3
354    %undef:_(<4 x s32>) = G_IMPLICIT_DEF
355    %buildvec:_(<4 x s32>) = G_BUILD_VECTOR %lane, %b, %c, %d
356    %shuf:_(<4 x s32>) = G_SHUFFLE_VECTOR %buildvec(<4 x s32>), %undef, shufflemask(0, 0, 0, 0)
357    $q0 = COPY %shuf(<4 x s32>)
358    RET_ReallyLR implicit $q0
359