1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -o - -mtriple=aarch64-unknown-unknown -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s | FileCheck %s
4 # Simple unmerge(merge) case with two operands.
5 # The sources of the merge can be used in place of
6 # the destinations of the unmerge.
8 name: test_combine_unmerge_merge
11 ; CHECK-LABEL: name: test_combine_unmerge_merge
12 ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
13 ; CHECK: [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
14 ; CHECK: $w0 = COPY [[DEF]](s32)
15 ; CHECK: $w1 = COPY [[DEF1]](s32)
16 %0:_(s32) = G_IMPLICIT_DEF
17 %1:_(s32) = G_IMPLICIT_DEF
18 %2:_(s64) = G_MERGE_VALUES %0(s32), %1(s32)
19 %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %2(s64)
24 # Simple unmerge(merge) case with three operands.
25 # The sources of the merge can be used in place of
26 # the destinations of the unmerge.
28 name: test_combine_unmerge_merge_3ops
31 ; CHECK-LABEL: name: test_combine_unmerge_merge_3ops
32 ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
33 ; CHECK: [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
34 ; CHECK: [[DEF2:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
35 ; CHECK: $w0 = COPY [[DEF]](s32)
36 ; CHECK: $w1 = COPY [[DEF1]](s32)
37 ; CHECK: $w2 = COPY [[DEF2]](s32)
38 %0:_(s32) = G_IMPLICIT_DEF
39 %1:_(s32) = G_IMPLICIT_DEF
40 %5:_(s32) = G_IMPLICIT_DEF
41 %2:_(s96) = G_MERGE_VALUES %0(s32), %1(s32), %5(s32)
42 %3:_(s32), %4:_(s32), %6:_(s32) = G_UNMERGE_VALUES %2(s96)
48 # Simple unmerge(buildvector) case with two operands.
49 # The sources of the buildvector can be used in place of
50 # the destinations of the unmerge.
52 name: test_combine_unmerge_build_vector
55 ; CHECK-LABEL: name: test_combine_unmerge_build_vector
56 ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
57 ; CHECK: [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
58 ; CHECK: $w0 = COPY [[DEF]](s32)
59 ; CHECK: $w1 = COPY [[DEF1]](s32)
60 %0:_(s32) = G_IMPLICIT_DEF
61 %1:_(s32) = G_IMPLICIT_DEF
62 %2:_(<2 x s32>) = G_BUILD_VECTOR %0(s32), %1(s32)
63 %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %2(<2 x s32>)
68 # Simple unmerge(buildvector) case with three operands.
69 # The sources of the buildvector can be used in place of
70 # the destinations of the unmerge.
72 name: test_combine_unmerge_buildvector_3ops
75 ; CHECK-LABEL: name: test_combine_unmerge_buildvector_3ops
76 ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
77 ; CHECK: [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
78 ; CHECK: [[DEF2:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
79 ; CHECK: $w0 = COPY [[DEF]](s32)
80 ; CHECK: $w1 = COPY [[DEF1]](s32)
81 ; CHECK: $w2 = COPY [[DEF2]](s32)
82 %0:_(s32) = G_IMPLICIT_DEF
83 %1:_(s32) = G_IMPLICIT_DEF
84 %5:_(s32) = G_IMPLICIT_DEF
85 %2:_(<3 x s32>) = G_BUILD_VECTOR %0(s32), %1(s32), %5(s32)
86 %3:_(s32), %4:_(s32), %6:_(s32) = G_UNMERGE_VALUES %2(<3 x s32>)
92 # Simple unmerge(concatvectors) case.
93 # The sources of the concatvectors can be used in place of
94 # the destinations of the unmerge.
96 name: test_combine_unmerge_concat_vectors
99 ; CHECK-LABEL: name: test_combine_unmerge_concat_vectors
100 ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $w0
101 ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s16>) = COPY $w1
102 ; CHECK: $w0 = COPY [[COPY]](<2 x s16>)
103 ; CHECK: $w1 = COPY [[COPY1]](<2 x s16>)
104 %0:_(<2 x s16>) = COPY $w0
105 %1:_(<2 x s16>) = COPY $w1
106 %2:_(<4 x s16>) = G_CONCAT_VECTORS %0(<2 x s16>), %1(<2 x s16>)
107 %3:_(<2 x s16>), %4:_(<2 x s16>) = G_UNMERGE_VALUES %2(<4 x s16>)
108 $w0 = COPY %3(<2 x s16>)
109 $w1 = COPY %4(<2 x s16>)
112 # Unmerge(merge) case with two operands and a bitcast in the middle.
113 # The sources of the merge can be used in place of
114 # the destinations of the unmerge.
116 name: test_combine_unmerge_bitcast_merge
119 ; CHECK-LABEL: name: test_combine_unmerge_bitcast_merge
120 ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
121 ; CHECK: [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
122 ; CHECK: $w0 = COPY [[DEF]](s32)
123 ; CHECK: $w1 = COPY [[DEF1]](s32)
124 %0:_(s32) = G_IMPLICIT_DEF
125 %1:_(s32) = G_IMPLICIT_DEF
126 %2:_(s64) = G_MERGE_VALUES %0(s32), %1(s32)
127 %5:_(<2 x s32>) = G_BITCAST %2(s64)
128 %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %5(<2 x s32>)
133 # Unmerge(merge) with incompatible types: unmerge destTy != merge inputTy.
134 # The sources of the merge cannot be used in place of
135 # the destinations of the unmerge, since the types don't match.
137 name: test_combine_unmerge_merge_incompatible_types
140 ; CHECK-LABEL: name: test_combine_unmerge_merge_incompatible_types
141 ; CHECK: [[DEF:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
142 ; CHECK: [[DEF1:%[0-9]+]]:_(s32) = G_IMPLICIT_DEF
143 ; CHECK: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[DEF]](s32), [[DEF1]](s32)
144 ; CHECK: [[UV:%[0-9]+]]:_(s16), [[UV1:%[0-9]+]]:_(s16), [[UV2:%[0-9]+]]:_(s16), [[UV3:%[0-9]+]]:_(s16) = G_UNMERGE_VALUES [[MV]](s64)
145 ; CHECK: $h0 = COPY [[UV]](s16)
146 ; CHECK: $h1 = COPY [[UV1]](s16)
147 ; CHECK: $h2 = COPY [[UV2]](s16)
148 ; CHECK: $h3 = COPY [[UV3]](s16)
149 %0:_(s32) = G_IMPLICIT_DEF
150 %1:_(s32) = G_IMPLICIT_DEF
151 %2:_(s64) = G_MERGE_VALUES %0(s32), %1(s32)
152 %3:_(s16), %4:_(s16), %5:_(s16), %6:_(s16) = G_UNMERGE_VALUES %2(s64)
159 # Unmerge(concatvectors) with incompatible types: unmerge destTy != merge inputTy
160 # but destTy.size() == inputTy.size().
161 # The sources of the concatvectors can be used in place of
162 # the destinations of the unmerge with a bitcast since the sizes
165 name: test_combine_unmerge_merge_incompatible_types_but_same_size
168 ; CHECK-LABEL: name: test_combine_unmerge_merge_incompatible_types_but_same_size
169 ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $w0
170 ; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s16>) = COPY $w1
171 ; CHECK: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[COPY]](<2 x s16>)
172 ; CHECK: [[BITCAST1:%[0-9]+]]:_(s32) = G_BITCAST [[COPY1]](<2 x s16>)
173 ; CHECK: $w0 = COPY [[BITCAST]](s32)
174 ; CHECK: $w1 = COPY [[BITCAST1]](s32)
175 %0:_(<2 x s16>) = COPY $w0
176 %1:_(<2 x s16>) = COPY $w1
177 %2:_(<4 x s16>) = G_CONCAT_VECTORS %0(<2 x s16>), %1(<2 x s16>)
178 %5:_(s64) = G_BITCAST %2(<4 x s16>)
179 %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %5(s64)
184 # Unmerge a constant into a bunch of smaller constant.
185 # Constant is 0x0102030405060708090a0b0c0d0e0f10 and we break it down into
192 name: test_combine_unmerge_cst
195 ; CHECK-LABEL: name: test_combine_unmerge_cst
196 ; CHECK: [[C:%[0-9]+]]:_(s8) = G_CONSTANT i8 16
197 ; CHECK: [[C1:%[0-9]+]]:_(s8) = G_CONSTANT i8 15
198 ; CHECK: [[C2:%[0-9]+]]:_(s8) = G_CONSTANT i8 14
199 ; CHECK: [[C3:%[0-9]+]]:_(s8) = G_CONSTANT i8 13
200 ; CHECK: [[C4:%[0-9]+]]:_(s8) = G_CONSTANT i8 12
201 ; CHECK: [[C5:%[0-9]+]]:_(s8) = G_CONSTANT i8 11
202 ; CHECK: [[C6:%[0-9]+]]:_(s8) = G_CONSTANT i8 10
203 ; CHECK: [[C7:%[0-9]+]]:_(s8) = G_CONSTANT i8 9
204 ; CHECK: [[C8:%[0-9]+]]:_(s8) = G_CONSTANT i8 8
205 ; CHECK: [[C9:%[0-9]+]]:_(s8) = G_CONSTANT i8 7
206 ; CHECK: [[C10:%[0-9]+]]:_(s8) = G_CONSTANT i8 6
207 ; CHECK: [[C11:%[0-9]+]]:_(s8) = G_CONSTANT i8 5
208 ; CHECK: [[C12:%[0-9]+]]:_(s8) = G_CONSTANT i8 4
209 ; CHECK: [[C13:%[0-9]+]]:_(s8) = G_CONSTANT i8 3
210 ; CHECK: [[C14:%[0-9]+]]:_(s8) = G_CONSTANT i8 2
211 ; CHECK: [[C15:%[0-9]+]]:_(s8) = G_CONSTANT i8 1
212 ; CHECK: $b0 = COPY [[C]](s8)
213 ; CHECK: $b1 = COPY [[C1]](s8)
214 ; CHECK: $b2 = COPY [[C2]](s8)
215 ; CHECK: $b3 = COPY [[C3]](s8)
216 ; CHECK: $b4 = COPY [[C4]](s8)
217 ; CHECK: $b5 = COPY [[C5]](s8)
218 ; CHECK: $b6 = COPY [[C6]](s8)
219 ; CHECK: $b7 = COPY [[C7]](s8)
220 ; CHECK: $b8 = COPY [[C8]](s8)
221 ; CHECK: $b9 = COPY [[C9]](s8)
222 ; CHECK: $b10 = COPY [[C10]](s8)
223 ; CHECK: $b11 = COPY [[C11]](s8)
224 ; CHECK: $b12 = COPY [[C12]](s8)
225 ; CHECK: $b13 = COPY [[C13]](s8)
226 ; CHECK: $b14 = COPY [[C14]](s8)
227 ; CHECK: $b15 = COPY [[C15]](s8)
228 %0:_(s128) = G_CONSTANT i128 1339673755198158349044581307228491536
229 %1:_(s8),%2:_(s8),%3:_(s8),%4:_(s8),%5:_(s8),%6:_(s8),%7:_(s8),%8:_(s8),%9:_(s8),%10:_(s8),%11:_(s8),%12:_(s8),%13:_(s8),%14:_(s8),%15:_(s8),%16:_(s8) = G_UNMERGE_VALUES %0(s128)
248 # Unmerge a constant on a non-power of 2 type into a bunch of smaller constant.
249 # Constant is a 3 | 2 | 1 in chunks of 13-bit.
251 name: test_combine_unmerge_cst_36bit
254 ; CHECK-LABEL: name: test_combine_unmerge_cst_36bit
255 ; CHECK: [[C:%[0-9]+]]:_(s13) = G_CONSTANT i13 1
256 ; CHECK: [[C1:%[0-9]+]]:_(s13) = G_CONSTANT i13 2
257 ; CHECK: [[C2:%[0-9]+]]:_(s13) = G_CONSTANT i13 3
258 ; CHECK: [[ZEXT:%[0-9]+]]:_(s16) = G_ZEXT [[C]](s13)
259 ; CHECK: [[ZEXT1:%[0-9]+]]:_(s16) = G_ZEXT [[C1]](s13)
260 ; CHECK: [[ZEXT2:%[0-9]+]]:_(s16) = G_ZEXT [[C2]](s13)
261 ; CHECK: $h0 = COPY [[ZEXT]](s16)
262 ; CHECK: $h1 = COPY [[ZEXT1]](s16)
263 ; CHECK: $h2 = COPY [[ZEXT2]](s16)
264 %0:_(s39) = G_CONSTANT i39 201342977
265 %1:_(s13),%2:_(s13),%3:_(s13) = G_UNMERGE_VALUES %0(s39)
266 %4:_(s16) = G_ZEXT %1(s13)
267 %5:_(s16) = G_ZEXT %2(s13)
268 %6:_(s16) = G_ZEXT %3(s13)
274 # Unmerge floating point constant.
276 name: test_combine_unmerge_fpcst
279 ; CHECK-LABEL: name: test_combine_unmerge_fpcst
280 ; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 1
281 ; CHECK: [[C1:%[0-9]+]]:_(s16) = G_CONSTANT i16 2
282 ; CHECK: [[C2:%[0-9]+]]:_(s16) = G_CONSTANT i16 3
283 ; CHECK: [[C3:%[0-9]+]]:_(s16) = G_CONSTANT i16 4
284 ; CHECK: $h0 = COPY [[C]](s16)
285 ; CHECK: $h1 = COPY [[C1]](s16)
286 ; CHECK: $h2 = COPY [[C2]](s16)
287 ; CHECK: $h3 = COPY [[C3]](s16)
288 %0:_(s64) = G_FCONSTANT double 0x0004000300020001
289 %1:_(s16),%2:_(s16),%3:_(s16),%4:_(s16) = G_UNMERGE_VALUES %0(s64)
296 # Transform unmerge into trunc when only the first definition is live.
298 name: test_combine_unmerge_dead_to_trunc
301 ; CHECK-LABEL: name: test_combine_unmerge_dead_to_trunc
302 ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
303 ; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s64)
304 ; CHECK: $h0 = COPY [[TRUNC]](s16)
306 %1:_(s16),%2:_(s16),%3:_(s16),%4:_(s16) = G_UNMERGE_VALUES %0(s64)
310 # Don't transform unmerge into trunc when middle lanes are live.
312 name: test_dont_combine_unmerge_dead_to_trunc
315 ; CHECK-LABEL: name: test_dont_combine_unmerge_dead_to_trunc
316 ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
317 ; CHECK: [[UV:%[0-9]+]]:_(s16), [[UV1:%[0-9]+]]:_(s16), [[UV2:%[0-9]+]]:_(s16), [[UV3:%[0-9]+]]:_(s16) = G_UNMERGE_VALUES [[COPY]](s64)
318 ; CHECK: $h0 = COPY [[UV2]](s16)
320 %1:_(s16),%2:_(s16),%3:_(s16),%4:_(s16) = G_UNMERGE_VALUES %0(s64)
324 # Transform unmerge into trunc when only the first definition is live, even
325 # if the input and output types are vectors.
327 name: test_combine_unmerge_dead_to_trunc_vec_in_n_out
330 ; CHECK-LABEL: name: test_combine_unmerge_dead_to_trunc_vec_in_n_out
331 ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $x0
332 ; CHECK: [[BITCAST:%[0-9]+]]:_(s64) = G_BITCAST [[COPY]](<2 x s32>)
333 ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[BITCAST]](s64)
334 ; CHECK: [[BITCAST1:%[0-9]+]]:_(<2 x s16>) = G_BITCAST [[TRUNC]](s32)
335 ; CHECK: $w0 = COPY [[BITCAST1]](<2 x s16>)
336 %0:_(<2 x s32>) = COPY $x0
337 %1:_(<2 x s16>),%2:_(<2 x s16>) = G_UNMERGE_VALUES %0(<2 x s32>)
338 $w0 = COPY %1(<2 x s16>)
341 # Transform unmerge into trunc when only the first definition is live, even
342 # if the input type is vector.
344 name: test_combine_unmerge_dead_to_trunc_vec_in
347 ; CHECK-LABEL: name: test_combine_unmerge_dead_to_trunc_vec_in
348 ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $x0
349 ; CHECK: [[BITCAST:%[0-9]+]]:_(s64) = G_BITCAST [[COPY]](<2 x s32>)
350 ; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[BITCAST]](s64)
351 ; CHECK: $h0 = COPY [[TRUNC]](s16)
352 %0:_(<2 x s32>) = COPY $x0
353 %1:_(s16),%2:_(s16),%3:_(s16),%4:_(s16) = G_UNMERGE_VALUES %0(<2 x s32>)
357 # Transform unmerge into trunc when only the first definition is live, even
358 # if the output type are vector.
360 name: test_combine_unmerge_dead_to_trunc_vec_out
363 ; CHECK-LABEL: name: test_combine_unmerge_dead_to_trunc_vec_out
364 ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x0
365 ; CHECK: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY]](s64)
366 ; CHECK: [[BITCAST:%[0-9]+]]:_(<2 x s16>) = G_BITCAST [[TRUNC]](s32)
367 ; CHECK: $w0 = COPY [[BITCAST]](<2 x s16>)
369 %1:_(<2 x s16>),%2:_(<2 x s16>) = G_UNMERGE_VALUES %0(s64)
370 $w0 = COPY %1(<2 x s16>)
373 # Transform unmerge(zext) into zext.
374 # In that test, the source of the zext is same size as the first definition
375 # of the unmerge. Therefore a we can just reuse the input of the zext for
378 name: test_combine_unmerge_zext_to_zext_same_size
381 ; CHECK-LABEL: name: test_combine_unmerge_zext_to_zext_same_size
382 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
383 ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
384 ; CHECK: $w0 = COPY [[COPY]](s32)
385 ; CHECK: $w1 = COPY [[C]](s32)
387 %3:_(s64) = G_ZEXT %0(s32)
388 %1:_(s32),%2:_(s32) = G_UNMERGE_VALUES %3(s64)
393 # Transform unmerge(zext) into zext.
394 # In that test, the source of the zext is smaller than the first definition
395 # of the unmerge. Therefore a G_ZEXT is required.
397 name: test_combine_unmerge_zext_to_zext
400 ; CHECK-LABEL: name: test_combine_unmerge_zext_to_zext
401 ; CHECK: [[COPY:%[0-9]+]]:_(s8) = COPY $b0
402 ; CHECK: [[ZEXT:%[0-9]+]]:_(s16) = G_ZEXT [[COPY]](s8)
403 ; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 0
404 ; CHECK: $h0 = COPY [[ZEXT]](s16)
405 ; CHECK: $h1 = COPY [[C]](s16)
406 ; CHECK: $h2 = COPY [[C]](s16)
407 ; CHECK: $h3 = COPY [[C]](s16)
409 %3:_(s64) = G_ZEXT %0(s8)
410 %1:_(s16),%2:_(s16),%4:_(s16),%5:_(s16) = G_UNMERGE_VALUES %3(s64)
417 # Check that we don't apply the unmerge(zext) to zext transformation
418 # when the first destination of the unmerge is smaller than the source
421 name: test_dont_combine_unmerge_zext_to_zext_src_bigger
424 ; CHECK-LABEL: name: test_dont_combine_unmerge_zext_to_zext_src_bigger
425 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
426 ; CHECK: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY]](s32)
427 ; CHECK: [[UV:%[0-9]+]]:_(s16), [[UV1:%[0-9]+]]:_(s16), [[UV2:%[0-9]+]]:_(s16), [[UV3:%[0-9]+]]:_(s16) = G_UNMERGE_VALUES [[ZEXT]](s64)
428 ; CHECK: $h0 = COPY [[UV]](s16)
429 ; CHECK: $h1 = COPY [[UV1]](s16)
430 ; CHECK: $h2 = COPY [[UV2]](s16)
431 ; CHECK: $h3 = COPY [[UV3]](s16)
433 %3:_(s64) = G_ZEXT %0(s32)
434 %1:_(s16),%2:_(s16),%4:_(s16),%5:_(s16) = G_UNMERGE_VALUES %3(s64)
441 # Check that we don't apply the unmerge(zext) to zext transformation
442 # when the input zext deals with a vector type.
444 name: test_dont_combine_unmerge_zext_to_zext_src_vector
447 ; CHECK-LABEL: name: test_dont_combine_unmerge_zext_to_zext_src_vector
448 ; CHECK: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $w0
449 ; CHECK: [[ZEXT:%[0-9]+]]:_(<2 x s32>) = G_ZEXT [[COPY]](<2 x s16>)
450 ; CHECK: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[ZEXT]](<2 x s32>)
451 ; CHECK: $w0 = COPY [[UV]](s32)
452 ; CHECK: $w1 = COPY [[UV1]](s32)
453 %0:_(<2 x s16>) = COPY $w0
454 %3:_(<2 x s32>) = G_ZEXT %0(<2 x s16>)
455 %1:_(s32),%2:_(s32) = G_UNMERGE_VALUES %3(<2 x s32>)
460 # Check that we don't apply the unmerge(zext) to zext transformation
461 # when the destination type is a vector type.
462 # We could actually handle this case but we would need to insert a cast.
464 name: test_dont_combine_unmerge_zext_to_zext_dst_vector
467 ; CHECK-LABEL: name: test_dont_combine_unmerge_zext_to_zext_dst_vector
468 ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $w0
469 ; CHECK: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY]](s32)
470 ; CHECK: [[UV:%[0-9]+]]:_(<2 x s16>), [[UV1:%[0-9]+]]:_(<2 x s16>) = G_UNMERGE_VALUES [[ZEXT]](s64)
471 ; CHECK: $w0 = COPY [[UV]](<2 x s16>)
472 ; CHECK: $w1 = COPY [[UV1]](<2 x s16>)
474 %3:_(s64) = G_ZEXT %0(s32)
475 %1:_(<2 x s16>),%2:_(<2 x s16>) = G_UNMERGE_VALUES %3(s64)
476 $w0 = COPY %1(<2 x s16>)
477 $w1 = COPY %2(<2 x s16>)