Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / insert-singleuse-vdst.mir
blob1af008ffa22cb21ab6931e080f0d695fa7329180
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4
2 # RUN: llc -mtriple=amdgcn -mcpu=gfx1150 -mattr=+wavefrontsize32,-wavefrontsize64 -verify-machineinstrs -run-pass=amdgpu-insert-single-use-vdst %s -o - | FileCheck %s
3 # RUN: llc -mtriple=amdgcn -mcpu=gfx1150 -mattr=-wavefrontsize32,+wavefrontsize64 -verify-machineinstrs -run-pass=amdgpu-insert-single-use-vdst %s -o - | FileCheck %s
5 # One single-use producer.
6 ---
7 name: one_producer
8 tracksRegLiveness: true
9 body: |
10   ; CHECK-LABEL: name: one_producer
11   ; CHECK: bb.0:
12   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
13   ; CHECK-NEXT:   liveins: $vgpr0
14   ; CHECK-NEXT: {{  $}}
15   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
16   ; CHECK-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr0, implicit $exec
17   ; CHECK-NEXT:   $vgpr2 = V_ADD_U32_e32 $vgpr0, $vgpr1, implicit $exec
18   ; CHECK-NEXT: {{  $}}
19   ; CHECK-NEXT: bb.1:
20   ; CHECK-NEXT:   liveins: $vgpr0, $vgpr2
21   ; CHECK-NEXT: {{  $}}
22   bb.0:
23     liveins: $vgpr0
24     $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr0, implicit $exec
25     $vgpr2 = V_ADD_U32_e32 $vgpr0, $vgpr1, implicit $exec
26   bb.1:
27     liveins: $vgpr0, $vgpr2
28 ...
30 # One single-use producer of a 64-bit value.
31 ---
32 name: one_producer_64bit
33 tracksRegLiveness: true
34 body: |
35   ; CHECK-LABEL: name: one_producer_64bit
36   ; CHECK: bb.0:
37   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
38   ; CHECK-NEXT:   liveins: $vgpr0_vgpr1
39   ; CHECK-NEXT: {{  $}}
40   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
41   ; CHECK-NEXT:   $vgpr2_vgpr3 = V_LSHLREV_B64_e64 0, $vgpr0_vgpr1, implicit $exec
42   ; CHECK-NEXT:   $vgpr4_vgpr5 = V_LSHLREV_B64_e64 0, $vgpr2_vgpr3, implicit $exec
43   ; CHECK-NEXT: {{  $}}
44   ; CHECK-NEXT: bb.1:
45   ; CHECK-NEXT:   liveins: $vgpr4_vgpr5
46   ; CHECK-NEXT: {{  $}}
47   bb.0:
48     liveins: $vgpr0_vgpr1
49     $vgpr2_vgpr3 = V_LSHLREV_B64_e64 0, $vgpr0_vgpr1, implicit $exec
50     $vgpr4_vgpr5 = V_LSHLREV_B64_e64 0, $vgpr2_vgpr3, implicit $exec
51   bb.1:
52     liveins: $vgpr4_vgpr5
53 ...
55 # Two consecutive single-use producers.
56 ---
57 name: two_producers
58 tracksRegLiveness: true
59 body: |
60   ; CHECK-LABEL: name: two_producers
61   ; CHECK: bb.0:
62   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
63   ; CHECK-NEXT:   liveins: $vgpr0
64   ; CHECK-NEXT: {{  $}}
65   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
66   ; CHECK-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr0, implicit $exec
67   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
68   ; CHECK-NEXT:   $vgpr2 = V_ADD_U32_e32 $vgpr0, $vgpr1, implicit $exec
69   ; CHECK-NEXT:   $vgpr3 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
70   ; CHECK-NEXT: {{  $}}
71   ; CHECK-NEXT: bb.1:
72   ; CHECK-NEXT:   liveins: $vgpr0, $vgpr3
73   ; CHECK-NEXT: {{  $}}
74   bb.0:
75     liveins: $vgpr0
76     $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr0, implicit $exec
77     $vgpr2 = V_ADD_U32_e32 $vgpr0, $vgpr1, implicit $exec
78     $vgpr3 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
79   bb.1:
80     liveins: $vgpr0, $vgpr3
81 ...
83 # Redefinitions of v0.
84 ---
85 name: redefinitions
86 tracksRegLiveness: true
87 body: |
88   ; CHECK-LABEL: name: redefinitions
89   ; CHECK: bb.0:
90   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
91   ; CHECK-NEXT:   liveins: $vgpr0
92   ; CHECK-NEXT: {{  $}}
93   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
94   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
95   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
96   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
97   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
98   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
99   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
100   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
101   ; CHECK-NEXT: {{  $}}
102   ; CHECK-NEXT: bb.1:
103   bb.0:
104     liveins: $vgpr0
105     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
106     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
107     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
108     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
109   bb.1:
112 # One producer with no consumers.
114 name: no_consumer
115 tracksRegLiveness: true
116 body: |
117   ; CHECK-LABEL: name: no_consumer
118   ; CHECK: bb.0:
119   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
120   ; CHECK-NEXT:   liveins: $vgpr0
121   ; CHECK-NEXT: {{  $}}
122   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
123   ; CHECK-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr0, implicit $exec
124   ; CHECK-NEXT: {{  $}}
125   ; CHECK-NEXT: bb.1:
126   bb.0:
127     liveins: $vgpr0
128     $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr0, implicit $exec
129   bb.1:
132 # One consumer with two uses of the same value.
134 name: one_consumer_two_uses
135 tracksRegLiveness: true
136 body: |
137   ; CHECK-LABEL: name: one_consumer_two_uses
138   ; CHECK: bb.0:
139   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
140   ; CHECK-NEXT:   liveins: $vgpr0
141   ; CHECK-NEXT: {{  $}}
142   ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
143   ; CHECK-NEXT:   $vgpr2 = V_ADD_U32_e32 $vgpr1, $vgpr1, implicit $exec
144   ; CHECK-NEXT: {{  $}}
145   ; CHECK-NEXT: bb.1:
146   ; CHECK-NEXT:   liveins: $vgpr0, $vgpr2
147   ; CHECK-NEXT: {{  $}}
148   bb.0:
149     liveins: $vgpr0
150     $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
151     $vgpr2 = V_ADD_U32_e32 $vgpr1, $vgpr1, implicit $exec
152   bb.1:
153     liveins: $vgpr0, $vgpr2
156 # A longer example.
158 name: longer_example
159 tracksRegLiveness: true
160 body: |
161   ; CHECK-LABEL: name: longer_example
162   ; CHECK: bb.0:
163   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
164   ; CHECK-NEXT:   liveins: $vgpr3, $vgpr5, $sgpr0, $sgpr2, $sgpr4, $sgpr5, $sgpr16, $sgpr17, $sgpr18, $sgpr19
165   ; CHECK-NEXT: {{  $}}
166   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
167   ; CHECK-NEXT:   $vgpr14 = V_MUL_F32_e32 $sgpr4, $vgpr3, implicit $exec, implicit $mode
168   ; CHECK-NEXT:   $sgpr3 = S_MUL_F16 $sgpr0, $sgpr2, implicit $mode
169   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
170   ; CHECK-NEXT:   $vgpr15 = V_MUL_F32_e32 $sgpr5, $vgpr3, implicit $exec, implicit $mode
171   ; CHECK-NEXT:   $vgpr17 = V_FMA_F32_e64 0, $sgpr16, 0, $vgpr5, 0, $vgpr14, 0, 0, implicit $exec, implicit $mode
172   ; CHECK-NEXT:   $sgpr1 = S_ADD_F16 $sgpr0, 15360, implicit $mode
173   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
174   ; CHECK-NEXT:   $vgpr15 = V_FMA_F32_e64 0, $sgpr17, 0, $vgpr5, 0, $vgpr15, 0, 0, implicit $exec, implicit $mode
175   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
176   ; CHECK-NEXT:   $vgpr14 = V_FMA_F32_e64 0, $sgpr18, 0, $vgpr15, 0, $vgpr17, 0, 0, implicit $exec, implicit $mode
177   ; CHECK-NEXT:   $vgpr15 = V_FMA_F32_e64 0, $sgpr19, 0, $vgpr14, 0, $vgpr17, 0, 0, implicit $exec, implicit $mode
178   ; CHECK-NEXT:   $vgpr16 = V_LOG_F32_e32 $vgpr15, implicit $exec, implicit $mode
179   ; CHECK-NEXT:   $vgpr18 = V_EXP_F32_e32 $vgpr15, implicit $exec, implicit $mode
180   ; CHECK-NEXT: {{  $}}
181   ; CHECK-NEXT: bb.1:
182   ; CHECK-NEXT:   liveins: $vgpr16, $vgpr18
183   ; CHECK-NEXT: {{  $}}
184   bb.0:
185     liveins: $vgpr3, $vgpr5, $sgpr0, $sgpr2, $sgpr4, $sgpr5, $sgpr16, $sgpr17, $sgpr18, $sgpr19
186     $vgpr14 = V_MUL_F32_e32 $sgpr4, $vgpr3, implicit $exec, implicit $mode
187     $sgpr3 = S_MUL_F16 $sgpr0, $sgpr2, implicit $mode
188     $vgpr15 = V_MUL_F32_e32 $sgpr5, $vgpr3, implicit $exec, implicit $mode
189     $vgpr17 = V_FMA_F32_e64 0, $sgpr16, 0, $vgpr5, 0, $vgpr14, 0, 0, implicit $exec, implicit $mode
190     $sgpr1 = S_ADD_F16 $sgpr0, 15360, implicit $mode
191     $vgpr15 = V_FMA_F32_e64 0, $sgpr17, 0, $vgpr5, 0, $vgpr15, 0, 0, implicit $exec, implicit $mode
192     $vgpr14 = V_FMA_F32_e64 0, $sgpr18, 0, $vgpr15, 0, $vgpr17, 0, 0, implicit $exec, implicit $mode
193     $vgpr15 = V_FMA_F32_e64 0, $sgpr19, 0, $vgpr14, 0, $vgpr17, 0, 0, implicit $exec, implicit $mode
194     $vgpr16 = V_LOG_F32_e32 $vgpr15, implicit $exec, implicit $mode
195     $vgpr18 = V_EXP_F32_e32 $vgpr15, implicit $exec, implicit $mode
196   bb.1:
197     liveins: $vgpr16, $vgpr18
200 # Multiple uses of v0.
202 name: multiple_uses_1
203 tracksRegLiveness: true
204 body: |
205   ; CHECK-LABEL: name: multiple_uses_1
206   ; CHECK: bb.0:
207   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
208   ; CHECK-NEXT:   liveins: $vgpr0
209   ; CHECK-NEXT: {{  $}}
210   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
211   ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
212   ; CHECK-NEXT:   $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
213   ; CHECK-NEXT: {{  $}}
214   ; CHECK-NEXT: bb.1:
215   ; CHECK-NEXT:   liveins: $vgpr1, $vgpr2
216   ; CHECK-NEXT: {{  $}}
217   bb.0:
218     liveins: $vgpr0
219     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
220     $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
221     $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
222   bb.1:
223     liveins: $vgpr1, $vgpr2
226 # Multiple uses of v0 and redefinitions of v1 and v2.
228 name: multiple_uses_2
229 tracksRegLiveness: true
230 body: |
231   ; CHECK-LABEL: name: multiple_uses_2
232   ; CHECK: bb.0:
233   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
234   ; CHECK-NEXT:   liveins: $vgpr0
235   ; CHECK-NEXT: {{  $}}
236   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
237   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
238   ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
239   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
240   ; CHECK-NEXT:   $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
241   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
242   ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
243   ; CHECK-NEXT:   $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
244   ; CHECK-NEXT: {{  $}}
245   ; CHECK-NEXT: bb.1:
246   ; CHECK-NEXT:   liveins: $vgpr1, $vgpr2
247   ; CHECK-NEXT: {{  $}}
248   bb.0:
249     liveins: $vgpr0
250     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
251     $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
252     $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
253     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
254     $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
255     $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
256   bb.1:
257     liveins: $vgpr1, $vgpr2
260 # Multiple uses of all but v1.
262 name: multiple_uses_3
263 tracksRegLiveness: true
264 body: |
265   ; CHECK-LABEL: name: multiple_uses_3
266   ; CHECK: bb.0:
267   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
268   ; CHECK-NEXT:   liveins: $vgpr0
269   ; CHECK-NEXT: {{  $}}
270   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
271   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
272   ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
273   ; CHECK-NEXT:   $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
274   ; CHECK-NEXT:   $vgpr3 = V_MOV_B32_e32 $vgpr1, implicit $exec
275   ; CHECK-NEXT: {{  $}}
276   ; CHECK-NEXT: bb.1:
277   ; CHECK-NEXT:   liveins: $vgpr2, $vgpr3
278   ; CHECK-NEXT: {{  $}}
279   bb.0:
280     liveins: $vgpr0
281     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
282     $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
283     $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
284     $vgpr3 = V_MOV_B32_e32 $vgpr1, implicit $exec
285   bb.1:
286     liveins: $vgpr2, $vgpr3
289 # Results are live-in to another basic block.
291 name: basic_block_1
292 tracksRegLiveness: true
293 body: |
294   ; CHECK-LABEL: name: basic_block_1
295   ; CHECK: bb.0:
296   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
297   ; CHECK-NEXT:   liveins: $vgpr0
298   ; CHECK-NEXT: {{  $}}
299   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
300   ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
301   ; CHECK-NEXT:   $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
302   ; CHECK-NEXT: {{  $}}
303   ; CHECK-NEXT: bb.1:
304   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
305   ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2
306   ; CHECK-NEXT: {{  $}}
307   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
308   ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
309   ; CHECK-NEXT:   $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
310   ; CHECK-NEXT: {{  $}}
311   ; CHECK-NEXT: bb.2:
312   ; CHECK-NEXT:   liveins: $vgpr1, $vgpr2
313   ; CHECK-NEXT: {{  $}}
314   bb.0:
315     liveins: $vgpr0
316     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
317     $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
318     $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
319   bb.1:
320     liveins: $vgpr0, $vgpr1, $vgpr2
321     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
322     $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
323     $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
324   bb.2:
325     liveins: $vgpr1, $vgpr2
328 # Result v2 has multiple uses in another basic block.
330 name: basic_block_2
331 tracksRegLiveness: true
332 body: |
333   ; CHECK-LABEL: name: basic_block_2
334   ; CHECK: bb.0:
335   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
336   ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1
337   ; CHECK-NEXT: {{  $}}
338   ; CHECK-NEXT:   $vgpr2 = V_MOV_B32_e32 $vgpr1, implicit $exec
339   ; CHECK-NEXT: {{  $}}
340   ; CHECK-NEXT: bb.1:
341   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
342   ; CHECK-NEXT:   liveins: $vgpr2
343   ; CHECK-NEXT: {{  $}}
344   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
345   ; CHECK-NEXT:   $vgpr3 = V_MOV_B32_e32 $vgpr2, implicit $exec
346   ; CHECK-NEXT:   $vgpr3 = V_MOV_B32_e32 $vgpr2, implicit $exec
347   ; CHECK-NEXT: {{  $}}
348   ; CHECK-NEXT: bb.2:
349   ; CHECK-NEXT:   liveins: $vgpr3
350   ; CHECK-NEXT: {{  $}}
351   bb.0:
352     liveins: $vgpr0, $vgpr1
353     $vgpr2 = V_MOV_B32_e32 $vgpr1, implicit $exec
354   bb.1:
355     liveins: $vgpr2
356     $vgpr3 = V_MOV_B32_e32 $vgpr2, implicit $exec
357     $vgpr3 = V_MOV_B32_e32 $vgpr2, implicit $exec
358   bb.2:
359     liveins: $vgpr3
362 # Results are redefined in another basic block.
364 name: basic_block_3
365 tracksRegLiveness: true
366 body: |
367   ; CHECK-LABEL: name: basic_block_3
368   ; CHECK: bb.0:
369   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
370   ; CHECK-NEXT:   liveins: $vgpr0
371   ; CHECK-NEXT: {{  $}}
372   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
373   ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
374   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
375   ; CHECK-NEXT:   $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
376   ; CHECK-NEXT: {{  $}}
377   ; CHECK-NEXT: bb.1:
378   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
379   ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1
380   ; CHECK-NEXT: {{  $}}
381   ; CHECK-NEXT:   $vgpr0 = V_ADD_U32_e32 $vgpr0, $vgpr1, implicit $exec
382   ; CHECK-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr1, implicit $exec
383   ; CHECK-NEXT:   $vgpr2 = V_ADD_U32_e32 $vgpr0, $vgpr1, implicit $exec
384   ; CHECK-NEXT: {{  $}}
385   ; CHECK-NEXT: bb.2:
386   ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2
387   ; CHECK-NEXT: {{  $}}
388   bb.0:
389     liveins: $vgpr0
390     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
391     $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
392     $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
393   bb.1:
394     liveins: $vgpr0, $vgpr1
395     $vgpr0 = V_ADD_U32_e32 $vgpr0, $vgpr1, implicit $exec
396     $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr1, implicit $exec
397     $vgpr2 = V_ADD_U32_e32 $vgpr0, $vgpr1, implicit $exec
398   bb.2:
399     liveins: $vgpr0, $vgpr1, $vgpr2
402 # Exec modified between producer and consumer.
404 name: exec_mask
405 tracksRegLiveness: true
406 body: |
407   ; CHECK-LABEL: name: exec_mask
408   ; CHECK: bb.0:
409   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
410   ; CHECK-NEXT:   liveins: $sgpr0_sgpr1
411   ; CHECK-NEXT: {{  $}}
412   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
413   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
414   ; CHECK-NEXT:   $exec = COPY $sgpr0_sgpr1
415   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
416   ; CHECK-NEXT: {{  $}}
417   ; CHECK-NEXT: bb.1:
418   ; CHECK-NEXT:   liveins: $vgpr0
419   ; CHECK-NEXT: {{  $}}
420   bb.0:
421     liveins: $sgpr0_sgpr1
422     $vgpr0 = V_MOV_B32_e32 0, implicit $exec
423     $exec = COPY $sgpr0_sgpr1
424     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
425   bb.1:
426     liveins: $vgpr0
429 # Exec_lo modified between producer and consumer.
431 name: exec_mask_lo
432 tracksRegLiveness: true
433 body: |
434   ; CHECK-LABEL: name: exec_mask_lo
435   ; CHECK: bb.0:
436   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
437   ; CHECK-NEXT:   liveins: $sgpr0
438   ; CHECK-NEXT: {{  $}}
439   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
440   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
441   ; CHECK-NEXT:   $exec_lo = COPY $sgpr0
442   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
443   ; CHECK-NEXT: {{  $}}
444   ; CHECK-NEXT: bb.1:
445   ; CHECK-NEXT:   liveins: $vgpr0
446   ; CHECK-NEXT: {{  $}}
447   bb.0:
448     liveins: $sgpr0
449     $vgpr0 = V_MOV_B32_e32 0, implicit $exec
450     $exec_lo = COPY $sgpr0
451     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
452   bb.1:
453     liveins: $vgpr0
456 # Exec_hi modified between producer and consumer.
458 name: exec_mask_hi
459 tracksRegLiveness: true
460 body: |
461   ; CHECK-LABEL: name: exec_mask_hi
462   ; CHECK: bb.0:
463   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
464   ; CHECK-NEXT:   liveins: $sgpr0
465   ; CHECK-NEXT: {{  $}}
466   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
467   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
468   ; CHECK-NEXT:   $exec_hi = COPY $sgpr0
469   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
470   ; CHECK-NEXT: {{  $}}
471   ; CHECK-NEXT: bb.1:
472   ; CHECK-NEXT:   liveins: $vgpr0
473   ; CHECK-NEXT: {{  $}}
474   bb.0:
475     liveins: $sgpr0
476     $vgpr0 = V_MOV_B32_e32 0, implicit $exec
477     $exec_hi = COPY $sgpr0
478     $vgpr0 = V_MOV_B32_e32 $vgpr0, implicit $exec
479   bb.1:
480     liveins: $vgpr0
483 # Write 32-bit vgpr and then read from low 16 bits.
485 name: write_full_read_lo
486 tracksRegLiveness: true
487 body: |
488   ; CHECK-LABEL: name: write_full_read_lo
489   ; CHECK: bb.0:
490   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
491   ; CHECK-NEXT: {{  $}}
492   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
493   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
494   ; CHECK-NEXT:   $vgpr1_lo16 = V_MOV_B16_t16_e32 $vgpr0_lo16, implicit $exec
495   ; CHECK-NEXT: {{  $}}
496   ; CHECK-NEXT: bb.1:
497   ; CHECK-NEXT:   liveins: $vgpr1_lo16
498   ; CHECK-NEXT: {{  $}}
499   bb.0:
500     $vgpr0 = V_MOV_B32_e32 0, implicit $exec
501     $vgpr1_lo16 = V_MOV_B16_t16_e32 $vgpr0_lo16, implicit $exec
502   bb.1:
503     liveins: $vgpr1_lo16
506 # Write 32-bit vgpr and then read from high 16 bits.
508 name: write_full_read_hi
509 tracksRegLiveness: true
510 body: |
511   ; CHECK-LABEL: name: write_full_read_hi
512   ; CHECK: bb.0:
513   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
514   ; CHECK-NEXT: {{  $}}
515   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
516   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
517   ; CHECK-NEXT:   $vgpr1_hi16 = V_MOV_B16_t16_e32 $vgpr0_hi16, implicit $exec
518   ; CHECK-NEXT: {{  $}}
519   ; CHECK-NEXT: bb.1:
520   ; CHECK-NEXT:   liveins: $vgpr1_hi16
521   ; CHECK-NEXT: {{  $}}
522   bb.0:
523     $vgpr0 = V_MOV_B32_e32 0, implicit $exec
524     $vgpr1_hi16 = V_MOV_B16_t16_e32 $vgpr0_hi16, implicit $exec
525   bb.1:
526     liveins: $vgpr1_hi16
529 # Write 32-bit vgpr and then read from both halves.
531 name: write_full_read_both
532 tracksRegLiveness: true
533 body: |
534   ; CHECK-LABEL: name: write_full_read_both
535   ; CHECK: bb.0:
536   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
537   ; CHECK-NEXT: {{  $}}
538   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
539   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
540   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
541   ; CHECK-NEXT:   $vgpr1_lo16 = V_MOV_B16_t16_e32 $vgpr0_lo16, implicit $exec
542   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
543   ; CHECK-NEXT:   $vgpr1_hi16 = V_MOV_B16_t16_e32 $vgpr0_hi16, implicit $exec
544   ; CHECK-NEXT: {{  $}}
545   ; CHECK-NEXT: bb.1:
546   ; CHECK-NEXT:   liveins: $vgpr1
547   ; CHECK-NEXT: {{  $}}
548   bb.0:
549     $vgpr0 = V_MOV_B32_e32 0, implicit $exec
550     $vgpr1_lo16 = V_MOV_B16_t16_e32 $vgpr0_lo16, implicit $exec
551     $vgpr1_hi16 = V_MOV_B16_t16_e32 $vgpr0_hi16, implicit $exec
552   bb.1:
553     liveins: $vgpr1
556 # Write 32-bit vgpr and then read from both halves in the same instruction.
558 name: write_full_read_both_same_instruction
559 tracksRegLiveness: true
560 body: |
561   ; CHECK-LABEL: name: write_full_read_both_same_instruction
562   ; CHECK: bb.0:
563   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
564   ; CHECK-NEXT: {{  $}}
565   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
566   ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
567   ; CHECK-NEXT:   $vgpr1_lo16 = V_ADD_F16_t16_e32 $vgpr0_lo16, $vgpr0_hi16, implicit $mode, implicit $exec
568   ; CHECK-NEXT: {{  $}}
569   ; CHECK-NEXT: bb.1:
570   ; CHECK-NEXT:   liveins: $vgpr1_lo16
571   ; CHECK-NEXT: {{  $}}
572   bb.0:
573     $vgpr0 = V_MOV_B32_e32 0, implicit $exec
574     $vgpr1_lo16 = V_ADD_F16_t16_e32 $vgpr0_lo16, $vgpr0_hi16, implicit $mode, implicit $exec
575   bb.1:
576     liveins: $vgpr1_lo16
579 # Write low 16-bits and then read 32-bit vgpr.
581 name: write_lo_read_full
582 tracksRegLiveness: true
583 body: |
584   ; CHECK-LABEL: name: write_lo_read_full
585   ; CHECK: bb.0:
586   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
587   ; CHECK-NEXT:   liveins: $vgpr0
588   ; CHECK-NEXT: {{  $}}
589   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
590   ; CHECK-NEXT:   $vgpr0_lo16 = V_MOV_B16_t16_e32 0, implicit $exec
591   ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
592   ; CHECK-NEXT: {{  $}}
593   ; CHECK-NEXT: bb.1:
594   ; CHECK-NEXT:   liveins: $vgpr1
595   ; CHECK-NEXT: {{  $}}
596   bb.0:
597     liveins: $vgpr0
598     $vgpr0_lo16 = V_MOV_B16_t16_e32 0, implicit $exec
599     $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
600   bb.1:
601     liveins: $vgpr1
604 # Write high 16-bits and then read 32-bit vgpr.
606 name: write_hi_read_full
607 tracksRegLiveness: true
608 body: |
609   ; CHECK-LABEL: name: write_hi_read_full
610   ; CHECK: bb.0:
611   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
612   ; CHECK-NEXT:   liveins: $vgpr0
613   ; CHECK-NEXT: {{  $}}
614   ; CHECK-NEXT:   S_SINGLEUSE_VDST 1
615   ; CHECK-NEXT:   $vgpr0_hi16 = V_MOV_B16_t16_e32 0, implicit $exec
616   ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
617   ; CHECK-NEXT: {{  $}}
618   ; CHECK-NEXT: bb.1:
619   ; CHECK-NEXT:   liveins: $vgpr1
620   ; CHECK-NEXT: {{  $}}
621   bb.0:
622     liveins: $vgpr0
623     $vgpr0_hi16 = V_MOV_B16_t16_e32 0, implicit $exec
624     $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
625   bb.1:
626     liveins: $vgpr1