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