1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji -run-pass=legalizer -global-isel-abort=0 %s -o - | FileCheck %s
3
4---
5name: test_extract_s32_s64_offset0
6body: |
7  bb.0:
8    liveins: $vgpr0_vgpr1
9
10    ; CHECK-LABEL: name: test_extract_s32_s64_offset0
11    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
12    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s64), 0
13    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
14    %0:_(s64) = COPY $vgpr0_vgpr1
15    %1:_(s32) = G_EXTRACT %0, 0
16    $vgpr0 = COPY %1
17...
18---
19name: test_extract_s32_s64_offset32
20body: |
21  bb.0:
22    liveins: $vgpr0_vgpr1
23
24    ; CHECK-LABEL: name: test_extract_s32_s64_offset32
25    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
26    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s64), 32
27    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
28    %0:_(s64) = COPY $vgpr0_vgpr1
29    %1:_(s32) = G_EXTRACT %0, 32
30     $vgpr0 = COPY %1
31...
32
33---
34name: test_extract_s8_s15_offset0
35body: |
36  bb.0:
37    liveins: $vgpr0_vgpr1
38
39    ; CHECK-LABEL: name: test_extract_s8_s15_offset0
40    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
41    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
42    ; CHECK: $vgpr0 = COPY [[TRUNC]](s32)
43    %0:_(s64) = COPY $vgpr0_vgpr1
44    %1:_(s31) = G_TRUNC %0
45    %2:_(s8) = G_EXTRACT %1, 0
46    %3:_(s32) = G_ANYEXT %2
47    $vgpr0 = COPY %3
48...
49
50---
51name: test_extract_s16_s31_offset0
52body: |
53  bb.0:
54    liveins: $vgpr0_vgpr1
55
56    ; CHECK-LABEL: name: test_extract_s16_s31_offset0
57    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
58    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
59    ; CHECK: $vgpr0 = COPY [[TRUNC]](s32)
60    %0:_(s64) = COPY $vgpr0_vgpr1
61    %1:_(s31) = G_TRUNC %0
62    %2:_(s16) = G_EXTRACT %1, 0
63    %3:_(s32) = G_ANYEXT %2
64    $vgpr0 = COPY %3
65...
66
67---
68name: test_extract_s32_s48_offset0
69body: |
70  bb.0:
71    liveins: $vgpr0_vgpr1
72
73    ; CHECK-LABEL: name: test_extract_s32_s48_offset0
74    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
75    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s64), 0
76    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
77    %0:_(s64) = COPY $vgpr0_vgpr1
78    %1:_(s48) = G_TRUNC %0
79    %2:_(s32) = G_EXTRACT %1, 0
80    $vgpr0 = COPY %2
81...
82
83---
84name: test_extract_s32_s96_offset0
85body: |
86  bb.0:
87    liveins: $vgpr0_vgpr1_vgpr2
88
89    ; CHECK-LABEL: name: test_extract_s32_s96_offset0
90    ; CHECK: [[COPY:%[0-9]+]]:_(s96) = COPY $vgpr0_vgpr1_vgpr2
91    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s96), 0
92    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
93    %0:_(s96) = COPY $vgpr0_vgpr1_vgpr2
94    %1:_(s32) = G_EXTRACT %0, 0
95    $vgpr0 = COPY %1
96...
97---
98name: test_extract_s32_s96_offset32
99body: |
100  bb.0:
101    liveins: $vgpr0_vgpr1_vgpr2
102
103    ; CHECK-LABEL: name: test_extract_s32_s96_offset32
104    ; CHECK: [[COPY:%[0-9]+]]:_(s96) = COPY $vgpr0_vgpr1_vgpr2
105    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s96), 32
106    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
107    %0:_(s96) = COPY $vgpr0_vgpr1_vgpr2
108    %1:_(s32) = G_EXTRACT %0, 32
109    $vgpr0 = COPY %1
110...
111---
112name: test_extract_s32_s96_offset64
113body: |
114  bb.0:
115    liveins: $vgpr0_vgpr1_vgpr2
116
117    ; CHECK-LABEL: name: test_extract_s32_s96_offset64
118    ; CHECK: [[COPY:%[0-9]+]]:_(s96) = COPY $vgpr0_vgpr1_vgpr2
119    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s96), 64
120    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
121    %0:_(s96) = COPY $vgpr0_vgpr1_vgpr2
122    %1:_(s32) = G_EXTRACT %0, 64
123    $vgpr0 = COPY %1
124...
125---
126name: test_extract_s32_s128_offset0
127body: |
128  bb.0:
129    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
130
131    ; CHECK-LABEL: name: test_extract_s32_s128_offset0
132    ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
133    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s128), 0
134    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
135    %0:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
136    %1:_(s32) = G_EXTRACT %0, 0
137    $vgpr0 = COPY %1
138...
139---
140name: test_extract_s32_s128_offset32
141body: |
142  bb.0:
143    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
144
145    ; CHECK-LABEL: name: test_extract_s32_s128_offset32
146    ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
147    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s128), 32
148    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
149    %0:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
150    %1:_(s32) = G_EXTRACT %0, 32
151    $vgpr0 = COPY %1
152...
153---
154name: test_extract_s32_s128_offset64
155body: |
156  bb.0:
157    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
158
159    ; CHECK-LABEL: name: test_extract_s32_s128_offset64
160    ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
161    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s128), 64
162    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
163    %0:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
164    %1:_(s32) = G_EXTRACT %0, 64
165    $vgpr0 = COPY %1
166...
167---
168name: test_extract_s32_s128_offset96
169body: |
170  bb.0:
171    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
172
173    ; CHECK-LABEL: name: test_extract_s32_s128_offset96
174    ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
175    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s128), 96
176    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
177    %0:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
178    %1:_(s32) = G_EXTRACT %0, 96
179    $vgpr0 = COPY %1
180...
181
182---
183name: test_extract_s32_v2s32_offset0
184body: |
185  bb.0:
186    liveins: $vgpr0_vgpr1
187
188    ; CHECK-LABEL: name: test_extract_s32_v2s32_offset0
189    ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1
190    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](<2 x s32>), 0
191    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
192    %0:_(<2 x s32>) = COPY $vgpr0_vgpr1
193    %1:_(s32) = G_EXTRACT %0, 0
194    $vgpr0 = COPY %1
195...
196---
197name: test_extract_s32_v2s32_offset32
198body: |
199  bb.0:
200    liveins: $vgpr0_vgpr1
201
202    ; CHECK-LABEL: name: test_extract_s32_v2s32_offset32
203    ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1
204    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](<2 x s32>), 32
205    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
206    %0:_(<2 x s32>) = COPY $vgpr0_vgpr1
207    %1:_(s32) = G_EXTRACT %0, 32
208     $vgpr0 = COPY %1
209...
210---
211name: test_extract_s32_v3s32_offset0
212body: |
213  bb.0:
214    liveins: $vgpr0_vgpr1_vgpr2
215
216    ; CHECK-LABEL: name: test_extract_s32_v3s32_offset0
217    ; CHECK: [[COPY:%[0-9]+]]:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2
218    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](<3 x s32>), 0
219    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
220    %0:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2
221    %1:_(s32) = G_EXTRACT %0, 0
222    $vgpr0 = COPY %1
223...
224---
225name: test_extract_s32_v3s32_offset32
226body: |
227  bb.0:
228    liveins: $vgpr0_vgpr1_vgpr2
229
230    ; CHECK-LABEL: name: test_extract_s32_v3s32_offset32
231    ; CHECK: [[COPY:%[0-9]+]]:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2
232    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](<3 x s32>), 32
233    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
234    %0:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2
235    %1:_(s32) = G_EXTRACT %0, 32
236    $vgpr0 = COPY %1
237...
238---
239name: test_extract_s32_v3s32_offset64
240body: |
241  bb.0:
242    liveins: $vgpr0_vgpr1_vgpr2
243
244    ; CHECK-LABEL: name: test_extract_s32_v3s32_offset64
245    ; CHECK: [[COPY:%[0-9]+]]:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2
246    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](<3 x s32>), 64
247    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
248    %0:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2
249    %1:_(s32) = G_EXTRACT %0, 64
250    $vgpr0 = COPY %1
251...
252---
253name: test_extract_s32_v4s32_offset0
254body: |
255  bb.0:
256    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
257
258    ; CHECK-LABEL: name: test_extract_s32_v4s32_offset0
259    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
260    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](<4 x s32>), 0
261    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
262    %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
263    %1:_(s32) = G_EXTRACT %0, 0
264    $vgpr0 = COPY %1
265...
266---
267name: test_extract_s32_v4s32_offset32
268body: |
269  bb.0:
270    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
271
272    ; CHECK-LABEL: name: test_extract_s32_v4s32_offset32
273    ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
274    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s128), 32
275    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
276    %0:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
277    %1:_(s32) = G_EXTRACT %0, 32
278    $vgpr0 = COPY %1
279...
280---
281name: test_extract_s32_v4s32_offset64
282body: |
283  bb.0:
284    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
285
286    ; CHECK-LABEL: name: test_extract_s32_v4s32_offset64
287    ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
288    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s128), 64
289    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
290    %0:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
291    %1:_(s32) = G_EXTRACT %0, 64
292    $vgpr0 = COPY %1
293...
294---
295name: test_extract_s32_v4s32_offset96
296body: |
297  bb.0:
298    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
299
300    ; CHECK-LABEL: name: test_extract_s32_v4s32_offset96
301    ; CHECK: [[COPY:%[0-9]+]]:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
302    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[COPY]](s128), 96
303    ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
304    %0:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
305    %1:_(s32) = G_EXTRACT %0, 96
306    $vgpr0 = COPY %1
307...
308---
309name: test_extract_v2s32_v4s32_offset0
310body: |
311  bb.0:
312    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
313
314    ; CHECK-LABEL: name: test_extract_v2s32_v4s32_offset0
315    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
316    ; CHECK: [[EXTRACT:%[0-9]+]]:_(<2 x s32>) = G_EXTRACT [[COPY]](<4 x s32>), 0
317    ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](<2 x s32>)
318    %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
319    %1:_(<2 x s32>) = G_EXTRACT %0, 0
320    $vgpr0_vgpr1 = COPY %1
321...
322
323---
324name: test_extract_v2s32_v4s32_offset32
325body: |
326  bb.0:
327    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
328
329    ; CHECK-LABEL: name: test_extract_v2s32_v4s32_offset32
330    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
331    ; CHECK: [[EXTRACT:%[0-9]+]]:_(<2 x s32>) = G_EXTRACT [[COPY]](<4 x s32>), 32
332    ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](<2 x s32>)
333    %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
334    %1:_(<2 x s32>) = G_EXTRACT %0, 32
335    $vgpr0_vgpr1 = COPY %1
336...
337
338---
339name: test_extract_v2s32_v4s32_offset64
340body: |
341  bb.0:
342    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
343
344    ; CHECK-LABEL: name: test_extract_v2s32_v4s32_offset64
345    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
346    ; CHECK: [[EXTRACT:%[0-9]+]]:_(<2 x s32>) = G_EXTRACT [[COPY]](<4 x s32>), 64
347    ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](<2 x s32>)
348    %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
349    %1:_(<2 x s32>) = G_EXTRACT %0, 64
350    $vgpr0_vgpr1 = COPY %1
351...
352---
353name: test_extract_s64_v4s32_offset0
354body: |
355  bb.0:
356    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
357
358    ; CHECK-LABEL: name: test_extract_s64_v4s32_offset0
359    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
360    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s64) = G_EXTRACT [[COPY]](<4 x s32>), 0
361    ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](s64)
362    %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
363    %1:_(s64) = G_EXTRACT %0, 0
364    $vgpr0_vgpr1 = COPY %1
365...
366
367---
368name: test_extract_s64_v4s32_offset32
369body: |
370  bb.0:
371    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
372
373    ; CHECK-LABEL: name: test_extract_s64_v4s32_offset32
374    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
375    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s64) = G_EXTRACT [[COPY]](<4 x s32>), 32
376    ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](s64)
377    %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
378    %1:_(s64) = G_EXTRACT %0, 32
379    $vgpr0_vgpr1 = COPY %1
380...
381
382---
383name: test_extract_s64_v4s32_offset64
384body: |
385  bb.0:
386    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
387
388    ; CHECK-LABEL: name: test_extract_s64_v4s32_offset64
389    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
390    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s64) = G_EXTRACT [[COPY]](<4 x s32>), 64
391    ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](s64)
392    %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
393    %1:_(s64) = G_EXTRACT %0, 64
394    $vgpr0_vgpr1 = COPY %1
395...
396---
397name: test_extract_p0_v4s32_offset0
398body: |
399  bb.0:
400    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
401
402    ; CHECK-LABEL: name: test_extract_p0_v4s32_offset0
403    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
404    ; CHECK: [[EXTRACT:%[0-9]+]]:_(p0) = G_EXTRACT [[COPY]](<4 x s32>), 0
405    ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](p0)
406    %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
407    %1:_(p0) = G_EXTRACT %0, 0
408    $vgpr0_vgpr1 = COPY %1
409...
410
411---
412name: test_extract_p0_v4s32_offset32
413body: |
414  bb.0:
415    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
416
417    ; CHECK-LABEL: name: test_extract_p0_v4s32_offset32
418    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
419    ; CHECK: [[EXTRACT:%[0-9]+]]:_(p0) = G_EXTRACT [[COPY]](<4 x s32>), 32
420    ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](p0)
421    %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
422    %1:_(p0) = G_EXTRACT %0, 32
423    $vgpr0_vgpr1 = COPY %1
424...
425
426---
427name: test_extract_p0_v4s32_offset64
428body: |
429  bb.0:
430    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
431
432    ; CHECK-LABEL: name: test_extract_p0_v4s32_offset64
433    ; CHECK: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
434    ; CHECK: [[EXTRACT:%[0-9]+]]:_(p0) = G_EXTRACT [[COPY]](<4 x s32>), 64
435    ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](p0)
436    %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
437    %1:_(p0) = G_EXTRACT %0, 64
438    $vgpr0_vgpr1 = COPY %1
439...
440
441---
442name: extract_s8_v4s8_offset0
443body: |
444  bb.0:
445    ; CHECK-LABEL: name: extract_s8_v4s8_offset0
446    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
447    ; CHECK: [[UV:%[0-9]+]]:_(<2 x s32>), [[UV1:%[0-9]+]]:_(<2 x s32>) = G_UNMERGE_VALUES [[DEF]](<4 x s32>)
448    ; CHECK: [[TRUNC:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[UV]](<2 x s32>)
449    ; CHECK: [[TRUNC1:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[UV1]](<2 x s32>)
450    ; CHECK: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s16>) = G_CONCAT_VECTORS [[TRUNC]](<2 x s16>), [[TRUNC1]](<2 x s16>)
451    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[CONCAT_VECTORS]](<4 x s16>), 0
452    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
453    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
454    %0:_(<4 x s8>) = G_IMPLICIT_DEF
455    %1:_(s8) = G_EXTRACT %0, 0
456    %2:_(s32) = G_ANYEXT %1
457    $vgpr0 = COPY %2
458...
459
460---
461name: extract_s8_v4s8_offset8
462body: |
463  bb.0:
464    ; CHECK-LABEL: name: extract_s8_v4s8_offset8
465    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
466    ; CHECK: [[UV:%[0-9]+]]:_(<2 x s32>), [[UV1:%[0-9]+]]:_(<2 x s32>) = G_UNMERGE_VALUES [[DEF]](<4 x s32>)
467    ; CHECK: [[TRUNC:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[UV]](<2 x s32>)
468    ; CHECK: [[TRUNC1:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[UV1]](<2 x s32>)
469    ; CHECK: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s16>) = G_CONCAT_VECTORS [[TRUNC]](<2 x s16>), [[TRUNC1]](<2 x s16>)
470    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[CONCAT_VECTORS]](<4 x s16>), 16
471    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
472    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
473    %0:_(<4 x s8>) = G_IMPLICIT_DEF
474    %1:_(s8) = G_EXTRACT %0, 8
475    %2:_(s32) = G_ANYEXT %1
476    $vgpr0 = COPY %2
477...
478
479---
480name: extract_s8_v4s8_offset16
481body: |
482  bb.0:
483    ; CHECK-LABEL: name: extract_s8_v4s8_offset16
484    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
485    ; CHECK: [[UV:%[0-9]+]]:_(<2 x s32>), [[UV1:%[0-9]+]]:_(<2 x s32>) = G_UNMERGE_VALUES [[DEF]](<4 x s32>)
486    ; CHECK: [[TRUNC:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[UV]](<2 x s32>)
487    ; CHECK: [[TRUNC1:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[UV1]](<2 x s32>)
488    ; CHECK: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s16>) = G_CONCAT_VECTORS [[TRUNC]](<2 x s16>), [[TRUNC1]](<2 x s16>)
489    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[CONCAT_VECTORS]](<4 x s16>), 32
490    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
491    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
492    %0:_(<4 x s8>) = G_IMPLICIT_DEF
493    %1:_(s8) = G_EXTRACT %0, 16
494    %2:_(s32) = G_ANYEXT %1
495    $vgpr0 = COPY %2
496...
497
498---
499name: extract_s8_v4s8_offset24
500body: |
501  bb.0:
502    ; CHECK-LABEL: name: extract_s8_v4s8_offset24
503    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
504    ; CHECK: [[UV:%[0-9]+]]:_(<2 x s32>), [[UV1:%[0-9]+]]:_(<2 x s32>) = G_UNMERGE_VALUES [[DEF]](<4 x s32>)
505    ; CHECK: [[TRUNC:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[UV]](<2 x s32>)
506    ; CHECK: [[TRUNC1:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[UV1]](<2 x s32>)
507    ; CHECK: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s16>) = G_CONCAT_VECTORS [[TRUNC]](<2 x s16>), [[TRUNC1]](<2 x s16>)
508    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[CONCAT_VECTORS]](<4 x s16>), 48
509    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
510    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
511    %0:_(<4 x s8>) = G_IMPLICIT_DEF
512    %1:_(s8) = G_EXTRACT %0, 24
513    %2:_(s32) = G_ANYEXT %1
514    $vgpr0 = COPY %2
515...
516
517# FIXME: Leaves behind dead G_TRUNC
518---
519name: extract_s8_v3s8_offset16
520body: |
521  bb.0:
522    ; CHECK-LABEL: name: extract_s8_v3s8_offset16
523    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
524    ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[DEF]](<4 x s32>)
525    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
526    ; CHECK: [[AND:%[0-9]+]]:_(s32) = G_AND [[UV]], [[C]]
527    ; CHECK: [[AND1:%[0-9]+]]:_(s32) = G_AND [[UV1]], [[C]]
528    ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
529    ; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[AND1]], [[C1]](s32)
530    ; CHECK: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
531    ; CHECK: [[BITCAST:%[0-9]+]]:_(<2 x s16>) = G_BITCAST [[OR]](s32)
532    ; CHECK: [[AND2:%[0-9]+]]:_(s32) = G_AND [[UV2]], [[C]]
533    ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
534    ; CHECK: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[C2]], [[C1]](s32)
535    ; CHECK: [[OR1:%[0-9]+]]:_(s32) = G_OR [[AND2]], [[SHL1]]
536    ; CHECK: [[BITCAST1:%[0-9]+]]:_(<2 x s16>) = G_BITCAST [[OR1]](s32)
537    ; CHECK: [[DEF1:%[0-9]+]]:_(<2 x s16>) = G_IMPLICIT_DEF
538    ; CHECK: [[CONCAT_VECTORS:%[0-9]+]]:_(<6 x s16>) = G_CONCAT_VECTORS [[BITCAST]](<2 x s16>), [[BITCAST1]](<2 x s16>), [[DEF1]](<2 x s16>)
539    ; CHECK: [[UV4:%[0-9]+]]:_(<3 x s16>), [[UV5:%[0-9]+]]:_(<3 x s16>) = G_UNMERGE_VALUES [[CONCAT_VECTORS]](<6 x s16>)
540    ; CHECK: [[DEF2:%[0-9]+]]:_(<4 x s16>) = G_IMPLICIT_DEF
541    ; CHECK: [[INSERT:%[0-9]+]]:_(<4 x s16>) = G_INSERT [[DEF2]], [[UV4]](<3 x s16>), 0
542    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[INSERT]](<4 x s16>), 32
543    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
544    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
545    %0:_(<3 x s8>) = G_IMPLICIT_DEF
546    %1:_(s8) = G_EXTRACT %0, 16
547    %2:_(s32) = G_ANYEXT %1
548    $vgpr0 = COPY %2
549...
550
551---
552name: extract_s8_v5s1_offset4
553body: |
554  bb.0:
555    ; CHECK-LABEL: name: extract_s8_v5s1_offset4
556    ; CHECK: [[DEF:%[0-9]+]]:_(<5 x s32>) = G_IMPLICIT_DEF
557    ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32), [[UV4:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[DEF]](<5 x s32>)
558    ; CHECK: [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
559    ; CHECK: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[UV]](s32), [[UV1]](s32)
560    ; CHECK: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[UV2]](s32), [[UV3]](s32)
561    ; CHECK: [[BUILD_VECTOR2:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[UV4]](s32), [[DEF1]](s32)
562    ; CHECK: [[TRUNC:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[BUILD_VECTOR]](<2 x s32>)
563    ; CHECK: [[TRUNC1:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[BUILD_VECTOR1]](<2 x s32>)
564    ; CHECK: [[TRUNC2:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[BUILD_VECTOR2]](<2 x s32>)
565    ; CHECK: [[DEF2:%[0-9]+]]:_(<2 x s16>) = G_IMPLICIT_DEF
566    ; CHECK: [[CONCAT_VECTORS:%[0-9]+]]:_(<10 x s16>) = G_CONCAT_VECTORS [[TRUNC]](<2 x s16>), [[TRUNC1]](<2 x s16>), [[TRUNC2]](<2 x s16>), [[DEF2]](<2 x s16>), [[DEF2]](<2 x s16>)
567    ; CHECK: [[UV5:%[0-9]+]]:_(<5 x s16>), [[UV6:%[0-9]+]]:_(<5 x s16>) = G_UNMERGE_VALUES [[CONCAT_VECTORS]](<10 x s16>)
568    ; CHECK: [[DEF3:%[0-9]+]]:_(<6 x s16>) = G_IMPLICIT_DEF
569    ; CHECK: [[INSERT:%[0-9]+]]:_(<6 x s16>) = G_INSERT [[DEF3]], [[UV5]](<5 x s16>), 0
570    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[INSERT]](<6 x s16>), 64
571    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
572    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
573    %0:_(<5 x s1>) = G_IMPLICIT_DEF
574    %1:_(s1) = G_EXTRACT %0, 4
575    %2:_(s32) = G_ANYEXT %1
576    $vgpr0 = COPY %2
577...
578
579---
580name: extract_v2s16_v4s16_offset32
581body: |
582  bb.0:
583    ; CHECK-LABEL: name: extract_v2s16_v4s16_offset32
584    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s16>) = G_IMPLICIT_DEF
585    ; CHECK: [[EXTRACT:%[0-9]+]]:_(<2 x s16>) = G_EXTRACT [[DEF]](<4 x s16>), 32
586    ; CHECK: $vgpr0 = COPY [[EXTRACT]](<2 x s16>)
587    %0:_(<4 x s16>) = G_IMPLICIT_DEF
588    %1:_(<2 x s16>) = G_EXTRACT %0, 32
589    $vgpr0 = COPY %1
590...
591
592---
593name: extract_v2s16_v6s16_offset32
594body: |
595  bb.0:
596    ; CHECK-LABEL: name: extract_v2s16_v6s16_offset32
597    ; CHECK: [[DEF:%[0-9]+]]:_(<6 x s16>) = G_IMPLICIT_DEF
598    ; CHECK: [[EXTRACT:%[0-9]+]]:_(<2 x s16>) = G_EXTRACT [[DEF]](<6 x s16>), 32
599    ; CHECK: $vgpr0 = COPY [[EXTRACT]](<2 x s16>)
600    %0:_(<6 x s16>) = G_IMPLICIT_DEF
601    %1:_(<2 x s16>) = G_EXTRACT %0, 32
602    $vgpr0 = COPY %1
603...
604
605---
606name: test_extract_s8_s16_offset0
607body: |
608  bb.0:
609    liveins: $vgpr0
610    ; CHECK-LABEL: name: test_extract_s8_s16_offset0
611    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
612    ; CHECK: $vgpr0 = COPY [[COPY]](s32)
613    %0:_(s32) = COPY $vgpr0
614    %1:_(s16) = G_TRUNC %0
615    %2:_(s8) = G_EXTRACT %1, 0
616    %3:_(s32) = G_ANYEXT %2
617    $vgpr0 = COPY %3
618...
619
620---
621name: test_extract_s8_s16_offset1
622body: |
623  bb.0:
624    liveins: $vgpr0
625    ; CHECK-LABEL: name: test_extract_s8_s16_offset1
626    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
627    ; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)
628    ; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 1
629    ; CHECK: [[LSHR:%[0-9]+]]:_(s16) = G_LSHR [[TRUNC]], [[C]](s16)
630    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LSHR]](s16)
631    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
632    %0:_(s32) = COPY $vgpr0
633    %1:_(s16) = G_TRUNC %0
634    %2:_(s8) = G_EXTRACT %1, 1
635    %3:_(s32) = G_ANYEXT %2
636    $vgpr0 = COPY %3
637...
638
639---
640name: test_extract_s8_s16_offset8
641body: |
642  bb.0:
643    liveins: $vgpr0
644    ; CHECK-LABEL: name: test_extract_s8_s16_offset8
645    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
646    ; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)
647    ; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 8
648    ; CHECK: [[LSHR:%[0-9]+]]:_(s16) = G_LSHR [[TRUNC]], [[C]](s16)
649    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LSHR]](s16)
650    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
651    %0:_(s32) = COPY $vgpr0
652    %1:_(s16) = G_TRUNC %0
653    %2:_(s8) = G_EXTRACT %1, 8
654    %3:_(s32) = G_ANYEXT %2
655    $vgpr0 = COPY %3
656...
657
658---
659name: test_extract_s8_s32_offset0
660body: |
661  bb.0:
662    liveins: $vgpr0
663    ; CHECK-LABEL: name: test_extract_s8_s32_offset0
664    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
665    ; CHECK: $vgpr0 = COPY [[COPY]](s32)
666    %0:_(s32) = COPY $vgpr0
667    %1:_(s8) = G_EXTRACT %0, 0
668    %2:_(s32) = G_ANYEXT %1
669    $vgpr0 = COPY %2
670...
671
672---
673name: test_extract_s8_s32_offset1
674body: |
675  bb.0:
676    liveins: $vgpr0
677    ; CHECK-LABEL: name: test_extract_s8_s32_offset1
678    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
679    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
680    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32)
681    ; CHECK: $vgpr0 = COPY [[LSHR]](s32)
682    %0:_(s32) = COPY $vgpr0
683    %1:_(s8) = G_EXTRACT %0, 1
684    %2:_(s32) = G_ANYEXT %1
685    $vgpr0 = COPY %2
686...
687
688---
689name: test_extract_s8_s32_offset8
690body: |
691  bb.0:
692    liveins: $vgpr0
693    ; CHECK-LABEL: name: test_extract_s8_s32_offset8
694    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
695    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8
696    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32)
697    ; CHECK: $vgpr0 = COPY [[LSHR]](s32)
698    %0:_(s32) = COPY $vgpr0
699    %1:_(s8) = G_EXTRACT %0, 8
700    %2:_(s32) = G_ANYEXT %1
701    $vgpr0 = COPY %2
702...
703
704---
705name: test_extract_s8_s32_offset16
706body: |
707  bb.0:
708    liveins: $vgpr0
709    ; CHECK-LABEL: name: test_extract_s8_s32_offset16
710    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
711    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
712    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32)
713    ; CHECK: $vgpr0 = COPY [[LSHR]](s32)
714    %0:_(s32) = COPY $vgpr0
715    %1:_(s8) = G_EXTRACT %0, 16
716    %2:_(s32) = G_ANYEXT %1
717    $vgpr0 = COPY %2
718...
719
720---
721name: test_extract_s8_s32_offset24
722body: |
723  bb.0:
724    liveins: $vgpr0
725    ; CHECK-LABEL: name: test_extract_s8_s32_offset24
726    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
727    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
728    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32)
729    ; CHECK: $vgpr0 = COPY [[LSHR]](s32)
730    %0:_(s32) = COPY $vgpr0
731    %1:_(s8) = G_EXTRACT %0, 16
732    %2:_(s32) = G_ANYEXT %1
733    $vgpr0 = COPY %2
734...
735
736---
737name: test_extract_s8_p3_offset0
738body: |
739  bb.0:
740    liveins: $vgpr0
741    ; CHECK-LABEL: name: test_extract_s8_p3_offset0
742    ; CHECK: [[COPY:%[0-9]+]]:_(p3) = COPY $vgpr0
743    ; CHECK: [[PTRTOINT:%[0-9]+]]:_(s32) = G_PTRTOINT [[COPY]](p3)
744    ; CHECK: $vgpr0 = COPY [[PTRTOINT]](s32)
745    %0:_(p3) = COPY $vgpr0
746    %1:_(s8) = G_EXTRACT %0, 0
747    %2:_(s32) = G_ANYEXT %1
748    $vgpr0 = COPY %2
749...
750
751---
752name: test_extract_s8_p3_offset8
753body: |
754  bb.0:
755    liveins: $vgpr0
756    ; CHECK-LABEL: name: test_extract_s8_p3_offset8
757    ; CHECK: [[COPY:%[0-9]+]]:_(p3) = COPY $vgpr0
758    ; CHECK: [[PTRTOINT:%[0-9]+]]:_(s32) = G_PTRTOINT [[COPY]](p3)
759    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8
760    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[PTRTOINT]], [[C]](s32)
761    ; CHECK: $vgpr0 = COPY [[LSHR]](s32)
762    %0:_(p3) = COPY $vgpr0
763    %1:_(s8) = G_EXTRACT %0, 8
764    %2:_(s32) = G_ANYEXT %1
765    $vgpr0 = COPY %2
766...
767
768---
769name: test_extract_s1_s8_offset0
770body: |
771  bb.0:
772    liveins: $vgpr0
773    ; CHECK-LABEL: name: test_extract_s1_s8_offset0
774    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
775    ; CHECK: $vgpr0 = COPY [[COPY]](s32)
776    %0:_(s32) = COPY $vgpr0
777    %1:_(s8) = G_TRUNC %0
778    %2:_(s1) = G_EXTRACT %1, 0
779    %3:_(s32) = G_ANYEXT %2
780    $vgpr0 = COPY %3
781...
782
783---
784name: test_extract_s1_s8_offset2
785body: |
786  bb.0:
787    liveins: $vgpr0
788    ; CHECK-LABEL: name: test_extract_s1_s8_offset2
789    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
790    ; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)
791    ; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 2
792    ; CHECK: [[LSHR:%[0-9]+]]:_(s16) = G_LSHR [[TRUNC]], [[C]](s16)
793    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LSHR]](s16)
794    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
795    %0:_(s32) = COPY $vgpr0
796    %1:_(s8) = G_TRUNC %0
797    %2:_(s1) = G_EXTRACT %1, 2
798    %3:_(s32) = G_ANYEXT %2
799    $vgpr0 = COPY %3
800...
801
802---
803name: test_extract_s8_s64_offset2
804body: |
805  bb.0:
806    liveins: $vgpr0_vgpr1
807    ; CHECK-LABEL: name: test_extract_s8_s64_offset2
808    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
809    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 2
810    ; CHECK: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[COPY]], [[C]](s32)
811    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[LSHR]](s64)
812    ; CHECK: $vgpr0 = COPY [[TRUNC]](s32)
813    %0:_(s64) = COPY $vgpr0_vgpr1
814    %1:_(s8) = G_EXTRACT %0, 2
815    %2:_(s32) = G_ANYEXT %1
816    $vgpr0 = COPY %2
817...
818
819---
820name: extract_s16_v3s16_offset0
821body: |
822  bb.0:
823
824    ; CHECK-LABEL: name: extract_s16_v3s16_offset0
825    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s16>) = G_IMPLICIT_DEF
826    ; CHECK: [[DEF1:%[0-9]+]]:_(<4 x s16>) = G_IMPLICIT_DEF
827    ; CHECK: [[CONCAT_VECTORS:%[0-9]+]]:_(<12 x s16>) = G_CONCAT_VECTORS [[DEF]](<4 x s16>), [[DEF1]](<4 x s16>), [[DEF1]](<4 x s16>)
828    ; CHECK: [[UV:%[0-9]+]]:_(<3 x s16>), [[UV1:%[0-9]+]]:_(<3 x s16>), [[UV2:%[0-9]+]]:_(<3 x s16>), [[UV3:%[0-9]+]]:_(<3 x s16>) = G_UNMERGE_VALUES [[CONCAT_VECTORS]](<12 x s16>)
829    ; CHECK: [[INSERT:%[0-9]+]]:_(<4 x s16>) = G_INSERT [[DEF1]], [[UV]](<3 x s16>), 0
830    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[INSERT]](<4 x s16>), 0
831    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
832    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
833    %0:_(<3 x s16>) = G_IMPLICIT_DEF
834    %1:_(s16) = G_EXTRACT %0, 0
835    %2:_(s32) = G_ANYEXT %1
836    $vgpr0 = COPY %2
837...
838
839---
840name: test_extract_s8_s64_offset16
841body: |
842  bb.0:
843    liveins: $vgpr0_vgpr1
844    ; CHECK-LABEL: name: test_extract_s8_s64_offset16
845    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
846    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
847    ; CHECK: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[COPY]], [[C]](s32)
848    ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[LSHR]](s64)
849    ; CHECK: $vgpr0 = COPY [[TRUNC]](s32)
850    %0:_(s64) = COPY $vgpr0_vgpr1
851    %1:_(s8) = G_EXTRACT %0, 16
852    %2:_(s32) = G_ANYEXT %1
853    $vgpr0 = COPY %2
854...
855
856---
857name: test_extract_s16_s64_offset16
858body: |
859  bb.0:
860    liveins: $vgpr0_vgpr1
861    ; CHECK-LABEL: name: test_extract_s16_s64_offset16
862    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
863    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[COPY]](s64), 16
864    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
865    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
866    %0:_(s64) = COPY $vgpr0_vgpr1
867    %1:_(s16) = G_EXTRACT %0, 16
868    %2:_(s32) = G_ANYEXT %1
869    $vgpr0 = COPY %2
870...
871
872---
873name: test_extract_s16_s64_offset32
874body: |
875  bb.0:
876    liveins: $vgpr0_vgpr1
877    ; CHECK-LABEL: name: test_extract_s16_s64_offset32
878    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
879    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[COPY]](s64), 32
880    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
881    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
882    %0:_(s64) = COPY $vgpr0_vgpr1
883    %1:_(s16) = G_EXTRACT %0, 32
884    %2:_(s32) = G_ANYEXT %1
885    $vgpr0 = COPY %2
886...
887
888---
889name: test_extract_s16_s64_offset48
890body: |
891  bb.0:
892    liveins: $vgpr0_vgpr1
893    ; CHECK-LABEL: name: test_extract_s16_s64_offset48
894    ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
895    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[COPY]](s64), 48
896    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
897    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
898    %0:_(s64) = COPY $vgpr0_vgpr1
899    %1:_(s16) = G_EXTRACT %0, 48
900    %2:_(s32) = G_ANYEXT %1
901    $vgpr0 = COPY %2
902...
903
904---
905name: extract_v2s16_v3s16_offset0
906body: |
907  bb.0:
908
909    ; CHECK-LABEL: name: extract_v2s16_v3s16_offset0
910    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s16>) = G_IMPLICIT_DEF
911    ; CHECK: [[DEF1:%[0-9]+]]:_(<4 x s16>) = G_IMPLICIT_DEF
912    ; CHECK: [[CONCAT_VECTORS:%[0-9]+]]:_(<12 x s16>) = G_CONCAT_VECTORS [[DEF]](<4 x s16>), [[DEF1]](<4 x s16>), [[DEF1]](<4 x s16>)
913    ; CHECK: [[UV:%[0-9]+]]:_(<3 x s16>), [[UV1:%[0-9]+]]:_(<3 x s16>), [[UV2:%[0-9]+]]:_(<3 x s16>), [[UV3:%[0-9]+]]:_(<3 x s16>) = G_UNMERGE_VALUES [[CONCAT_VECTORS]](<12 x s16>)
914    ; CHECK: [[INSERT:%[0-9]+]]:_(<4 x s16>) = G_INSERT [[DEF1]], [[UV]](<3 x s16>), 0
915    ; CHECK: [[EXTRACT:%[0-9]+]]:_(<2 x s16>) = G_EXTRACT [[INSERT]](<4 x s16>), 0
916    ; CHECK: $vgpr0 = COPY [[EXTRACT]](<2 x s16>)
917    %0:_(<3 x s16>) = G_IMPLICIT_DEF
918    %1:_(<2 x s16>) = G_EXTRACT %0, 0
919    $vgpr0 = COPY %1
920...
921
922---
923name: extract_v2s16_v5s16_offset0
924body: |
925  bb.0:
926
927    ; CHECK-LABEL: name: extract_v2s16_v5s16_offset0
928    ; CHECK: [[DEF:%[0-9]+]]:_(<6 x s16>) = G_IMPLICIT_DEF
929    ; CHECK: [[DEF1:%[0-9]+]]:_(<6 x s16>) = G_IMPLICIT_DEF
930    ; CHECK: [[CONCAT_VECTORS:%[0-9]+]]:_(<30 x s16>) = G_CONCAT_VECTORS [[DEF]](<6 x s16>), [[DEF1]](<6 x s16>), [[DEF1]](<6 x s16>), [[DEF1]](<6 x s16>), [[DEF1]](<6 x s16>)
931    ; CHECK: [[UV:%[0-9]+]]:_(<5 x s16>), [[UV1:%[0-9]+]]:_(<5 x s16>), [[UV2:%[0-9]+]]:_(<5 x s16>), [[UV3:%[0-9]+]]:_(<5 x s16>), [[UV4:%[0-9]+]]:_(<5 x s16>), [[UV5:%[0-9]+]]:_(<5 x s16>) = G_UNMERGE_VALUES [[CONCAT_VECTORS]](<30 x s16>)
932    ; CHECK: [[INSERT:%[0-9]+]]:_(<6 x s16>) = G_INSERT [[DEF1]], [[UV]](<5 x s16>), 0
933    ; CHECK: [[EXTRACT:%[0-9]+]]:_(<2 x s16>) = G_EXTRACT [[INSERT]](<6 x s16>), 0
934    ; CHECK: $vgpr0 = COPY [[EXTRACT]](<2 x s16>)
935    %0:_(<5 x s16>) = G_IMPLICIT_DEF
936    %1:_(<2 x s16>) = G_EXTRACT %0, 0
937    $vgpr0 = COPY %1
938...
939
940---
941name: extract_s16_v2s16_offset0
942body: |
943  bb.0:
944    liveins: $vgpr0
945
946    ; CHECK-LABEL: name: extract_s16_v2s16_offset0
947    ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
948    ; CHECK: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[COPY]](<2 x s16>)
949    ; CHECK: $vgpr0 = COPY [[BITCAST]](s32)
950    %0:_(<2 x s16>) = COPY $vgpr0
951    %1:_(s16) = G_EXTRACT %0, 0
952    %2:_(s32) = G_ANYEXT %1
953    $vgpr0 = COPY %2
954...
955
956---
957name: extract_s16_v2s16_offset1
958body: |
959  bb.0:
960    liveins: $vgpr0
961
962    ; CHECK-LABEL: name: extract_s16_v2s16_offset1
963    ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
964    ; CHECK: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[COPY]](<2 x s16>)
965    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
966    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BITCAST]], [[C]](s32)
967    ; CHECK: $vgpr0 = COPY [[LSHR]](s32)
968    %0:_(<2 x s16>) = COPY $vgpr0
969    %1:_(s16) = G_EXTRACT %0, 1
970    %2:_(s32) = G_ANYEXT %1
971    $vgpr0 = COPY %2
972...
973
974---
975name: extract_s16_v2s16_offset8
976body: |
977  bb.0:
978    liveins: $vgpr0
979
980    ; CHECK-LABEL: name: extract_s16_v2s16_offset8
981    ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
982    ; CHECK: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[COPY]](<2 x s16>)
983    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8
984    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BITCAST]], [[C]](s32)
985    ; CHECK: $vgpr0 = COPY [[LSHR]](s32)
986    %0:_(<2 x s16>) = COPY $vgpr0
987    %1:_(s16) = G_EXTRACT %0, 8
988    %2:_(s32) = G_ANYEXT %1
989    $vgpr0 = COPY %2
990...
991
992---
993name: extract_s16_v2s16_offset16
994body: |
995  bb.0:
996    liveins: $vgpr0
997
998    ; CHECK-LABEL: name: extract_s16_v2s16_offset16
999    ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
1000    ; CHECK: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[COPY]](<2 x s16>)
1001    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
1002    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BITCAST]], [[C]](s32)
1003    ; CHECK: $vgpr0 = COPY [[LSHR]](s32)
1004    %0:_(<2 x s16>) = COPY $vgpr0
1005    %1:_(s16) = G_EXTRACT %0, 16
1006    %2:_(s32) = G_ANYEXT %1
1007    $vgpr0 = COPY %2
1008...
1009
1010---
1011name: extract_s16_s32_offset0
1012body: |
1013  bb.0:
1014    liveins: $vgpr0
1015
1016    ; CHECK-LABEL: name: extract_s16_s32_offset0
1017    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
1018    ; CHECK: $vgpr0 = COPY [[COPY]](s32)
1019    %0:_(s32) = COPY $vgpr0
1020    %1:_(s16) = G_EXTRACT %0, 0
1021    %2:_(s32) = G_ANYEXT %1
1022    $vgpr0 = COPY %2
1023...
1024
1025---
1026name: extract_s16_s32_offset1
1027body: |
1028  bb.0:
1029    liveins: $vgpr0
1030
1031    ; CHECK-LABEL: name: extract_s16_s32_offset1
1032    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
1033    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
1034    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32)
1035    ; CHECK: $vgpr0 = COPY [[LSHR]](s32)
1036    %0:_(s32) = COPY $vgpr0
1037    %1:_(s16) = G_EXTRACT %0, 1
1038    %2:_(s32) = G_ANYEXT %1
1039    $vgpr0 = COPY %2
1040...
1041
1042---
1043name: extract_s16_s32_offset8
1044body: |
1045  bb.0:
1046    liveins: $vgpr0
1047
1048    ; CHECK-LABEL: name: extract_s16_s32_offset8
1049    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
1050    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8
1051    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32)
1052    ; CHECK: $vgpr0 = COPY [[LSHR]](s32)
1053    %0:_(s32) = COPY $vgpr0
1054    %1:_(s16) = G_EXTRACT %0, 8
1055    %2:_(s32) = G_ANYEXT %1
1056    $vgpr0 = COPY %2
1057...
1058
1059---
1060name: extract_s16_s32_offset16
1061body: |
1062  bb.0:
1063    liveins: $vgpr0
1064
1065    ; CHECK-LABEL: name: extract_s16_s32_offset16
1066    ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
1067    ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
1068    ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32)
1069    ; CHECK: $vgpr0 = COPY [[LSHR]](s32)
1070    %0:_(s32) = COPY $vgpr0
1071    %1:_(s16) = G_EXTRACT %0, 16
1072    %2:_(s32) = G_ANYEXT %1
1073    $vgpr0 = COPY %2
1074...
1075
1076---
1077name: extract_s16_p3_offset0
1078body: |
1079  bb.0:
1080    liveins: $vgpr0
1081
1082    ; CHECK-LABEL: name: extract_s16_p3_offset0
1083    ; CHECK: [[COPY:%[0-9]+]]:_(p3) = COPY $vgpr0
1084    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[COPY]](p3), 0
1085    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
1086    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
1087    %0:_(p3) = COPY $vgpr0
1088    %1:_(s16) = G_EXTRACT %0, 0
1089    %2:_(s32) = G_ANYEXT %1
1090    $vgpr0 = COPY %2
1091...
1092
1093---
1094name: extract_s16_p3_offset1
1095body: |
1096  bb.0:
1097    liveins: $vgpr0
1098
1099    ; CHECK-LABEL: name: extract_s16_p3_offset1
1100    ; CHECK: [[COPY:%[0-9]+]]:_(p3) = COPY $vgpr0
1101    ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[COPY]](p3), 1
1102    ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
1103    ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
1104    %0:_(p3) = COPY $vgpr0
1105    %1:_(s16) = G_EXTRACT %0, 1
1106    %2:_(s32) = G_ANYEXT %1
1107    $vgpr0 = COPY %2
1108...
1109