[WinEH] Emit state stores for SEH scopes (#116546)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / fold-immediate-operand-shrink.mir
blob2bf0ceaa568185a2a8bf8c47cf8c91d648df648a
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs -run-pass si-fold-operands,dead-mi-elimination  %s -o - | FileCheck -check-prefix=GCN %s
4 ---
6 name: shrink_scalar_imm_vgpr_v_add_i32_e64_no_carry_out_use
7 tracksRegLiveness: true
9 body:             |
10   bb.0:
11     ; GCN-LABEL: name: shrink_scalar_imm_vgpr_v_add_i32_e64_no_carry_out_use
12     ; GCN: [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
13     ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
14     ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 [[S_MOV_B32_]], [[DEF]], implicit-def $vcc, implicit $exec
15     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]]
16     %0:sreg_32_xm0 = S_MOV_B32 12345
17     %1:vgpr_32 = IMPLICIT_DEF
18     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
19     S_ENDPGM 0, implicit %2
21 ...
23 ---
25 name: shrink_vgpr_scalar_imm_v_add_i32_e64_no_carry_out_use
26 tracksRegLiveness: true
28 body:             |
29   bb.0:
30     ; GCN-LABEL: name: shrink_vgpr_scalar_imm_v_add_i32_e64_no_carry_out_use
31     ; GCN: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
32     ; GCN-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
33     ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 [[S_MOV_B32_]], [[DEF]], implicit-def $vcc, implicit $exec
34     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]]
35     %0:vgpr_32 = IMPLICIT_DEF
36     %1:sreg_32_xm0 = S_MOV_B32 12345
37     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
38     S_ENDPGM 0, implicit %2
40 ...
41 ---
43 name: shrink_scalar_imm_vgpr_v_add_i32_e64_carry_out_use
44 tracksRegLiveness: true
46 body:             |
47   bb.0:
48     ; GCN-LABEL: name: shrink_scalar_imm_vgpr_v_add_i32_e64_carry_out_use
49     ; GCN: [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
50     ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
51     ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 [[S_MOV_B32_]], [[DEF]], implicit-def $vcc, implicit $exec
52     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]]
53     %0:sreg_32_xm0 = S_MOV_B32 12345
54     %1:vgpr_32 = IMPLICIT_DEF
55     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
56     S_ENDPGM 0, implicit %2
58 ...
59 ---
61 # This does not shrink because it would violate the constant bus
62 # restriction. to have an SGPR input and an immediate, so a copy would
63 # be required.
65 name: shrink_vector_imm_sgpr_v_add_i32_e64_no_carry_out_use
66 tracksRegLiveness: true
68 body:             |
69   bb.0:
70     ; GCN-LABEL: name: shrink_vector_imm_sgpr_v_add_i32_e64_no_carry_out_use
71     ; GCN: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 12345, implicit $exec
72     ; GCN-NEXT: [[DEF:%[0-9]+]]:sreg_32_xm0 = IMPLICIT_DEF
73     ; GCN-NEXT: [[V_ADD_CO_U32_e64_:%[0-9]+]]:vgpr_32, [[V_ADD_CO_U32_e64_1:%[0-9]+]]:sreg_64 = V_ADD_CO_U32_e64 [[DEF]], [[V_MOV_B32_e32_]], 0, implicit $exec
74     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e64_]]
75     %0:vgpr_32 = V_MOV_B32_e32 12345, implicit $exec
76     %1:sreg_32_xm0 = IMPLICIT_DEF
77     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
78     S_ENDPGM 0, implicit %2
80 ...
82 ---
84 name: shrink_sgpr_vector_imm_v_add_i32_e64_no_carry_out_use
85 tracksRegLiveness: true
87 body:             |
88   bb.0:
89     ; GCN-LABEL: name: shrink_sgpr_vector_imm_v_add_i32_e64_no_carry_out_use
90     ; GCN: [[DEF:%[0-9]+]]:sreg_32_xm0 = IMPLICIT_DEF
91     ; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 12345, implicit $exec
92     ; GCN-NEXT: [[V_ADD_CO_U32_e64_:%[0-9]+]]:vgpr_32, [[V_ADD_CO_U32_e64_1:%[0-9]+]]:sreg_64 = V_ADD_CO_U32_e64 [[V_MOV_B32_e32_]], [[DEF]], 0, implicit $exec
93     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e64_]]
94     %0:sreg_32_xm0 = IMPLICIT_DEF
95     %1:vgpr_32 = V_MOV_B32_e32 12345, implicit $exec
96     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
97     S_ENDPGM 0, implicit %2
99 ...
103 name: shrink_scalar_imm_vgpr_v_add_i32_e64_live_vcc_use
104 tracksRegLiveness: true
106 body:             |
107   bb.0:
108     ; GCN-LABEL: name: shrink_scalar_imm_vgpr_v_add_i32_e64_live_vcc_use
109     ; GCN: $vcc = S_MOV_B64 -1
110     ; GCN-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
111     ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
112     ; GCN-NEXT: [[V_ADD_CO_U32_e64_:%[0-9]+]]:vgpr_32, [[V_ADD_CO_U32_e64_1:%[0-9]+]]:sreg_64 = V_ADD_CO_U32_e64 [[S_MOV_B32_]], [[DEF]], 0, implicit $exec
113     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e64_]], implicit $vcc
114     $vcc = S_MOV_B64 -1
115     %0:sreg_32_xm0 = S_MOV_B32 12345
116     %1:vgpr_32 = IMPLICIT_DEF
117     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
118     S_ENDPGM 0, implicit %2, implicit $vcc
124 name: shrink_scalar_imm_vgpr_v_add_i32_e64_liveout_vcc_use
125 tracksRegLiveness: true
127 body:             |
128   ; GCN-LABEL: name: shrink_scalar_imm_vgpr_v_add_i32_e64_liveout_vcc_use
129   ; GCN: bb.0:
130   ; GCN-NEXT:   successors: %bb.1(0x80000000)
131   ; GCN-NEXT: {{  $}}
132   ; GCN-NEXT:   $vcc = S_MOV_B64 -1
133   ; GCN-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
134   ; GCN-NEXT:   [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
135   ; GCN-NEXT:   [[V_ADD_CO_U32_e64_:%[0-9]+]]:vgpr_32, [[V_ADD_CO_U32_e64_1:%[0-9]+]]:sreg_64 = V_ADD_CO_U32_e64 [[S_MOV_B32_]], [[DEF]], 0, implicit $exec
136   ; GCN-NEXT: {{  $}}
137   ; GCN-NEXT: bb.1:
138   ; GCN-NEXT:   liveins: $vcc
139   ; GCN-NEXT: {{  $}}
140   ; GCN-NEXT:   S_ENDPGM 0, implicit [[V_ADD_CO_U32_e64_]], implicit $vcc
141   bb.0:
142     successors: %bb.1
143     $vcc = S_MOV_B64 -1
144     %0:sreg_32_xm0 = S_MOV_B32 12345
145     %1:vgpr_32 = IMPLICIT_DEF
146     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
148   bb.1:
149     liveins: $vcc
150     S_ENDPGM 0, implicit %2, implicit $vcc
155 name: shrink_scalar_imm_vgpr_v_add_i32_e64_liveout_vcc_lo_use
156 tracksRegLiveness: true
158 body:             |
159   ; GCN-LABEL: name: shrink_scalar_imm_vgpr_v_add_i32_e64_liveout_vcc_lo_use
160   ; GCN: bb.0:
161   ; GCN-NEXT:   successors: %bb.1(0x80000000)
162   ; GCN-NEXT: {{  $}}
163   ; GCN-NEXT:   $vcc = S_MOV_B64 -1
164   ; GCN-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
165   ; GCN-NEXT:   [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
166   ; GCN-NEXT:   [[V_ADD_CO_U32_e64_:%[0-9]+]]:vgpr_32, [[V_ADD_CO_U32_e64_1:%[0-9]+]]:sreg_64 = V_ADD_CO_U32_e64 [[S_MOV_B32_]], [[DEF]], 0, implicit $exec
167   ; GCN-NEXT: {{  $}}
168   ; GCN-NEXT: bb.1:
169   ; GCN-NEXT:   liveins: $vcc_lo
170   ; GCN-NEXT: {{  $}}
171   ; GCN-NEXT:   S_ENDPGM 0, implicit [[V_ADD_CO_U32_e64_]], implicit $vcc_lo
172   bb.0:
173     successors: %bb.1
174     $vcc = S_MOV_B64 -1
175     %0:sreg_32_xm0 = S_MOV_B32 12345
176     %1:vgpr_32 = IMPLICIT_DEF
177     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
179   bb.1:
180     liveins: $vcc_lo
181     S_ENDPGM 0, implicit %2, implicit $vcc_lo
186 # This is not OK to clobber because vcc_lo has a livein use.
188 name: shrink_scalar_imm_vgpr_v_add_i32_e64_livein_vcc
189 tracksRegLiveness: true
191 body:             |
192   ; GCN-LABEL: name: shrink_scalar_imm_vgpr_v_add_i32_e64_livein_vcc
193   ; GCN: bb.0:
194   ; GCN-NEXT:   successors: %bb.1(0x80000000)
195   ; GCN-NEXT: {{  $}}
196   ; GCN-NEXT:   $vcc = S_MOV_B64 -1
197   ; GCN-NEXT: {{  $}}
198   ; GCN-NEXT: bb.1:
199   ; GCN-NEXT:   liveins: $vcc
200   ; GCN-NEXT: {{  $}}
201   ; GCN-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
202   ; GCN-NEXT:   [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
203   ; GCN-NEXT:   [[V_ADD_CO_U32_e64_:%[0-9]+]]:vgpr_32, [[V_ADD_CO_U32_e64_1:%[0-9]+]]:sreg_64 = V_ADD_CO_U32_e64 [[S_MOV_B32_]], [[DEF]], 0, implicit $exec
204   ; GCN-NEXT:   S_ENDPGM 0, implicit [[V_ADD_CO_U32_e64_]], implicit $vcc_lo
205   bb.0:
206     successors: %bb.1
207     $vcc = S_MOV_B64 -1
209   bb.1:
210     liveins: $vcc
211     %0:sreg_32_xm0 = S_MOV_B32 12345
212     %1:vgpr_32 = IMPLICIT_DEF
213     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
214     S_ENDPGM 0, implicit %2, implicit $vcc_lo
219 name: shrink_scalar_imm_vgpr_v_add_i32_e64_livein_vcc_hi
220 tracksRegLiveness: true
222 body:             |
223   ; GCN-LABEL: name: shrink_scalar_imm_vgpr_v_add_i32_e64_livein_vcc_hi
224   ; GCN: bb.0:
225   ; GCN-NEXT:   successors: %bb.1(0x80000000)
226   ; GCN-NEXT: {{  $}}
227   ; GCN-NEXT:   $vcc_hi = S_MOV_B32 -1
228   ; GCN-NEXT: {{  $}}
229   ; GCN-NEXT: bb.1:
230   ; GCN-NEXT:   successors: %bb.2(0x80000000)
231   ; GCN-NEXT:   liveins: $vcc_hi
232   ; GCN-NEXT: {{  $}}
233   ; GCN-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
234   ; GCN-NEXT:   [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
235   ; GCN-NEXT:   [[V_ADD_CO_U32_e64_:%[0-9]+]]:vgpr_32, [[V_ADD_CO_U32_e64_1:%[0-9]+]]:sreg_64 = V_ADD_CO_U32_e64 [[S_MOV_B32_]], [[DEF]], 0, implicit $exec
236   ; GCN-NEXT: {{  $}}
237   ; GCN-NEXT: bb.2:
238   ; GCN-NEXT:   liveins: $vcc_hi
239   ; GCN-NEXT: {{  $}}
240   ; GCN-NEXT:   S_ENDPGM 0, implicit [[V_ADD_CO_U32_e64_]], implicit $vcc_hi
241   bb.0:
242     successors: %bb.1
243     $vcc_hi = S_MOV_B32 -1
245   bb.1:
246     liveins: $vcc_hi
247     %0:sreg_32_xm0 = S_MOV_B32 12345
248     %1:vgpr_32 = IMPLICIT_DEF
249     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
251   bb.2:
252     liveins: $vcc_hi
254     S_ENDPGM 0, implicit %2, implicit $vcc_hi
260 name: shrink_scalar_imm_vgpr_v_sub_i32_e64_no_carry_out_use
261 tracksRegLiveness: true
263 body:             |
264   bb.0:
265     ; GCN-LABEL: name: shrink_scalar_imm_vgpr_v_sub_i32_e64_no_carry_out_use
266     ; GCN: [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
267     ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
268     ; GCN-NEXT: [[V_SUB_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_SUB_CO_U32_e32 [[S_MOV_B32_]], [[DEF]], implicit-def $vcc, implicit $exec
269     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_SUB_CO_U32_e32_]]
270     %0:sreg_32_xm0 = S_MOV_B32 12345
271     %1:vgpr_32 = IMPLICIT_DEF
272     %2:vgpr_32, %3:sreg_64 = V_SUB_CO_U32_e64 %0, %1, 0, implicit $exec
273     S_ENDPGM 0, implicit %2
279 name: shrink_vgpr_scalar_imm_v_sub_i32_e64_no_carry_out_use
280 tracksRegLiveness: true
282 body:             |
283   bb.0:
284     ; GCN-LABEL: name: shrink_vgpr_scalar_imm_v_sub_i32_e64_no_carry_out_use
285     ; GCN: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
286     ; GCN-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
287     ; GCN-NEXT: [[V_SUBREV_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_SUBREV_CO_U32_e32 [[S_MOV_B32_]], [[DEF]], implicit-def $vcc, implicit $exec
288     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_SUBREV_CO_U32_e32_]]
289     %0:vgpr_32 = IMPLICIT_DEF
290     %1:sreg_32_xm0 = S_MOV_B32 12345
291     %2:vgpr_32, %3:sreg_64 = V_SUB_CO_U32_e64 %0, %1, 0, implicit $exec
292     S_ENDPGM 0, implicit %2
298 name: shrink_scalar_imm_vgpr_v_subrev_i32_e64_no_carry_out_use
299 tracksRegLiveness: true
301 body:             |
302   bb.0:
303     ; GCN-LABEL: name: shrink_scalar_imm_vgpr_v_subrev_i32_e64_no_carry_out_use
304     ; GCN: [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
305     ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
306     ; GCN-NEXT: [[V_SUBREV_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_SUBREV_CO_U32_e32 [[S_MOV_B32_]], [[DEF]], implicit-def $vcc, implicit $exec
307     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_SUBREV_CO_U32_e32_]]
308     %0:sreg_32_xm0 = S_MOV_B32 12345
309     %1:vgpr_32 = IMPLICIT_DEF
310     %2:vgpr_32, %3:sreg_64 = V_SUBREV_CO_U32_e64 %0, %1, 0, implicit $exec
311     S_ENDPGM 0, implicit %2
317 name: shrink_vgpr_scalar_imm_v_subrev_i32_e64_no_carry_out_use
318 tracksRegLiveness: true
320 body:             |
321   bb.0:
322     ; GCN-LABEL: name: shrink_vgpr_scalar_imm_v_subrev_i32_e64_no_carry_out_use
323     ; GCN: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
324     ; GCN-NEXT: [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
325     ; GCN-NEXT: [[V_SUB_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_SUB_CO_U32_e32 [[S_MOV_B32_]], [[DEF]], implicit-def $vcc, implicit $exec
326     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_SUB_CO_U32_e32_]]
327     %0:vgpr_32 = IMPLICIT_DEF
328     %1:sreg_32_xm0 = S_MOV_B32 12345
329     %2:vgpr_32, %3:sreg_64 = V_SUBREV_CO_U32_e64 %0, %1, 0, implicit $exec
330     S_ENDPGM 0, implicit %2
336 # We know this is OK because vcc isn't live out of the block.
338 name: shrink_scalar_imm_vgpr_v_add_i32_e64_known_no_liveout
339 tracksRegLiveness: true
341 body:             |
342   ; GCN-LABEL: name: shrink_scalar_imm_vgpr_v_add_i32_e64_known_no_liveout
343   ; GCN: bb.0:
344   ; GCN-NEXT:   successors: %bb.1(0x80000000)
345   ; GCN-NEXT: {{  $}}
346   ; GCN-NEXT:   S_NOP 0
347   ; GCN-NEXT:   S_NOP 0
348   ; GCN-NEXT:   S_NOP 0
349   ; GCN-NEXT:   S_NOP 0
350   ; GCN-NEXT:   S_NOP 0
351   ; GCN-NEXT:   S_NOP 0
352   ; GCN-NEXT:   S_NOP 0
353   ; GCN-NEXT:   S_NOP 0
354   ; GCN-NEXT:   S_NOP 0
355   ; GCN-NEXT:   S_NOP 0
356   ; GCN-NEXT:   S_NOP 0
357   ; GCN-NEXT:   S_NOP 0
358   ; GCN-NEXT:   S_NOP 0
359   ; GCN-NEXT:   S_NOP 0
360   ; GCN-NEXT:   S_NOP 0
361   ; GCN-NEXT:   S_NOP 0
362   ; GCN-NEXT:   S_NOP 0
363   ; GCN-NEXT:   S_NOP 0
364   ; GCN-NEXT:   S_NOP 0
365   ; GCN-NEXT:   S_NOP 0
366   ; GCN-NEXT:   S_NOP 0
367   ; GCN-NEXT:   S_NOP 0
368   ; GCN-NEXT:   S_NOP 0
369   ; GCN-NEXT:   S_NOP 0
370   ; GCN-NEXT:   S_NOP 0
371   ; GCN-NEXT:   S_NOP 0
372   ; GCN-NEXT:   S_NOP 0
373   ; GCN-NEXT:   S_NOP 0
374   ; GCN-NEXT:   S_NOP 0
375   ; GCN-NEXT:   S_NOP 0
376   ; GCN-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
377   ; GCN-NEXT:   [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
378   ; GCN-NEXT:   [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 [[S_MOV_B32_]], [[DEF]], implicit-def $vcc, implicit $exec
379   ; GCN-NEXT:   S_NOP 0
380   ; GCN-NEXT:   S_NOP 0
381   ; GCN-NEXT: {{  $}}
382   ; GCN-NEXT: bb.1:
383   ; GCN-NEXT:   S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]]
384   bb.0:
385     successors: %bb.1
387     S_NOP 0
388     S_NOP 0
389     S_NOP 0
390     S_NOP 0
391     S_NOP 0
392     S_NOP 0
393     S_NOP 0
394     S_NOP 0
395     S_NOP 0
396     S_NOP 0
397     S_NOP 0
398     S_NOP 0
399     S_NOP 0
400     S_NOP 0
401     S_NOP 0
402     S_NOP 0
403     S_NOP 0
404     S_NOP 0
405     S_NOP 0
406     S_NOP 0
407     S_NOP 0
408     S_NOP 0
409     S_NOP 0
410     S_NOP 0
411     S_NOP 0
412     S_NOP 0
413     S_NOP 0
414     S_NOP 0
415     S_NOP 0
416     S_NOP 0
417     %0:sreg_32_xm0 = S_MOV_B32 12345
418     %1:vgpr_32 = IMPLICIT_DEF
419     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
420     S_NOP 0
421     S_NOP 0
423   bb.1:
424     S_ENDPGM 0, implicit %2
430 # We know this is OK because vcc isn't live out of the block, even
431 # though it had a defined but unused. value
433 name: shrink_scalar_imm_vgpr_v_add_i32_e64_known_no_liveout_dead_vcc_def
434 tracksRegLiveness: true
436 body:             |
437   ; GCN-LABEL: name: shrink_scalar_imm_vgpr_v_add_i32_e64_known_no_liveout_dead_vcc_def
438   ; GCN: bb.0:
439   ; GCN-NEXT:   successors: %bb.1(0x80000000)
440   ; GCN-NEXT: {{  $}}
441   ; GCN-NEXT:   S_NOP 0, implicit-def $vcc
442   ; GCN-NEXT:   [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
443   ; GCN-NEXT:   [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
444   ; GCN-NEXT:   [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 [[S_MOV_B32_]], [[DEF]], implicit-def $vcc, implicit $exec
445   ; GCN-NEXT:   S_NOP 0
446   ; GCN-NEXT:   S_NOP 0
447   ; GCN-NEXT: {{  $}}
448   ; GCN-NEXT: bb.1:
449   ; GCN-NEXT:   S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]]
450   bb.0:
451     successors: %bb.1
453     S_NOP 0, implicit-def $vcc
454     %0:sreg_32_xm0 = S_MOV_B32 12345
455     %1:vgpr_32 = IMPLICIT_DEF
456     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
457     S_NOP 0
458     S_NOP 0
460   bb.1:
461     S_ENDPGM 0, implicit %2
466 # This requires searching through many DBG_VALUE instructions before the insert poitn, which
467 # should not count against the search limit.
469 name: vcc_liveness_dbg_value_search_before
470 tracksRegLiveness: true
472 body:             |
473   bb.0:
474     ; GCN-LABEL: name: vcc_liveness_dbg_value_search_before
475     ; GCN: [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
476     ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
477     ; GCN-NEXT: DBG_VALUE $noreg, 0
478     ; GCN-NEXT: DBG_VALUE $noreg, 0
479     ; GCN-NEXT: DBG_VALUE $noreg, 0
480     ; GCN-NEXT: DBG_VALUE $noreg, 0
481     ; GCN-NEXT: DBG_VALUE $noreg, 0
482     ; GCN-NEXT: DBG_VALUE $noreg, 0
483     ; GCN-NEXT: DBG_VALUE $noreg, 0
484     ; GCN-NEXT: DBG_VALUE $noreg, 0
485     ; GCN-NEXT: DBG_VALUE $noreg, 0
486     ; GCN-NEXT: DBG_VALUE $noreg, 0
487     ; GCN-NEXT: DBG_VALUE $noreg, 0
488     ; GCN-NEXT: DBG_VALUE $noreg, 0
489     ; GCN-NEXT: DBG_VALUE $noreg, 0
490     ; GCN-NEXT: DBG_VALUE $noreg, 0
491     ; GCN-NEXT: DBG_VALUE $noreg, 0
492     ; GCN-NEXT: DBG_VALUE $noreg, 0
493     ; GCN-NEXT: DBG_VALUE $noreg, 0
494     ; GCN-NEXT: DBG_VALUE $noreg, 0
495     ; GCN-NEXT: DBG_VALUE $noreg, 0
496     ; GCN-NEXT: DBG_VALUE $noreg, 0
497     ; GCN-NEXT: DBG_VALUE $noreg, 0
498     ; GCN-NEXT: DBG_VALUE $noreg, 0
499     ; GCN-NEXT: DBG_VALUE $noreg, 0
500     ; GCN-NEXT: DBG_VALUE $noreg, 0
501     ; GCN-NEXT: DBG_VALUE $noreg, 0
502     ; GCN-NEXT: DBG_VALUE $noreg, 0
503     ; GCN-NEXT: DBG_VALUE $noreg, 0
504     ; GCN-NEXT: DBG_VALUE $noreg, 0
505     ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 [[S_MOV_B32_]], [[DEF]], implicit-def $vcc, implicit $exec
506     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]]
507     %0:sreg_32_xm0 = S_MOV_B32 12345
508     %1:vgpr_32 = IMPLICIT_DEF
509     DBG_VALUE $noreg, 0
510     DBG_VALUE $noreg, 0
511     DBG_VALUE $noreg, 0
512     DBG_VALUE $noreg, 0
513     DBG_VALUE $noreg, 0
514     DBG_VALUE $noreg, 0
515     DBG_VALUE $noreg, 0
516     DBG_VALUE $noreg, 0
517     DBG_VALUE $noreg, 0
518     DBG_VALUE $noreg, 0
519     DBG_VALUE $noreg, 0
520     DBG_VALUE $noreg, 0
521     DBG_VALUE $noreg, 0
522     DBG_VALUE $noreg, 0
523     DBG_VALUE $noreg, 0
524     DBG_VALUE $noreg, 0
525     DBG_VALUE $noreg, 0
526     DBG_VALUE $noreg, 0
527     DBG_VALUE $noreg, 0
528     DBG_VALUE $noreg, 0
529     DBG_VALUE $noreg, 0
530     DBG_VALUE $noreg, 0
531     DBG_VALUE $noreg, 0
532     DBG_VALUE $noreg, 0
533     DBG_VALUE $noreg, 0
534     DBG_VALUE $noreg, 0
535     DBG_VALUE $noreg, 0
536     DBG_VALUE $noreg, 0
537     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
538     S_ENDPGM 0, implicit %2
543 # This requires searching through many DBG_VALUE instructions after the insert point, which
544 # should not count against the search limit.
546 name: vcc_liveness_dbg_value_search_after
547 tracksRegLiveness: true
549 body:             |
550   bb.0:
551     ; GCN-LABEL: name: vcc_liveness_dbg_value_search_after
552     ; GCN: [[S_MOV_B32_:%[0-9]+]]:sreg_32_xm0 = S_MOV_B32 12345
553     ; GCN-NEXT: [[DEF:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
554     ; GCN-NEXT: S_NOP 0
555     ; GCN-NEXT: S_NOP 0
556     ; GCN-NEXT: S_NOP 0
557     ; GCN-NEXT: S_NOP 0
558     ; GCN-NEXT: S_NOP 0
559     ; GCN-NEXT: S_NOP 0
560     ; GCN-NEXT: S_NOP 0
561     ; GCN-NEXT: S_NOP 0
562     ; GCN-NEXT: S_NOP 0
563     ; GCN-NEXT: S_NOP 0
564     ; GCN-NEXT: S_NOP 0
565     ; GCN-NEXT: S_NOP 0
566     ; GCN-NEXT: S_NOP 0
567     ; GCN-NEXT: S_NOP 0
568     ; GCN-NEXT: S_NOP 0
569     ; GCN-NEXT: S_NOP 0
570     ; GCN-NEXT: S_NOP 0
571     ; GCN-NEXT: S_NOP 0
572     ; GCN-NEXT: S_NOP 0
573     ; GCN-NEXT: S_NOP 0
574     ; GCN-NEXT: S_NOP 0
575     ; GCN-NEXT: S_NOP 0
576     ; GCN-NEXT: S_NOP 0
577     ; GCN-NEXT: S_NOP 0
578     ; GCN-NEXT: S_NOP 0
579     ; GCN-NEXT: S_NOP 0
580     ; GCN-NEXT: S_NOP 0
581     ; GCN-NEXT: S_NOP 0
582     ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 [[S_MOV_B32_]], [[DEF]], implicit-def $vcc, implicit $exec
583     ; GCN-NEXT: DBG_VALUE $noreg, 0
584     ; GCN-NEXT: DBG_VALUE $noreg, 0
585     ; GCN-NEXT: DBG_VALUE $noreg, 0
586     ; GCN-NEXT: DBG_VALUE $noreg, 0
587     ; GCN-NEXT: DBG_VALUE $noreg, 0
588     ; GCN-NEXT: DBG_VALUE $noreg, 0
589     ; GCN-NEXT: DBG_VALUE $noreg, 0
590     ; GCN-NEXT: DBG_VALUE $noreg, 0
591     ; GCN-NEXT: DBG_VALUE $noreg, 0
592     ; GCN-NEXT: DBG_VALUE $noreg, 0
593     ; GCN-NEXT: DBG_VALUE $noreg, 0
594     ; GCN-NEXT: DBG_VALUE $noreg, 0
595     ; GCN-NEXT: DBG_VALUE $noreg, 0
596     ; GCN-NEXT: DBG_VALUE $noreg, 0
597     ; GCN-NEXT: DBG_VALUE $noreg, 0
598     ; GCN-NEXT: DBG_VALUE $noreg, 0
599     ; GCN-NEXT: DBG_VALUE $noreg, 0
600     ; GCN-NEXT: DBG_VALUE $noreg, 0
601     ; GCN-NEXT: DBG_VALUE $noreg, 0
602     ; GCN-NEXT: DBG_VALUE $noreg, 0
603     ; GCN-NEXT: DBG_VALUE $noreg, 0
604     ; GCN-NEXT: DBG_VALUE $noreg, 0
605     ; GCN-NEXT: DBG_VALUE $noreg, 0
606     ; GCN-NEXT: DBG_VALUE $noreg, 0
607     ; GCN-NEXT: DBG_VALUE $noreg, 0
608     ; GCN-NEXT: DBG_VALUE $noreg, 0
609     ; GCN-NEXT: DBG_VALUE $noreg, 0
610     ; GCN-NEXT: DBG_VALUE $noreg, 0
611     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]]
612     %0:sreg_32_xm0 = S_MOV_B32 12345
613     %1:vgpr_32 = IMPLICIT_DEF
614     S_NOP 0
615     S_NOP 0
616     S_NOP 0
617     S_NOP 0
618     S_NOP 0
619     S_NOP 0
620     S_NOP 0
621     S_NOP 0
622     S_NOP 0
623     S_NOP 0
624     S_NOP 0
625     S_NOP 0
626     S_NOP 0
627     S_NOP 0
628     S_NOP 0
629     S_NOP 0
630     S_NOP 0
631     S_NOP 0
632     S_NOP 0
633     S_NOP 0
634     S_NOP 0
635     S_NOP 0
636     S_NOP 0
637     S_NOP 0
638     S_NOP 0
639     S_NOP 0
640     S_NOP 0
641     S_NOP 0
642     %2:vgpr_32, %3:sreg_64 = V_ADD_CO_U32_e64 %0, %1, 0, implicit $exec
643     DBG_VALUE $noreg, 0
644     DBG_VALUE $noreg, 0
645     DBG_VALUE $noreg, 0
646     DBG_VALUE $noreg, 0
647     DBG_VALUE $noreg, 0
648     DBG_VALUE $noreg, 0
649     DBG_VALUE $noreg, 0
650     DBG_VALUE $noreg, 0
651     DBG_VALUE $noreg, 0
652     DBG_VALUE $noreg, 0
653     DBG_VALUE $noreg, 0
654     DBG_VALUE $noreg, 0
655     DBG_VALUE $noreg, 0
656     DBG_VALUE $noreg, 0
657     DBG_VALUE $noreg, 0
658     DBG_VALUE $noreg, 0
659     DBG_VALUE $noreg, 0
660     DBG_VALUE $noreg, 0
661     DBG_VALUE $noreg, 0
662     DBG_VALUE $noreg, 0
663     DBG_VALUE $noreg, 0
664     DBG_VALUE $noreg, 0
665     DBG_VALUE $noreg, 0
666     DBG_VALUE $noreg, 0
667     DBG_VALUE $noreg, 0
668     DBG_VALUE $noreg, 0
669     DBG_VALUE $noreg, 0
670     DBG_VALUE $noreg, 0
671     $vcc = S_MOV_B64 0
672     S_ENDPGM 0, implicit %2
677 name: shrink_add_kill_flags_src0
678 tracksRegLiveness: true
679 body:             |
680   bb.0:
681     liveins: $vgpr0
682     ; GCN-LABEL: name: shrink_add_kill_flags_src0
683     ; GCN: liveins: $vgpr0
684     ; GCN-NEXT: {{  $}}
685     ; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
686     ; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 518144, implicit $exec
687     ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 killed [[V_MOV_B32_e32_]], [[COPY]], implicit-def $vcc, implicit $exec
688     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]]
689     %0:vgpr_32 = COPY $vgpr0
690     %1:vgpr_32 = V_MOV_B32_e32 518144, implicit $exec
691     %2:vgpr_32, %3:sreg_64_xexec = V_ADD_CO_U32_e64 killed %1, %0, 0, implicit $exec
692    S_ENDPGM 0, implicit %2
696 name: shrink_add_kill_flags_src1
697 tracksRegLiveness: true
698 body:             |
699   bb.0:
700     liveins: $vgpr0
701     ; GCN-LABEL: name: shrink_add_kill_flags_src1
702     ; GCN: liveins: $vgpr0
703     ; GCN-NEXT: {{  $}}
704     ; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
705     ; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 518144, implicit $exec
706     ; GCN-NEXT: [[V_ADD_CO_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_CO_U32_e32 [[V_MOV_B32_e32_]], killed [[COPY]], implicit-def $vcc, implicit $exec
707     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADD_CO_U32_e32_]]
708     %0:vgpr_32 = COPY $vgpr0
709     %1:vgpr_32 = V_MOV_B32_e32 518144, implicit $exec
710     %2:vgpr_32, %3:sreg_64_xexec = V_ADD_CO_U32_e64 %1, killed %0, 0, implicit $exec
711    S_ENDPGM 0, implicit %2
715 name: shrink_addc_kill_flags_src2
716 tracksRegLiveness: true
717 body:             |
718   bb.0:
719     liveins: $vgpr0, $vcc
720     ; GCN-LABEL: name: shrink_addc_kill_flags_src2
721     ; GCN: liveins: $vgpr0, $vcc
722     ; GCN-NEXT: {{  $}}
723     ; GCN-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
724     ; GCN-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 518144, implicit $exec
725     ; GCN-NEXT: [[COPY1:%[0-9]+]]:sreg_64_xexec = COPY $vcc
726     ; GCN-NEXT: [[V_ADDC_U32_e64_:%[0-9]+]]:vgpr_32, [[V_ADDC_U32_e64_1:%[0-9]+]]:sreg_64_xexec = V_ADDC_U32_e64 [[V_MOV_B32_e32_]], [[COPY]], [[COPY1]], 0, implicit $exec
727     ; GCN-NEXT: S_ENDPGM 0, implicit [[V_ADDC_U32_e64_]]
728     %0:vgpr_32 = COPY $vgpr0
729     %1:vgpr_32 = V_MOV_B32_e32 518144, implicit $exec
730     %2:sreg_64_xexec = COPY $vcc
731     %3:vgpr_32, %4:sreg_64_xexec = V_ADDC_U32_e64 %1, %0, %2, 0, implicit $exec
732    S_ENDPGM 0, implicit %3