[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AMDGPU / GlobalISel / artifact-combiner-extract.mir
blob63aabbcbb11355719818f486ccaf450bcd880275
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
4 ---
5 name: extract_s32_merge_s64_s32_s32_offset0
7 body: |
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: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
12     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY [[C]](s32)
13     ; CHECK: $vgpr0 = COPY [[COPY]](s32)
14     %0:_(s32) = G_CONSTANT i32 0
15     %1:_(s32) = G_CONSTANT i32 1
16     %2:_(s64) = G_MERGE_VALUES %0, %1
17     %3:_(s32) = G_EXTRACT %2, 0
18     $vgpr0 = COPY %3
19 ...
21 ---
22 name: extract_s32_merge_s64_s32_s32_offset32
24 body: |
25   bb.0:
26     ; CHECK-LABEL: name: extract_s32_merge_s64_s32_s32_offset32
27     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
28     ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
29     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY [[C1]](s32)
30     ; CHECK: $vgpr0 = COPY [[COPY]](s32)
31     %0:_(s32) = G_CONSTANT i32 0
32     %1:_(s32) = G_CONSTANT i32 1
33     %2:_(s64) = G_MERGE_VALUES %0, %1
34     %3:_(s32) = G_EXTRACT %2, 32
35     $vgpr0 = COPY %3
36 ...
38 ---
39 name: extract_s64_merge_s128_s64_s64_offset0
41 body: |
42   bb.0:
43     ; CHECK-LABEL: name: extract_s64_merge_s128_s64_s64_offset0
44     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
45     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
46     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY [[C]](s64)
47     ; CHECK: $vgpr0_vgpr1 = COPY [[COPY]](s64)
48     %0:_(s64) = G_CONSTANT i64 0
49     %1:_(s64) = G_CONSTANT i64 1
50     %2:_(s128) = G_MERGE_VALUES %0, %1
51     %3:_(s64) = G_EXTRACT %2, 0
52     $vgpr0_vgpr1 = COPY %3
53 ...
55 ---
56 name: extract_s64_merge_s128_s64_s64_offset64
58 body: |
59   bb.0:
60     ; CHECK-LABEL: name: extract_s64_merge_s128_s64_s64_offset64
61     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
62     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
63     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY [[C1]](s64)
64     ; CHECK: $vgpr0_vgpr1 = COPY [[COPY]](s64)
65     %0:_(s64) = G_CONSTANT i64 0
66     %1:_(s64) = G_CONSTANT i64 1
67     %2:_(s128) = G_MERGE_VALUES %0, %1
68     %3:_(s64) = G_EXTRACT %2, 64
69     $vgpr0_vgpr1 = COPY %3
70 ...
72 ---
73 name: extract_s32_merge_s128_s64_s64_offset0
75 body: |
76   bb.0:
77     ; CHECK-LABEL: name: extract_s32_merge_s128_s64_s64_offset0
78     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
79     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
80     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[C]](s64), 0
81     ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
82     %0:_(s64) = G_CONSTANT i64 0
83     %1:_(s64) = G_CONSTANT i64 1
84     %2:_(s128) = G_MERGE_VALUES %0, %1
85     %3:_(s32) = G_EXTRACT %2, 0
86     $vgpr0 = COPY %3
87 ...
89 ---
90 name: extract_s32_merge_s128_s64_s64_offset32
92 body: |
93   bb.0:
94     ; CHECK-LABEL: name: extract_s32_merge_s128_s64_s64_offset32
95     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
96     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
97     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[C]](s64), 32
98     ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
99     %0:_(s64) = G_CONSTANT i64 0
100     %1:_(s64) = G_CONSTANT i64 1
101     %2:_(s128) = G_MERGE_VALUES %0, %1
102     %3:_(s32) = G_EXTRACT %2, 32
103     $vgpr0 = COPY %3
107 name: extract_s32_merge_s128_s64_s64_offset64
109 body: |
110   bb.0:
111     ; CHECK-LABEL: name: extract_s32_merge_s128_s64_s64_offset64
112     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
113     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
114     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[C1]](s64), 0
115     ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
116     %0:_(s64) = G_CONSTANT i64 0
117     %1:_(s64) = G_CONSTANT i64 1
118     %2:_(s128) = G_MERGE_VALUES %0, %1
119     %3:_(s32) = G_EXTRACT %2, 64
120     $vgpr0 = COPY %3
124 name: extract_s32_merge_s128_s64_s64_offset96
126 body: |
127   bb.0:
128     ; CHECK-LABEL: name: extract_s32_merge_s128_s64_s64_offset96
129     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
130     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
131     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[C1]](s64), 32
132     ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
133     %0:_(s64) = G_CONSTANT i64 0
134     %1:_(s64) = G_CONSTANT i64 1
135     %2:_(s128) = G_MERGE_VALUES %0, %1
136     %3:_(s32) = G_EXTRACT %2, 96
137     $vgpr0 = COPY %3
140 # Destination size fits, but is skewed from the start of the register.
142 name: extract_s16_merge_s128_s64_s64_offset18
144 body: |
145   bb.0:
146     ; CHECK-LABEL: name: extract_s16_merge_s128_s64_s64_offset18
147     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
148     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
149     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[C]](s64), 18
150     ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
151     ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
152     %0:_(s64) = G_CONSTANT i64 0
153     %1:_(s64) = G_CONSTANT i64 1
154     %2:_(s128) = G_MERGE_VALUES %0, %1
155     %3:_(s16) = G_EXTRACT %2, 18
156     %4:_(s32) = G_ANYEXT %3
157     $vgpr0 = COPY %4
160 # Destination size fits, but is skewed from the start of the register.
162 name: extract_s16_merge_s128_s64_s64_offset82
164 body: |
165   bb.0:
166     ; CHECK-LABEL: name: extract_s16_merge_s128_s64_s64_offset82
167     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
168     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
169     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s16) = G_EXTRACT [[C1]](s64), 18
170     ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s16)
171     ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
172     %0:_(s64) = G_CONSTANT i64 0
173     %1:_(s64) = G_CONSTANT i64 1
174     %2:_(s128) = G_MERGE_VALUES %0, %1
175     %3:_(s16) = G_EXTRACT %2, 82
176     %4:_(s32) = G_ANYEXT %3
177     $vgpr0 = COPY %4
181 # Can't handle this since it spans two registers
183 name: extract_s64_merge_s128_s64_s64_offset32
185 body: |
186   bb.0:
187     ; CHECK-LABEL: name: extract_s64_merge_s128_s64_s64_offset32
188     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
189     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
190     ; CHECK: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[C]](s64), [[C1]](s64)
191     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s64) = G_EXTRACT [[MV]](s128), 32
192     ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](s64)
193     %0:_(s64) = G_CONSTANT i64 0
194     %1:_(s64) = G_CONSTANT i64 1
195     %2:_(s128) = G_MERGE_VALUES %0, %1
196     %3:_(s64) = G_EXTRACT %2, 32
197     $vgpr0_vgpr1 = COPY %3
201 # Only the last bit spans to another register
203 name: extract_s16_merge_s32_s32_offset1
205 body: |
206   bb.0:
207     ; CHECK-LABEL: name: extract_s16_merge_s32_s32_offset1
208     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
209     ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
210     ; CHECK: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[C]](s32), [[C1]](s32)
211     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[MV]](s64), 1
212     ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
213     %0:_(s32) = G_CONSTANT i32 0
214     %1:_(s32) = G_CONSTANT i32 1
215     %2:_(s64) = G_MERGE_VALUES %0, %1
216     %3:_(s32) = G_EXTRACT %2, 1
217     $vgpr0 = COPY %3
221 # Test with some merges with 3 operands
224 name: extract_s32_merge_s96_s32_s32_s32_offset0
226 body: |
227   bb.0:
228     ; CHECK-LABEL: name: extract_s32_merge_s96_s32_s32_s32_offset0
229     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
230     ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
231     ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
232     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY [[C]](s32)
233     ; CHECK: $vgpr0 = COPY [[COPY]](s32)
234     %0:_(s32) = G_CONSTANT i32 0
235     %1:_(s32) = G_CONSTANT i32 1
236     %2:_(s32) = G_CONSTANT i32 1
237     %3:_(s96) = G_MERGE_VALUES %0, %1, %2
238     %4:_(s32) = G_EXTRACT %3, 0
239     $vgpr0 = COPY %4
243 name: extract_s32_merge_s96_s32_s32_s32_offset64
245 body: |
246   bb.0:
247     ; CHECK-LABEL: name: extract_s32_merge_s96_s32_s32_s32_offset64
248     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
249     ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
250     ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
251     ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY [[C2]](s32)
252     ; CHECK: $vgpr0 = COPY [[COPY]](s32)
253     %0:_(s32) = G_CONSTANT i32 0
254     %1:_(s32) = G_CONSTANT i32 1
255     %2:_(s32) = G_CONSTANT i32 1
256     %3:_(s96) = G_MERGE_VALUES %0, %1, %2
257     %4:_(s32) = G_EXTRACT %3, 64
258     $vgpr0 = COPY %4
262 name: extract_s64_merge_s96_s32_s32_s32_offset0
264 body: |
265   bb.0:
266     ; CHECK-LABEL: name: extract_s64_merge_s96_s32_s32_s32_offset0
267     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
268     ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
269     ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
270     ; CHECK: [[MV:%[0-9]+]]:_(s96) = G_MERGE_VALUES [[C]](s32), [[C1]](s32), [[C2]](s32)
271     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s64) = G_EXTRACT [[MV]](s96), 0
272     ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](s64)
273     %0:_(s32) = G_CONSTANT i32 0
274     %1:_(s32) = G_CONSTANT i32 1
275     %2:_(s32) = G_CONSTANT i32 1
276     %3:_(s96) = G_MERGE_VALUES %0, %1, %2
277     %4:_(s64) = G_EXTRACT %3, 0
278     $vgpr0_vgpr1 = COPY %4
282 name: extract_s64_merge_s96_s32_s32_s32_offset32
284 body: |
285   bb.0:
286     ; CHECK-LABEL: name: extract_s64_merge_s96_s32_s32_s32_offset32
287     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
288     ; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
289     ; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 1
290     ; CHECK: [[MV:%[0-9]+]]:_(s96) = G_MERGE_VALUES [[C]](s32), [[C1]](s32), [[C2]](s32)
291     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s64) = G_EXTRACT [[MV]](s96), 32
292     ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](s64)
293     %0:_(s32) = G_CONSTANT i32 0
294     %1:_(s32) = G_CONSTANT i32 1
295     %2:_(s32) = G_CONSTANT i32 1
296     %3:_(s96) = G_MERGE_VALUES %0, %1, %2
297     %4:_(s64) = G_EXTRACT %3, 32
298     $vgpr0_vgpr1 = COPY %4
301 # Test build_vector sources
303 name: extract_s64_build_vector_v2s64_s64_s64_offset0
305 body: |
306   bb.0:
307     ; CHECK-LABEL: name: extract_s64_build_vector_v2s64_s64_s64_offset0
308     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
309     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
310     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY [[C]](s64)
311     ; CHECK: $vgpr0_vgpr1 = COPY [[COPY]](s64)
312     %0:_(s64) = G_CONSTANT i64 0
313     %1:_(s64) = G_CONSTANT i64 1
314     %2:_(<2 x s64>) = G_BUILD_VECTOR %0, %1
315     %3:_(s64) = G_EXTRACT %2, 0
316     $vgpr0_vgpr1 = COPY %3
320 name: extract_s64_build_vector_v2s64_s64_s64_offset64
322 body: |
323   bb.0:
324     ; CHECK-LABEL: name: extract_s64_build_vector_v2s64_s64_s64_offset64
325     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
326     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
327     ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY [[C1]](s64)
328     ; CHECK: $vgpr0_vgpr1 = COPY [[COPY]](s64)
329     %0:_(s64) = G_CONSTANT i64 0
330     %1:_(s64) = G_CONSTANT i64 1
331     %2:_(<2 x s64>) = G_BUILD_VECTOR %0, %1
332     %3:_(s64) = G_EXTRACT %2, 64
333     $vgpr0_vgpr1 = COPY %3
337 name: extract_s64_build_vector_v2s64_s64_s64_offset32
339 body: |
340   bb.0:
341     ; CHECK-LABEL: name: extract_s64_build_vector_v2s64_s64_s64_offset32
342     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
343     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
344     ; CHECK: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[C]](s64), [[C1]](s64)
345     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s64) = G_EXTRACT [[BUILD_VECTOR]](<2 x s64>), 32
346     ; CHECK: $vgpr0_vgpr1 = COPY [[EXTRACT]](s64)
347     %0:_(s64) = G_CONSTANT i64 0
348     %1:_(s64) = G_CONSTANT i64 1
349     %2:_(<2 x s64>) = G_BUILD_VECTOR %0, %1
350     %3:_(s64) = G_EXTRACT %2, 32
351     $vgpr0_vgpr1 = COPY %3
354 # Test extracting something smaller than the element size
356 name: extract_s32_build_vector_v2s64_s64_s64_offset64
358 body: |
359   bb.0:
360     ; CHECK-LABEL: name: extract_s32_build_vector_v2s64_s64_s64_offset64
361     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
362     ; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
363     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s32) = G_EXTRACT [[C1]](s64), 0
364     ; CHECK: $vgpr0 = COPY [[EXTRACT]](s32)
365     %0:_(s64) = G_CONSTANT i64 0
366     %1:_(s64) = G_CONSTANT i64 1
367     %2:_(<2 x s64>) = G_BUILD_VECTOR %0, %1
368     %3:_(s32) = G_EXTRACT %2, 64
369     $vgpr0 = COPY %3
373 # Test concat_vector sources
375 name: extract_v2s16_build_vector_v2s64_v2s16_v2s16_offset0
377 body: |
378   bb.0:
379     liveins: $vgpr0, $vgpr1
380     ; CHECK-LABEL: name: extract_v2s16_build_vector_v2s64_v2s16_v2s16_offset0
381     ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
382     ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr1
383     ; CHECK: [[COPY2:%[0-9]+]]:_(<2 x s16>) = COPY [[COPY]](<2 x s16>)
384     ; CHECK: $vgpr0 = COPY [[COPY2]](<2 x s16>)
385     %0:_(<2 x s16>) = COPY $vgpr0
386     %1:_(<2 x s16>) = COPY $vgpr1
387     %2:_(<4 x s16>) = G_CONCAT_VECTORS %0, %1
388     %3:_(<2 x s16>) = G_EXTRACT %2, 0
389     $vgpr0 = COPY %3
393 name: extract_v2s16_build_vector_v2s64_v2s16_v2s16_offset32
395 body: |
396   bb.0:
397     liveins: $vgpr0, $vgpr1
398     ; CHECK-LABEL: name: extract_v2s16_build_vector_v2s64_v2s16_v2s16_offset32
399     ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
400     ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr1
401     ; CHECK: [[COPY2:%[0-9]+]]:_(<2 x s16>) = COPY [[COPY1]](<2 x s16>)
402     ; CHECK: $vgpr0 = COPY [[COPY2]](<2 x s16>)
403     %0:_(<2 x s16>) = COPY $vgpr0
404     %1:_(<2 x s16>) = COPY $vgpr1
405     %2:_(<4 x s16>) = G_CONCAT_VECTORS %0, %1
406     %3:_(<2 x s16>) = G_EXTRACT %2, 32
407     $vgpr0 = COPY %3
410 # Test extracting only a single element, not a subvector
412 name: extract_s16_build_vector_v2s64_v2s16_v2s16_offset32
414 body: |
415   bb.0:
416     liveins: $vgpr0, $vgpr1
417     ; CHECK-LABEL: name: extract_s16_build_vector_v2s64_v2s16_v2s16_offset32
418     ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
419     ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr1
420     ; CHECK: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[COPY1]](<2 x s16>)
421     ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[BITCAST]](s32)
422     ; CHECK: $vgpr0 = COPY [[COPY2]](s32)
423     %0:_(<2 x s16>) = COPY $vgpr0
424     %1:_(<2 x s16>) = COPY $vgpr1
425     %2:_(<4 x s16>) = G_CONCAT_VECTORS %0, %1
426     %3:_(s16) = G_EXTRACT %2, 32
427     %4:_(s32) = G_ANYEXT %3
428     $vgpr0 = COPY %4
432 name: extract_s16_build_vector_v2s64_v2s16_v2s16_offset48
434 body: |
435   bb.0:
436     liveins: $vgpr0, $vgpr1
437     ; CHECK-LABEL: name: extract_s16_build_vector_v2s64_v2s16_v2s16_offset48
438     ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
439     ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr1
440     ; CHECK: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[COPY1]](<2 x s16>)
441     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
442     ; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BITCAST]], [[C]](s32)
443     ; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[LSHR]](s32)
444     ; CHECK: $vgpr0 = COPY [[COPY2]](s32)
445     %0:_(<2 x s16>) = COPY $vgpr0
446     %1:_(<2 x s16>) = COPY $vgpr1
447     %2:_(<4 x s16>) = G_CONCAT_VECTORS %0, %1
448     %3:_(s16) = G_EXTRACT %2, 48
449     %4:_(s32) = G_ANYEXT %3
450     $vgpr0 = COPY %4
453 # Test extracting less than an element
455 name: extract_s8_build_vector_v2s64_v2s16_v2s16_offset48
457 body: |
458   bb.0:
459     liveins: $vgpr0, $vgpr1
460     ; CHECK-LABEL: name: extract_s8_build_vector_v2s64_v2s16_v2s16_offset48
461     ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
462     ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr1
463     ; CHECK: [[EXTRACT:%[0-9]+]]:_(s8) = G_EXTRACT [[COPY1]](<2 x s16>), 16
464     ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[EXTRACT]](s8)
465     ; CHECK: $vgpr0 = COPY [[ANYEXT]](s32)
466     %0:_(<2 x s16>) = COPY $vgpr0
467     %1:_(<2 x s16>) = COPY $vgpr1
468     %2:_(<4 x s16>) = G_CONCAT_VECTORS %0, %1
469     %3:_(s8) = G_EXTRACT %2, 48
470     %4:_(s32) = G_ANYEXT %3
471     $vgpr0 = COPY %4