[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / legalize-zext.mir
blob98b210cbcdaadd6f64baafb0353281ccc4caa167
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 -o - %s | FileCheck %s
4 ---
5 name: test_zext_s32_to_s64
6 body: |
7   bb.0:
8     liveins: $vgpr0
10     ; CHECK-LABEL: name: test_zext_s32_to_s64
11     ; CHECK: liveins: $vgpr0
12     ; CHECK-NEXT: {{  $}}
13     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
14     ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[COPY]](s32)
15     ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[ZEXT]](s64)
16     %0:_(s32) = COPY $vgpr0
17     %1:_(s64) = G_ZEXT %0
18     $vgpr0_vgpr1 = COPY %1
19 ...
21 ---
22 name: test_zext_s16_to_s64
23 body: |
24   bb.0:
25     liveins: $vgpr0
27     ; CHECK-LABEL: name: test_zext_s16_to_s64
28     ; CHECK: liveins: $vgpr0
29     ; CHECK-NEXT: {{  $}}
30     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
31     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 65535
32     ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[COPY]](s32)
33     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[ANYEXT]], [[C]]
34     ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[AND]](s64)
35     %0:_(s32) = COPY $vgpr0
36     %1:_(s16) = G_TRUNC %0
37     %2:_(s64) = G_ZEXT %1
38     $vgpr0_vgpr1 = COPY %2
39 ...
41 ---
42 name: test_zext_s16_to_s32
43 body: |
44   bb.0:
45     liveins: $vgpr0
47     ; CHECK-LABEL: name: test_zext_s16_to_s32
48     ; CHECK: liveins: $vgpr0
49     ; CHECK-NEXT: {{  $}}
50     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
51     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
52     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]
53     ; CHECK-NEXT: $vgpr0 = COPY [[AND]](s32)
54     %0:_(s32) = COPY $vgpr0
55     %1:_(s16) = G_TRUNC %0
56     %2:_(s32) = G_ZEXT %1
57     $vgpr0 = COPY %2
58 ...
60 ---
61 name: test_zext_s24_to_s32
62 body: |
63   bb.0:
64     liveins: $vgpr0
66     ; CHECK-LABEL: name: test_zext_s24_to_s32
67     ; CHECK: liveins: $vgpr0
68     ; CHECK-NEXT: {{  $}}
69     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
70     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16777215
71     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]
72     ; CHECK-NEXT: $vgpr0 = COPY [[AND]](s32)
73     %0:_(s32) = COPY $vgpr0
74     %1:_(s24) = G_TRUNC %0
75     %2:_(s32) = G_ZEXT %1
76     $vgpr0 = COPY %2
77 ...
79 ---
80 name: test_zext_s32_to_s96
81 body: |
82   bb.0:
83     liveins: $vgpr0
85     ; CHECK-LABEL: name: test_zext_s32_to_s96
86     ; CHECK: liveins: $vgpr0
87     ; CHECK-NEXT: {{  $}}
88     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
89     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
90     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[C]](s32)
91     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
92     ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s192) = G_MERGE_VALUES [[MV]](s64), [[C1]](s64), [[C1]](s64)
93     ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s96) = G_TRUNC [[MV1]](s192)
94     ; CHECK-NEXT: $vgpr0_vgpr1_vgpr2 = COPY [[TRUNC]](s96)
95     %0:_(s32) = COPY $vgpr0
96     %1:_(s96) = G_ZEXT %0
97     $vgpr0_vgpr1_vgpr2 = COPY %1
98 ...
101 name: test_zext_i1_to_s32
102 body: |
103   bb.0:
105     ; CHECK-LABEL: name: test_zext_i1_to_s32
106     ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
107     ; CHECK-NEXT: $vgpr0 = COPY [[C]](s32)
108     %0:_(s1) = G_CONSTANT i1 0
109     %1:_(s32) = G_ZEXT %0
110     $vgpr0 = COPY %1
114 name: test_zext_i1_to_i64
115 body: |
116   bb.0:
118     ; CHECK-LABEL: name: test_zext_i1_to_i64
119     ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
120     ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[C]](s64)
121     %0:_(s1) = G_CONSTANT i1 0
122     %1:_(s64) = G_ZEXT %0
123     $vgpr0_vgpr1 = COPY %1
127 name: test_zext_v2s16_to_v2s32
128 body: |
129   bb.0:
130     liveins: $vgpr0
132     ; CHECK-LABEL: name: test_zext_v2s16_to_v2s32
133     ; CHECK: liveins: $vgpr0
134     ; CHECK-NEXT: {{  $}}
135     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s16>) = COPY $vgpr0
136     ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[COPY]](<2 x s16>)
137     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
138     ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BITCAST]], [[C]](s32)
139     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
140     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[BITCAST]], [[C1]]
141     ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[LSHR]], [[C1]]
142     ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[AND]](s32), [[AND1]](s32)
143     ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[BUILD_VECTOR]](<2 x s32>)
144     %0:_(<2 x s16>) = COPY $vgpr0
145     %1:_(<2 x s32>) = G_ZEXT %0
146     $vgpr0_vgpr1 = COPY %1
150 name: test_zext_v3s16_to_v3s32
151 body: |
152   bb.0:
153     liveins: $vgpr0_vgpr1
155     ; CHECK-LABEL: name: test_zext_v3s16_to_v3s32
156     ; CHECK: liveins: $vgpr0_vgpr1
157     ; CHECK-NEXT: {{  $}}
158     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $vgpr0_vgpr1
159     ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x s16>), [[UV1:%[0-9]+]]:_(<2 x s16>) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
160     ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[UV]](<2 x s16>)
161     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
162     ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BITCAST]], [[C]](s32)
163     ; CHECK-NEXT: [[BITCAST1:%[0-9]+]]:_(s32) = G_BITCAST [[UV1]](<2 x s16>)
164     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
165     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[BITCAST]], [[C1]]
166     ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[LSHR]], [[C1]]
167     ; CHECK-NEXT: [[AND2:%[0-9]+]]:_(s32) = G_AND [[BITCAST1]], [[C1]]
168     ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<3 x s32>) = G_BUILD_VECTOR [[AND]](s32), [[AND1]](s32), [[AND2]](s32)
169     ; CHECK-NEXT: $vgpr0_vgpr1_vgpr2 = COPY [[BUILD_VECTOR]](<3 x s32>)
170     %0:_(<4 x s16>) = COPY $vgpr0_vgpr1
171     %1:_(<3 x s16>) = G_EXTRACT %0, 0
172     %2:_(<3 x s32>) = G_ZEXT %1
173     $vgpr0_vgpr1_vgpr2 = COPY %2
177 name: test_zext_v4s16_to_v4s32
178 body: |
179   bb.0:
180     liveins: $vgpr0_vgpr1
182     ; CHECK-LABEL: name: test_zext_v4s16_to_v4s32
183     ; CHECK: liveins: $vgpr0_vgpr1
184     ; CHECK-NEXT: {{  $}}
185     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $vgpr0_vgpr1
186     ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x s16>), [[UV1:%[0-9]+]]:_(<2 x s16>) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
187     ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[UV]](<2 x s16>)
188     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
189     ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[BITCAST]], [[C]](s32)
190     ; CHECK-NEXT: [[BITCAST1:%[0-9]+]]:_(s32) = G_BITCAST [[UV1]](<2 x s16>)
191     ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(s32) = G_LSHR [[BITCAST1]], [[C]](s32)
192     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
193     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[BITCAST]], [[C1]]
194     ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[LSHR]], [[C1]]
195     ; CHECK-NEXT: [[AND2:%[0-9]+]]:_(s32) = G_AND [[BITCAST1]], [[C1]]
196     ; CHECK-NEXT: [[AND3:%[0-9]+]]:_(s32) = G_AND [[LSHR1]], [[C1]]
197     ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[AND]](s32), [[AND1]](s32), [[AND2]](s32), [[AND3]](s32)
198     ; CHECK-NEXT: $vgpr0_vgpr1_vgpr2_vgpr3 = COPY [[BUILD_VECTOR]](<4 x s32>)
199     %0:_(<4 x s16>) = COPY $vgpr0_vgpr1
200     %1:_(<4 x s32>) = G_ZEXT %0
201     $vgpr0_vgpr1_vgpr2_vgpr3 = COPY %1
205 name: test_zext_v2s32_to_v2s64
206 body: |
207   bb.0:
208     liveins: $vgpr0_vgpr1
210     ; CHECK-LABEL: name: test_zext_v2s32_to_v2s64
211     ; CHECK: liveins: $vgpr0_vgpr1
212     ; CHECK-NEXT: {{  $}}
213     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1
214     ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>)
215     ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[UV]](s32)
216     ; CHECK-NEXT: [[ZEXT1:%[0-9]+]]:_(s64) = G_ZEXT [[UV1]](s32)
217     ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[ZEXT]](s64), [[ZEXT1]](s64)
218     ; CHECK-NEXT: $vgpr0_vgpr1_vgpr2_vgpr3 = COPY [[BUILD_VECTOR]](<2 x s64>)
219     %0:_(<2 x s32>) = COPY $vgpr0_vgpr1
220     %1:_(<2 x s64>) = G_ZEXT %0
221     $vgpr0_vgpr1_vgpr2_vgpr3 = COPY %1
225 name: test_zext_v3s32_to_v3s64
226 body: |
227   bb.0:
228     liveins: $vgpr0_vgpr1_vgpr2
230     ; CHECK-LABEL: name: test_zext_v3s32_to_v3s64
231     ; CHECK: liveins: $vgpr0_vgpr1_vgpr2
232     ; CHECK-NEXT: {{  $}}
233     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2
234     ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<3 x s32>)
235     ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[UV]](s32)
236     ; CHECK-NEXT: [[ZEXT1:%[0-9]+]]:_(s64) = G_ZEXT [[UV1]](s32)
237     ; CHECK-NEXT: [[ZEXT2:%[0-9]+]]:_(s64) = G_ZEXT [[UV2]](s32)
238     ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<3 x s64>) = G_BUILD_VECTOR [[ZEXT]](s64), [[ZEXT1]](s64), [[ZEXT2]](s64)
239     ; CHECK-NEXT: S_NOP 0, implicit [[BUILD_VECTOR]](<3 x s64>)
240     %0:_(<3 x s32>) = COPY $vgpr0_vgpr1_vgpr2
241     %1:_(<3 x s64>) = G_ZEXT %0
242     S_NOP 0, implicit %1
247 name: test_zext_v4s32_to_v4s64
248 body: |
249   bb.0:
250     liveins: $vgpr0_vgpr1_vgpr2_vgpr3
252     ; CHECK-LABEL: name: test_zext_v4s32_to_v4s64
253     ; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
254     ; CHECK-NEXT: {{  $}}
255     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
256     ; 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>)
257     ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[UV]](s32)
258     ; CHECK-NEXT: [[ZEXT1:%[0-9]+]]:_(s64) = G_ZEXT [[UV1]](s32)
259     ; CHECK-NEXT: [[ZEXT2:%[0-9]+]]:_(s64) = G_ZEXT [[UV2]](s32)
260     ; CHECK-NEXT: [[ZEXT3:%[0-9]+]]:_(s64) = G_ZEXT [[UV3]](s32)
261     ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s64>) = G_BUILD_VECTOR [[ZEXT]](s64), [[ZEXT1]](s64), [[ZEXT2]](s64), [[ZEXT3]](s64)
262     ; CHECK-NEXT: $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7 = COPY [[BUILD_VECTOR]](<4 x s64>)
263     %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
264     %1:_(<4 x s64>) = G_ZEXT %0
265     $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7 = COPY %1
269 name: test_zext_s8_to_s16
270 body: |
271   bb.0:
272     liveins: $vgpr0
274     ; CHECK-LABEL: name: test_zext_s8_to_s16
275     ; CHECK: liveins: $vgpr0
276     ; CHECK-NEXT: {{  $}}
277     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
278     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 255
279     ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)
280     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s16) = G_AND [[TRUNC]], [[C]]
281     ; CHECK-NEXT: S_ENDPGM 0, implicit [[AND]](s16)
282     %0:_(s32) = COPY $vgpr0
283     %1:_(s8) = G_TRUNC %0
284     %2:_(s16) = G_ZEXT %1
285     S_ENDPGM 0, implicit %2
289 name: test_zext_s8_to_s24
290 body: |
291   bb.0:
292     liveins: $vgpr0
294     ; CHECK-LABEL: name: test_zext_s8_to_s24
295     ; CHECK: liveins: $vgpr0
296     ; CHECK-NEXT: {{  $}}
297     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
298     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
299     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]
300     ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s24) = G_TRUNC [[AND]](s32)
301     ; CHECK-NEXT: S_ENDPGM 0, implicit [[TRUNC]](s24)
302     %0:_(s32) = COPY $vgpr0
303     %1:_(s8) = G_TRUNC %0
304     %2:_(s24) = G_ZEXT %1
305     S_ENDPGM 0, implicit %2
310 name: test_zext_s7_to_s32
311 body: |
312   bb.0:
313     liveins: $vgpr0
315     ; CHECK-LABEL: name: test_zext_s7_to_s32
316     ; CHECK: liveins: $vgpr0
317     ; CHECK-NEXT: {{  $}}
318     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
319     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 127
320     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]
321     ; CHECK-NEXT: S_ENDPGM 0, implicit [[AND]](s32)
322     %0:_(s32) = COPY $vgpr0
323     %1:_(s7) = G_TRUNC %0
324     %2:_(s32) = G_ZEXT %1
325     S_ENDPGM 0, implicit %2
329 name: test_zext_s8_to_s32
330 body: |
331   bb.0:
332     liveins: $vgpr0
334     ; CHECK-LABEL: name: test_zext_s8_to_s32
335     ; CHECK: liveins: $vgpr0
336     ; CHECK-NEXT: {{  $}}
337     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
338     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 255
339     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C]]
340     ; CHECK-NEXT: S_ENDPGM 0, implicit [[AND]](s32)
341     %0:_(s32) = COPY $vgpr0
342     %1:_(s8) = G_TRUNC %0
343     %2:_(s32) = G_ZEXT %1
344     S_ENDPGM 0, implicit %2
348 name: test_zext_s32_to_s128
349 body: |
350   bb.0:
351     liveins: $vgpr0
353     ; CHECK-LABEL: name: test_zext_s32_to_s128
354     ; CHECK: liveins: $vgpr0
355     ; CHECK-NEXT: {{  $}}
356     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
357     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
358     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[C]](s32)
359     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
360     ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[MV]](s64), [[C1]](s64)
361     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV1]](s128)
362     %0:_(s32) = COPY $vgpr0
363     %1:_(s128) = G_ZEXT %0
364     S_ENDPGM 0, implicit %1
368 name: test_zext_s32_to_s160
369 body: |
370   bb.0:
371     liveins: $vgpr0
373     ; CHECK-LABEL: name: test_zext_s32_to_s160
374     ; CHECK: liveins: $vgpr0
375     ; CHECK-NEXT: {{  $}}
376     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
377     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
378     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[C]](s32)
379     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
380     ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s320) = G_MERGE_VALUES [[MV]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64)
381     ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s160) = G_TRUNC [[MV1]](s320)
382     ; CHECK-NEXT: S_ENDPGM 0, implicit [[TRUNC]](s160)
383     %0:_(s32) = COPY $vgpr0
384     %1:_(s160) = G_ZEXT %0
385     S_ENDPGM 0, implicit %1
390 name: test_zext_s32_to_s192
391 body: |
392   bb.0:
393     liveins: $vgpr0
395     ; CHECK-LABEL: name: test_zext_s32_to_s192
396     ; CHECK: liveins: $vgpr0
397     ; CHECK-NEXT: {{  $}}
398     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
399     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
400     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[C]](s32)
401     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
402     ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s192) = G_MERGE_VALUES [[MV]](s64), [[C1]](s64), [[C1]](s64)
403     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV1]](s192)
404     %0:_(s32) = COPY $vgpr0
405     %1:_(s192) = G_ZEXT %0
406     S_ENDPGM 0, implicit %1
410 name: test_zext_s32_to_s224
411 body: |
412   bb.0:
413     liveins: $vgpr0
415     ; CHECK-LABEL: name: test_zext_s32_to_s224
416     ; CHECK: liveins: $vgpr0
417     ; CHECK-NEXT: {{  $}}
418     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
419     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
420     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[C]](s32)
421     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
422     ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s448) = G_MERGE_VALUES [[MV]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64)
423     ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s224) = G_TRUNC [[MV1]](s448)
424     ; CHECK-NEXT: S_ENDPGM 0, implicit [[TRUNC]](s224)
425     %0:_(s32) = COPY $vgpr0
426     %1:_(s224) = G_ZEXT %0
427     S_ENDPGM 0, implicit %1
431 name: test_zext_s32_to_s256
432 body: |
433   bb.0:
434     liveins: $vgpr0
436     ; CHECK-LABEL: name: test_zext_s32_to_s256
437     ; CHECK: liveins: $vgpr0
438     ; CHECK-NEXT: {{  $}}
439     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
440     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
441     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[C]](s32)
442     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
443     ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s256) = G_MERGE_VALUES [[MV]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64)
444     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV1]](s256)
445     %0:_(s32) = COPY $vgpr0
446     %1:_(s256) = G_ZEXT %0
447     S_ENDPGM 0, implicit %1
451 name: test_zext_s32_to_s512
452 body: |
453   bb.0:
454     liveins: $vgpr0
456     ; CHECK-LABEL: name: test_zext_s32_to_s512
457     ; CHECK: liveins: $vgpr0
458     ; CHECK-NEXT: {{  $}}
459     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
460     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
461     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[C]](s32)
462     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
463     ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s512) = G_MERGE_VALUES [[MV]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64)
464     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV1]](s512)
465     %0:_(s32) = COPY $vgpr0
466     %1:_(s512) = G_ZEXT %0
467     S_ENDPGM 0, implicit %1
471 name: test_zext_s32_to_s992
472 body: |
473   bb.0:
474     liveins: $vgpr0
476     ; CHECK-LABEL: name: test_zext_s32_to_s992
477     ; CHECK: liveins: $vgpr0
478     ; CHECK-NEXT: {{  $}}
479     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
480     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
481     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[C]](s32)
482     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
483     ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s448) = G_MERGE_VALUES [[MV]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64)
484     ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s224) = G_TRUNC [[MV1]](s448)
485     ; CHECK-NEXT: S_ENDPGM 0, implicit [[TRUNC]](s224)
486     %0:_(s32) = COPY $vgpr0
487     %1:_(s224) = G_ZEXT %0
488     S_ENDPGM 0, implicit %1
492 name: test_zext_s32_to_s1024
493 body: |
494   bb.0:
495     liveins: $vgpr0
497     ; CHECK-LABEL: name: test_zext_s32_to_s1024
498     ; CHECK: liveins: $vgpr0
499     ; CHECK-NEXT: {{  $}}
500     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
501     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
502     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[C]](s32)
503     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
504     ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s1024) = G_MERGE_VALUES [[MV]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64), [[C1]](s64)
505     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV1]](s1024)
506     %0:_(s32) = COPY $vgpr0
507     %1:_(s1024) = G_ZEXT %0
508     S_ENDPGM 0, implicit %1
512 name: test_zext_s64_to_s128
513 body: |
514   bb.0:
515     liveins: $vgpr0_vgpr1
517     ; CHECK-LABEL: name: test_zext_s64_to_s128
518     ; CHECK: liveins: $vgpr0_vgpr1
519     ; CHECK-NEXT: {{  $}}
520     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
521     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
522     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[COPY]](s64), [[C]](s64)
523     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV]](s128)
524     %0:_(s64) = COPY $vgpr0_vgpr1
525     %1:_(s128) = G_ZEXT %0
526     S_ENDPGM 0, implicit %1
530 name: test_zext_s64_to_s192
531 body: |
532   bb.0:
533     liveins: $vgpr0_vgpr1
535     ; CHECK-LABEL: name: test_zext_s64_to_s192
536     ; CHECK: liveins: $vgpr0_vgpr1
537     ; CHECK-NEXT: {{  $}}
538     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
539     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
540     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s192) = G_MERGE_VALUES [[COPY]](s64), [[C]](s64), [[C]](s64)
541     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV]](s192)
542     %0:_(s64) = COPY $vgpr0_vgpr1
543     %1:_(s192) = G_ZEXT %0
544     S_ENDPGM 0, implicit %1
548 name: test_zext_s64_to_s256
549 body: |
550   bb.0:
551     liveins: $vgpr0_vgpr1
553     ; CHECK-LABEL: name: test_zext_s64_to_s256
554     ; CHECK: liveins: $vgpr0_vgpr1
555     ; CHECK-NEXT: {{  $}}
556     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
557     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
558     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s256) = G_MERGE_VALUES [[COPY]](s64), [[C]](s64), [[C]](s64), [[C]](s64)
559     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV]](s256)
560     %0:_(s64) = COPY $vgpr0_vgpr1
561     %1:_(s256) = G_ZEXT %0
562     S_ENDPGM 0, implicit %1
566 name: test_zext_s64_to_s512
567 body: |
568   bb.0:
569     liveins: $vgpr0_vgpr1
571     ; CHECK-LABEL: name: test_zext_s64_to_s512
572     ; CHECK: liveins: $vgpr0_vgpr1
573     ; CHECK-NEXT: {{  $}}
574     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
575     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
576     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s512) = G_MERGE_VALUES [[COPY]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64)
577     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV]](s512)
578     %0:_(s64) = COPY $vgpr0_vgpr1
579     %1:_(s512) = G_ZEXT %0
580     S_ENDPGM 0, implicit %1
584 name: test_zext_s64_to_s1024
585 body: |
586   bb.0:
587     liveins: $vgpr0_vgpr1
589     ; CHECK-LABEL: name: test_zext_s64_to_s1024
590     ; CHECK: liveins: $vgpr0_vgpr1
591     ; CHECK-NEXT: {{  $}}
592     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
593     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
594     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s1024) = G_MERGE_VALUES [[COPY]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64), [[C]](s64)
595     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV]](s1024)
596     %0:_(s64) = COPY $vgpr0_vgpr1
597     %1:_(s1024) = G_ZEXT %0
598     S_ENDPGM 0, implicit %1
602 name: test_zext_s96_to_s128
603 body: |
604   bb.0:
605     liveins: $vgpr0_vgpr1_vgpr2
607     ; CHECK-LABEL: name: test_zext_s96_to_s128
608     ; CHECK: liveins: $vgpr0_vgpr1_vgpr2
609     ; CHECK-NEXT: {{  $}}
610     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s96) = COPY $vgpr0_vgpr1_vgpr2
611     ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s96)
612     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
613     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV]](s32), [[UV1]](s32)
614     ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV2]](s32), [[C]](s32)
615     ; CHECK-NEXT: [[MV2:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[MV]](s64), [[MV1]](s64)
616     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV2]](s128)
617     %0:_(s96) = COPY $vgpr0_vgpr1_vgpr2
618     %1:_(s128) = G_ZEXT %0
619     S_ENDPGM 0, implicit %1
623 name: test_zext_s128_to_s256
624 body: |
625   bb.0:
626     liveins: $vgpr0_vgpr1_vgpr2_vgpr3
628     ; CHECK-LABEL: name: test_zext_s128_to_s256
629     ; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
630     ; CHECK-NEXT: {{  $}}
631     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
632     ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[COPY]](s128)
633     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
634     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s256) = G_MERGE_VALUES [[UV]](s64), [[UV1]](s64), [[C]](s64), [[C]](s64)
635     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV]](s256)
636     %0:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
637     %1:_(s256) = G_ZEXT %0
638     S_ENDPGM 0, implicit %1
642 name: test_zext_s32_to_s88
643 body: |
644   bb.0:
645     liveins: $vgpr0
647     ; CHECK-LABEL: name: test_zext_s32_to_s88
648     ; CHECK: liveins: $vgpr0
649     ; CHECK-NEXT: {{  $}}
650     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
651     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8
652     ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32)
653     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
654     ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C1]](s32)
655     ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 24
656     ; CHECK-NEXT: [[LSHR2:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C2]](s32)
657     ; CHECK-NEXT: [[C3:%[0-9]+]]:_(s16) = G_CONSTANT i16 255
658     ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)
659     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s16) = G_AND [[TRUNC]], [[C3]]
660     ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32)
661     ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s16) = G_AND [[TRUNC1]], [[C3]]
662     ; CHECK-NEXT: [[C4:%[0-9]+]]:_(s16) = G_CONSTANT i16 8
663     ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s16) = G_SHL [[AND1]], [[C4]](s16)
664     ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s16) = G_OR [[AND]], [[SHL]]
665     ; CHECK-NEXT: [[TRUNC2:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR1]](s32)
666     ; CHECK-NEXT: [[AND2:%[0-9]+]]:_(s16) = G_AND [[TRUNC2]], [[C3]]
667     ; CHECK-NEXT: [[TRUNC3:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR2]](s32)
668     ; CHECK-NEXT: [[AND3:%[0-9]+]]:_(s16) = G_AND [[TRUNC3]], [[C3]]
669     ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s16) = G_SHL [[AND3]], [[C4]](s16)
670     ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s16) = G_OR [[AND2]], [[SHL1]]
671     ; CHECK-NEXT: [[C5:%[0-9]+]]:_(s16) = G_CONSTANT i16 0
672     ; CHECK-NEXT: [[AND4:%[0-9]+]]:_(s16) = G_AND [[C5]], [[C3]]
673     ; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(s16) = G_SHL [[AND4]], [[C4]](s16)
674     ; CHECK-NEXT: [[OR2:%[0-9]+]]:_(s16) = G_OR [[AND4]], [[SHL2]]
675     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s16) = COPY [[OR2]](s16)
676     ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[OR]](s16)
677     ; CHECK-NEXT: [[ZEXT1:%[0-9]+]]:_(s32) = G_ZEXT [[OR1]](s16)
678     ; CHECK-NEXT: [[SHL3:%[0-9]+]]:_(s32) = G_SHL [[ZEXT1]], [[C1]](s32)
679     ; CHECK-NEXT: [[OR3:%[0-9]+]]:_(s32) = G_OR [[ZEXT]], [[SHL3]]
680     ; CHECK-NEXT: [[ZEXT2:%[0-9]+]]:_(s32) = G_ZEXT [[OR2]](s16)
681     ; CHECK-NEXT: [[ZEXT3:%[0-9]+]]:_(s32) = G_ZEXT [[COPY1]](s16)
682     ; CHECK-NEXT: [[SHL4:%[0-9]+]]:_(s32) = G_SHL [[ZEXT3]], [[C1]](s32)
683     ; CHECK-NEXT: [[OR4:%[0-9]+]]:_(s32) = G_OR [[ZEXT2]], [[SHL4]]
684     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[OR3]](s32), [[OR4]](s32)
685     ; CHECK-NEXT: [[C6:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
686     ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s704) = G_MERGE_VALUES [[MV]](s64), [[C6]](s64), [[C6]](s64), [[C6]](s64), [[C6]](s64), [[C6]](s64), [[C6]](s64), [[C6]](s64), [[C6]](s64), [[C6]](s64), [[C6]](s64)
687     ; CHECK-NEXT: [[TRUNC4:%[0-9]+]]:_(s88) = G_TRUNC [[MV1]](s704)
688     ; CHECK-NEXT: S_ENDPGM 0, implicit [[TRUNC4]](s88)
689     %0:_(s32) = COPY $vgpr0
690     %1:_(s88) = G_ZEXT %0
691     S_ENDPGM 0, implicit %1
694 # The instruction count blows up for this and takes too long to
695 # generate checks. This fails on a G_MERGE_VALUES to s4160
697 # ---
698 # name: test_zext_s32_to_s65
699 # body: |
700 #   bb.0:
701 #     liveins: $vgpr0
703 #     %0:_(s32) = COPY $vgpr0
704 #     %1:_(s65) = G_ZEXT %0
705 #     S_ENDPGM 0, implicit %1
706 # ...
709 name: test_zext_s2_to_s112
710 body: |
711   bb.0:
712     liveins: $vgpr0
714     ; CHECK-LABEL: name: test_zext_s2_to_s112
715     ; CHECK: liveins: $vgpr0
716     ; CHECK-NEXT: {{  $}}
717     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
718     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 3
719     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
720     ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[C1]](s64)
721     ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 16
722     ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[UV]], [[C2]](s32)
723     ; CHECK-NEXT: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 65535
724     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s32) = G_AND [[UV]], [[C3]]
725     ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s32) = G_AND [[LSHR]], [[C3]]
726     ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[AND1]], [[C2]](s32)
727     ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
728     ; CHECK-NEXT: [[AND2:%[0-9]+]]:_(s32) = G_AND [[UV1]], [[C3]]
729     ; CHECK-NEXT: [[C4:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
730     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY [[C4]](s32)
731     ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(s32) = G_SHL [[COPY1]], [[C2]](s32)
732     ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[AND2]], [[SHL1]]
733     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[OR]](s32), [[OR1]](s32)
734     ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C2]](s32)
735     ; CHECK-NEXT: [[AND3:%[0-9]+]]:_(s32) = G_AND [[COPY]], [[C3]]
736     ; CHECK-NEXT: [[AND4:%[0-9]+]]:_(s32) = G_AND [[LSHR1]], [[C3]]
737     ; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(s32) = G_SHL [[AND4]], [[C2]](s32)
738     ; CHECK-NEXT: [[OR2:%[0-9]+]]:_(s32) = G_OR [[AND3]], [[SHL2]]
739     ; CHECK-NEXT: [[SHL3:%[0-9]+]]:_(s32) = G_SHL [[C4]], [[C2]](s32)
740     ; CHECK-NEXT: [[OR3:%[0-9]+]]:_(s32) = G_OR [[C4]], [[SHL3]]
741     ; CHECK-NEXT: [[MV1:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[OR2]](s32), [[OR3]](s32)
742     ; CHECK-NEXT: [[DEF:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF
743     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY [[MV1]](s64)
744     ; CHECK-NEXT: [[EXTRACT:%[0-9]+]]:_(s48) = G_EXTRACT [[DEF]](s64), 0
745     ; CHECK-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY [[C]](s64)
746     ; CHECK-NEXT: [[EXTRACT1:%[0-9]+]]:_(s48) = G_EXTRACT [[MV]](s64), 0
747     ; CHECK-NEXT: [[AND5:%[0-9]+]]:_(s64) = G_AND [[COPY2]], [[COPY3]]
748     ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[EXTRACT]](s48)
749     ; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s64) = G_ANYEXT [[EXTRACT1]](s48)
750     ; CHECK-NEXT: [[AND6:%[0-9]+]]:_(s64) = G_AND [[ANYEXT]], [[ANYEXT1]]
751     ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[AND6]](s64)
752     ; CHECK-NEXT: [[LSHR2:%[0-9]+]]:_(s32) = G_LSHR [[UV2]], [[C2]](s32)
753     ; CHECK-NEXT: [[DEF1:%[0-9]+]]:_(s64) = G_IMPLICIT_DEF
754     ; CHECK-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[DEF1]](s64)
755     ; CHECK-NEXT: [[LSHR3:%[0-9]+]]:_(s32) = G_LSHR [[UV4]], [[C2]](s32)
756     ; CHECK-NEXT: [[AND7:%[0-9]+]]:_(s32) = G_AND [[UV2]], [[C3]]
757     ; CHECK-NEXT: [[AND8:%[0-9]+]]:_(s32) = G_AND [[LSHR2]], [[C3]]
758     ; CHECK-NEXT: [[SHL4:%[0-9]+]]:_(s32) = G_SHL [[AND8]], [[C2]](s32)
759     ; CHECK-NEXT: [[OR4:%[0-9]+]]:_(s32) = G_OR [[AND7]], [[SHL4]]
760     ; CHECK-NEXT: [[AND9:%[0-9]+]]:_(s32) = G_AND [[UV3]], [[C3]]
761     ; CHECK-NEXT: [[OR5:%[0-9]+]]:_(s32) = G_OR [[AND9]], [[SHL1]]
762     ; CHECK-NEXT: [[MV2:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[OR4]](s32), [[OR5]](s32)
763     ; CHECK-NEXT: [[AND10:%[0-9]+]]:_(s32) = G_AND [[UV4]], [[C3]]
764     ; CHECK-NEXT: [[SHL5:%[0-9]+]]:_(s32) = G_SHL [[AND10]], [[C2]](s32)
765     ; CHECK-NEXT: [[OR6:%[0-9]+]]:_(s32) = G_OR [[COPY1]], [[SHL5]]
766     ; CHECK-NEXT: [[AND11:%[0-9]+]]:_(s32) = G_AND [[LSHR3]], [[C3]]
767     ; CHECK-NEXT: [[AND12:%[0-9]+]]:_(s32) = G_AND [[UV5]], [[C3]]
768     ; CHECK-NEXT: [[SHL6:%[0-9]+]]:_(s32) = G_SHL [[AND12]], [[C2]](s32)
769     ; CHECK-NEXT: [[OR7:%[0-9]+]]:_(s32) = G_OR [[AND11]], [[SHL6]]
770     ; CHECK-NEXT: [[MV3:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[OR6]](s32), [[OR7]](s32)
771     ; CHECK-NEXT: [[OR8:%[0-9]+]]:_(s32) = G_OR [[AND12]], [[SHL5]]
772     ; CHECK-NEXT: [[MV4:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV4]](s32), [[OR8]](s32)
773     ; CHECK-NEXT: [[COPY4:%[0-9]+]]:_(s32) = COPY [[OR7]](s32)
774     ; CHECK-NEXT: [[MV5:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY4]](s32), [[UV4]](s32)
775     ; CHECK-NEXT: [[OR9:%[0-9]+]]:_(s32) = G_OR [[AND12]], [[SHL1]]
776     ; CHECK-NEXT: [[OR10:%[0-9]+]]:_(s32) = G_OR [[COPY1]], [[SHL1]]
777     ; CHECK-NEXT: [[MV6:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[OR9]](s32), [[OR10]](s32)
778     ; CHECK-NEXT: [[MV7:%[0-9]+]]:_(s384) = G_MERGE_VALUES [[AND5]](s64), [[MV2]](s64), [[MV3]](s64), [[MV4]](s64), [[MV5]](s64), [[MV6]](s64)
779     ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s112) = G_TRUNC [[MV7]](s384)
780     ; CHECK-NEXT: S_ENDPGM 0, implicit [[TRUNC]](s112)
781     %0:_(s32) = COPY $vgpr0
782     %1:_(s2) = G_TRUNC %0
783     %2:_(s112) = G_ZEXT %1
784     S_ENDPGM 0, implicit %2
788 name: test_zext_s112_to_s128
789 body: |
790   bb.0:
791     liveins: $vgpr0_vgpr1_vgpr2_vgpr3
792     ; CHECK-LABEL: name: test_zext_s112_to_s128
793     ; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
794     ; CHECK-NEXT: {{  $}}
795     ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
796     ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1
797     ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 281474976710655
798     ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[COPY]](s128)
799     ; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[UV]], [[C]]
800     ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(s64) = G_AND [[UV1]], [[C1]]
801     ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s128) = G_MERGE_VALUES [[AND]](s64), [[AND1]](s64)
802     ; CHECK-NEXT: S_ENDPGM 0, implicit [[MV]](s128)
803     %0:_(s128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
804     %1:_(s112) = G_TRUNC %0
805     %2:_(s128) = G_ZEXT %1
806     S_ENDPGM 0, implicit %2