xref: /llvm-project/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-extract.mir (revision 8871c3c562690347d75190be758312d1f92a7db4)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -O0 -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -run-pass=legalizer -global-isel-abort=0 %s -o - | FileCheck %s
3
4---
5name: extract_s32_merge_s64_s32_s32_offset0
6
7body: |
8  bb.0:
9    ; CHECK-LABEL: name: extract_s32_merge_s64_s32_s32_offset0
10    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
11    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY [[C]](s32)
12    ; CHECK-NEXT: $vgpr0 = COPY [[COPY]](s32)
13    %0:_(s32) = G_CONSTANT i32 0
14    %1:_(s32) = G_CONSTANT i32 1
15    %2:_(s64) = G_MERGE_VALUES %0, %1
16    %3:_(s32) = G_EXTRACT %2, 0
17    $vgpr0 = COPY %3
18...
19
20---
21name: extract_s32_merge_s64_s32_s32_offset32
22
23body: |
24  bb.0:
25    ; CHECK-LABEL: name: extract_s32_merge_s64_s32_s32_offset32
26    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
27    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY [[C]](s32)
28    ; CHECK-NEXT: $vgpr0 = COPY [[COPY]](s32)
29    %0:_(s32) = G_CONSTANT i32 0
30    %1:_(s32) = G_CONSTANT i32 1
31    %2:_(s64) = G_MERGE_VALUES %0, %1
32    %3:_(s32) = G_EXTRACT %2, 32
33    $vgpr0 = COPY %3
34...
35
36---
37name: extract_s64_merge_s128_s64_s64_offset0
38
39body: |
40  bb.0:
41    ; CHECK-LABEL: name: extract_s64_merge_s128_s64_s64_offset0
42    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
43    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[C]](s64)
44    ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[COPY]](s64)
45    %0:_(s64) = G_CONSTANT i64 0
46    %1:_(s64) = G_CONSTANT i64 1
47    %2:_(s128) = G_MERGE_VALUES %0, %1
48    %3:_(s64) = G_EXTRACT %2, 0
49    $vgpr0_vgpr1 = COPY %3
50...
51
52---
53name: extract_s64_merge_s128_s64_s64_offset64
54
55body: |
56  bb.0:
57    ; CHECK-LABEL: name: extract_s64_merge_s128_s64_s64_offset64
58    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
59    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[C]](s64)
60    ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[COPY]](s64)
61    %0:_(s64) = G_CONSTANT i64 0
62    %1:_(s64) = G_CONSTANT i64 1
63    %2:_(s128) = G_MERGE_VALUES %0, %1
64    %3:_(s64) = G_EXTRACT %2, 64
65    $vgpr0_vgpr1 = COPY %3
66...
67
68---
69name: extract_s32_merge_s128_s64_s64_offset0
70
71body: |
72  bb.0:
73    ; CHECK-LABEL: name: extract_s32_merge_s128_s64_s64_offset0
74    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
75    ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[C]](s64), 0
76    ; CHECK-NEXT: $vgpr0 = COPY [[EXTRACT]](s32)
77    %0:_(s64) = G_CONSTANT i64 0
78    %1:_(s64) = G_CONSTANT i64 1
79    %2:_(s128) = G_MERGE_VALUES %0, %1
80    %3:_(s32) = G_EXTRACT %2, 0
81    $vgpr0 = COPY %3
82...
83
84---
85name: extract_s32_merge_s128_s64_s64_offset32
86
87body: |
88  bb.0:
89    ; CHECK-LABEL: name: extract_s32_merge_s128_s64_s64_offset32
90    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
91    ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[C]](s64), 32
92    ; CHECK-NEXT: $vgpr0 = COPY [[EXTRACT]](s32)
93    %0:_(s64) = G_CONSTANT i64 0
94    %1:_(s64) = G_CONSTANT i64 1
95    %2:_(s128) = G_MERGE_VALUES %0, %1
96    %3:_(s32) = G_EXTRACT %2, 32
97    $vgpr0 = COPY %3
98...
99
100---
101name: extract_s32_merge_s128_s64_s64_offset64
102
103body: |
104  bb.0:
105    ; CHECK-LABEL: name: extract_s32_merge_s128_s64_s64_offset64
106    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
107    ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[C]](s64), 0
108    ; CHECK-NEXT: $vgpr0 = COPY [[EXTRACT]](s32)
109    %0:_(s64) = G_CONSTANT i64 0
110    %1:_(s64) = G_CONSTANT i64 1
111    %2:_(s128) = G_MERGE_VALUES %0, %1
112    %3:_(s32) = G_EXTRACT %2, 64
113    $vgpr0 = COPY %3
114...
115
116---
117name: extract_s32_merge_s128_s64_s64_offset96
118
119body: |
120  bb.0:
121    ; CHECK-LABEL: name: extract_s32_merge_s128_s64_s64_offset96
122    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
123    ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[C]](s64), 32
124    ; CHECK-NEXT: $vgpr0 = COPY [[EXTRACT]](s32)
125    %0:_(s64) = G_CONSTANT i64 0
126    %1:_(s64) = G_CONSTANT i64 1
127    %2:_(s128) = G_MERGE_VALUES %0, %1
128    %3:_(s32) = G_EXTRACT %2, 96
129    $vgpr0 = COPY %3
130...
131
132# Destination size fits, but is skewed from the start of the register.
133---
134name: extract_s16_merge_s128_s64_s64_offset18
135
136body: |
137  bb.0:
138    ; CHECK-LABEL: name: extract_s16_merge_s128_s64_s64_offset18
139    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
140    ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[C]](s64), 18
141    ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
142    ; CHECK-NEXT: $vgpr0 = COPY [[ANYEXT]](s32)
143    %0:_(s64) = G_CONSTANT i64 0
144    %1:_(s64) = G_CONSTANT i64 1
145    %2:_(s128) = G_MERGE_VALUES %0, %1
146    %3:_(s16) = G_EXTRACT %2, 18
147    %4:_(s32) = G_ANYEXT %3
148    $vgpr0 = COPY %4
149...
150
151# Destination size fits, but is skewed from the start of the register.
152---
153name: extract_s16_merge_s128_s64_s64_offset82
154
155body: |
156  bb.0:
157    ; CHECK-LABEL: name: extract_s16_merge_s128_s64_s64_offset82
158    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
159    ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[C]](s64), 18
160    ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
161    ; CHECK-NEXT: $vgpr0 = COPY [[ANYEXT]](s32)
162    %0:_(s64) = G_CONSTANT i64 0
163    %1:_(s64) = G_CONSTANT i64 1
164    %2:_(s128) = G_MERGE_VALUES %0, %1
165    %3:_(s16) = G_EXTRACT %2, 82
166    %4:_(s32) = G_ANYEXT %3
167    $vgpr0 = COPY %4
168...
169
170
171# Can't handle this since it spans two registers
172---
173name: extract_s64_merge_s128_s64_s64_offset32
174
175body: |
176  bb.0:
177    ; CHECK-LABEL: name: extract_s64_merge_s128_s64_s64_offset32
178    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
179    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
180    ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[C]](s64), [[C1]](s64)
181    ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s64) = G_EXTRACT [[MV]](s128), 32
182    ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[EXTRACT]](s64)
183    %0:_(s64) = G_CONSTANT i64 0
184    %1:_(s64) = G_CONSTANT i64 1
185    %2:_(s128) = G_MERGE_VALUES %0, %1
186    %3:_(s64) = G_EXTRACT %2, 32
187    $vgpr0_vgpr1 = COPY %3
188...
189
190
191# Only the last bit spans to another register
192---
193name: extract_s16_merge_s32_s32_offset1
194
195body: |
196  bb.0:
197    ; CHECK-LABEL: name: extract_s16_merge_s32_s32_offset1
198    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
199    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
200    ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[C]](s32), [[C1]](s32)
201    ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[MV]](s64), 1
202    ; CHECK-NEXT: $vgpr0 = COPY [[EXTRACT]](s32)
203    %0:_(s32) = G_CONSTANT i32 0
204    %1:_(s32) = G_CONSTANT i32 1
205    %2:_(s64) = G_MERGE_VALUES %0, %1
206    %3:_(s32) = G_EXTRACT %2, 1
207    $vgpr0 = COPY %3
208...
209
210
211# Test with some merges with 3 operands
212
213---
214name: extract_s32_merge_s96_s32_s32_s32_offset0
215
216body: |
217  bb.0:
218    ; CHECK-LABEL: name: extract_s32_merge_s96_s32_s32_s32_offset0
219    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
220    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY [[C]](s32)
221    ; CHECK-NEXT: $vgpr0 = COPY [[COPY]](s32)
222    %0:_(s32) = G_CONSTANT i32 0
223    %1:_(s32) = G_CONSTANT i32 1
224    %2:_(s32) = G_CONSTANT i32 1
225    %3:_(s96) = G_MERGE_VALUES %0, %1, %2
226    %4:_(s32) = G_EXTRACT %3, 0
227    $vgpr0 = COPY %4
228...
229
230---
231name: extract_s32_merge_s96_s32_s32_s32_offset64
232
233body: |
234  bb.0:
235    ; CHECK-LABEL: name: extract_s32_merge_s96_s32_s32_s32_offset64
236    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
237    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY [[C]](s32)
238    ; CHECK-NEXT: $vgpr0 = COPY [[COPY]](s32)
239    %0:_(s32) = G_CONSTANT i32 0
240    %1:_(s32) = G_CONSTANT i32 1
241    %2:_(s32) = G_CONSTANT i32 1
242    %3:_(s96) = G_MERGE_VALUES %0, %1, %2
243    %4:_(s32) = G_EXTRACT %3, 64
244    $vgpr0 = COPY %4
245...
246
247---
248name: extract_s64_merge_s96_s32_s32_s32_offset0
249
250body: |
251  bb.0:
252    ; CHECK-LABEL: name: extract_s64_merge_s96_s32_s32_s32_offset0
253    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
254    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
255    ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
256    ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s96) = G_MERGE_VALUES [[C]](s32), [[C1]](s32), [[C2]](s32)
257    ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s64) = G_EXTRACT [[MV]](s96), 0
258    ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[EXTRACT]](s64)
259    %0:_(s32) = G_CONSTANT i32 0
260    %1:_(s32) = G_CONSTANT i32 1
261    %2:_(s32) = G_CONSTANT i32 1
262    %3:_(s96) = G_MERGE_VALUES %0, %1, %2
263    %4:_(s64) = G_EXTRACT %3, 0
264    $vgpr0_vgpr1 = COPY %4
265...
266
267---
268name: extract_s64_merge_s96_s32_s32_s32_offset32
269
270body: |
271  bb.0:
272    ; CHECK-LABEL: name: extract_s64_merge_s96_s32_s32_s32_offset32
273    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
274    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
275    ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
276    ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s96) = G_MERGE_VALUES [[C]](s32), [[C1]](s32), [[C2]](s32)
277    ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s64) = G_EXTRACT [[MV]](s96), 32
278    ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[EXTRACT]](s64)
279    %0:_(s32) = G_CONSTANT i32 0
280    %1:_(s32) = G_CONSTANT i32 1
281    %2:_(s32) = G_CONSTANT i32 1
282    %3:_(s96) = G_MERGE_VALUES %0, %1, %2
283    %4:_(s64) = G_EXTRACT %3, 32
284    $vgpr0_vgpr1 = COPY %4
285...
286
287# Test build_vector sources
288---
289name: extract_s64_build_vector_v2s64_s64_s64_offset0
290
291body: |
292  bb.0:
293    ; CHECK-LABEL: name: extract_s64_build_vector_v2s64_s64_s64_offset0
294    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
295    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[C]](s64)
296    ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[COPY]](s64)
297    %0:_(s64) = G_CONSTANT i64 0
298    %1:_(s64) = G_CONSTANT i64 1
299    %2:_(<2 x s64>) = G_BUILD_VECTOR %0, %1
300    %3:_(s64) = G_EXTRACT %2, 0
301    $vgpr0_vgpr1 = COPY %3
302...
303
304---
305name: extract_s64_build_vector_v2s64_s64_s64_offset64
306
307body: |
308  bb.0:
309    ; CHECK-LABEL: name: extract_s64_build_vector_v2s64_s64_s64_offset64
310    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
311    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY [[C]](s64)
312    ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[COPY]](s64)
313    %0:_(s64) = G_CONSTANT i64 0
314    %1:_(s64) = G_CONSTANT i64 1
315    %2:_(<2 x s64>) = G_BUILD_VECTOR %0, %1
316    %3:_(s64) = G_EXTRACT %2, 64
317    $vgpr0_vgpr1 = COPY %3
318...
319
320---
321name: extract_s64_build_vector_v2s64_s64_s64_offset32
322
323body: |
324  bb.0:
325    ; CHECK-LABEL: name: extract_s64_build_vector_v2s64_s64_s64_offset32
326    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
327    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
328    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[C]](s64), [[C1]](s64)
329    ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(s128) = G_BITCAST [[BUILD_VECTOR]](<2 x s64>)
330    ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[BITCAST]](s128)
331    ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 32
332    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[UV]], [[C2]](s32)
333    ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[UV1]], [[C2]](s32)
334    ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s64) = G_OR [[LSHR]], [[SHL]]
335    ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[OR]](s64)
336    %0:_(s64) = G_CONSTANT i64 0
337    %1:_(s64) = G_CONSTANT i64 1
338    %2:_(<2 x s64>) = G_BUILD_VECTOR %0, %1
339    %3:_(s64) = G_EXTRACT %2, 32
340    $vgpr0_vgpr1 = COPY %3
341...
342
343# Test extracting something smaller than the element size
344---
345name: extract_s32_build_vector_v2s64_s64_s64_offset64
346
347body: |
348  bb.0:
349    ; CHECK-LABEL: name: extract_s32_build_vector_v2s64_s64_s64_offset64
350    ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
351    ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[C]](s64), 0
352    ; CHECK-NEXT: $vgpr0 = COPY [[EXTRACT]](s32)
353    %0:_(s64) = G_CONSTANT i64 0
354    %1:_(s64) = G_CONSTANT i64 1
355    %2:_(<2 x s64>) = G_BUILD_VECTOR %0, %1
356    %3:_(s32) = G_EXTRACT %2, 64
357    $vgpr0 = COPY %3
358
359...
360
361# Test concat_vector sources
362---
363name: extract_v2s16_build_vector_v2s64_v2s16_v2s16_offset0
364
365body: |
366  bb.0:
367    liveins: $vgpr0, $vgpr1
368    ; CHECK-LABEL: name: extract_v2s16_build_vector_v2s64_v2s16_v2s16_offset0
369    ; CHECK: liveins: $vgpr0, $vgpr1
370    ; CHECK-NEXT: {{  $}}
371    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
372    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s16>) = COPY [[COPY]](<2 x s16>)
373    ; CHECK-NEXT: $vgpr0 = COPY [[COPY1]](<2 x s16>)
374    %0:_(<2 x s16>) = COPY $vgpr0
375    %1:_(<2 x s16>) = COPY $vgpr1
376    %2:_(<4 x s16>) = G_CONCAT_VECTORS %0, %1
377    %3:_(<2 x s16>) = G_EXTRACT %2, 0
378    $vgpr0 = COPY %3
379...
380
381---
382name: extract_v2s16_build_vector_v2s64_v2s16_v2s16_offset32
383
384body: |
385  bb.0:
386    liveins: $vgpr0, $vgpr1
387    ; CHECK-LABEL: name: extract_v2s16_build_vector_v2s64_v2s16_v2s16_offset32
388    ; CHECK: liveins: $vgpr0, $vgpr1
389    ; CHECK-NEXT: {{  $}}
390    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr1
391    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s16>) = COPY [[COPY]](<2 x s16>)
392    ; CHECK-NEXT: $vgpr0 = COPY [[COPY1]](<2 x s16>)
393    %0:_(<2 x s16>) = COPY $vgpr0
394    %1:_(<2 x s16>) = COPY $vgpr1
395    %2:_(<4 x s16>) = G_CONCAT_VECTORS %0, %1
396    %3:_(<2 x s16>) = G_EXTRACT %2, 32
397    $vgpr0 = COPY %3
398...
399
400# Test extracting only a single element, not a subvector
401---
402name: extract_s16_build_vector_v2s64_v2s16_v2s16_offset32
403
404body: |
405  bb.0:
406    liveins: $vgpr0, $vgpr1
407    ; CHECK-LABEL: name: extract_s16_build_vector_v2s64_v2s16_v2s16_offset32
408    ; CHECK: liveins: $vgpr0, $vgpr1
409    ; CHECK-NEXT: {{  $}}
410    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr1
411    ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[COPY]](<2 x s16>)
412    ; CHECK-NEXT: $vgpr0 = COPY [[BITCAST]](s32)
413    %0:_(<2 x s16>) = COPY $vgpr0
414    %1:_(<2 x s16>) = COPY $vgpr1
415    %2:_(<4 x s16>) = G_CONCAT_VECTORS %0, %1
416    %3:_(s16) = G_EXTRACT %2, 32
417    %4:_(s32) = G_ANYEXT %3
418    $vgpr0 = COPY %4
419...
420
421---
422name: extract_s16_build_vector_v2s64_v2s16_v2s16_offset48
423
424body: |
425  bb.0:
426    liveins: $vgpr0, $vgpr1
427    ; CHECK-LABEL: name: extract_s16_build_vector_v2s64_v2s16_v2s16_offset48
428    ; CHECK: liveins: $vgpr0, $vgpr1
429    ; CHECK-NEXT: {{  $}}
430    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr1
431    ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[COPY]](<2 x s16>)
432    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
433    ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BITCAST]], [[C]](s32)
434    ; CHECK-NEXT: $vgpr0 = COPY [[LSHR]](s32)
435    %0:_(<2 x s16>) = COPY $vgpr0
436    %1:_(<2 x s16>) = COPY $vgpr1
437    %2:_(<4 x s16>) = G_CONCAT_VECTORS %0, %1
438    %3:_(s16) = G_EXTRACT %2, 48
439    %4:_(s32) = G_ANYEXT %3
440    $vgpr0 = COPY %4
441...
442
443# Test extracting less than an element
444---
445name: extract_s8_build_vector_v2s64_v2s16_v2s16_offset48
446
447body: |
448  bb.0:
449    liveins: $vgpr0, $vgpr1
450    ; CHECK-LABEL: name: extract_s8_build_vector_v2s64_v2s16_v2s16_offset48
451    ; CHECK: liveins: $vgpr0, $vgpr1
452    ; CHECK-NEXT: {{  $}}
453    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr1
454    ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s8) = G_EXTRACT [[COPY]](<2 x s16>), 16
455    ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s8)
456    ; CHECK-NEXT: $vgpr0 = COPY [[ANYEXT]](s32)
457    %0:_(<2 x s16>) = COPY $vgpr0
458    %1:_(<2 x s16>) = COPY $vgpr1
459    %2:_(<4 x s16>) = G_CONCAT_VECTORS %0, %1
460    %3:_(s8) = G_EXTRACT %2, 48
461    %4:_(s32) = G_ANYEXT %3
462    $vgpr0 = COPY %4
463...
464