xref: /llvm-project/llvm/test/CodeGen/AMDGPU/memory_clause.mir (revision 6206f5444fc0732e6495703c75a67f1f90f5b418)
1# RUN: llc -mtriple=amdgcn -mcpu=gfx902 -verify-machineinstrs -run-pass=si-form-memory-clauses %s -o - | FileCheck -check-prefix=GCN %s
2
3# GCN-LABEL: {{^}}name: vector_clause{{$}}
4# GCN:      %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
5# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
6# GCN-NEXT: %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
7# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec
8# GCN-NEXT: KILL %0{{$}}
9# GCN-NEXT: %5:vreg_64 = IMPLICIT_DEF
10# GCN-NEXT: GLOBAL_STORE_DWORDX4 %5, %1, 0, 0, implicit $exec
11
12---
13name:            vector_clause
14tracksRegLiveness: true
15body:             |
16  bb.0:
17    %0:vreg_64 = IMPLICIT_DEF
18    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
19    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
20    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
21    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec
22    %5:vreg_64 = IMPLICIT_DEF
23    GLOBAL_STORE_DWORDX4 %5, %1, 0, 0, implicit $exec
24    GLOBAL_STORE_DWORDX4 %5, %2, 16, 0, implicit $exec
25    GLOBAL_STORE_DWORDX4 %5, %3, 32, 0, implicit $exec
26    GLOBAL_STORE_DWORDX4 %5, %4, 48, 0, implicit $exec
27...
28
29# This would be a valid soft clause, but there's no need for a KILL
30# since the pointer uses are live beyond the end the clause.
31# GCN-LABEL: {{^}}name: vector_clause_no_kill{{$}}
32# GCN:      %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
33# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
34# GCN-NEXT: %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
35# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec
36# GCN-NEXT: GLOBAL_STORE_DWORDX4 %0, %1, 0, 0, implicit $exec
37
38---
39name:            vector_clause_no_kill
40tracksRegLiveness: true
41body:             |
42  bb.0:
43    %0:vreg_64 = IMPLICIT_DEF
44    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
45    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
46    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
47    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec
48    GLOBAL_STORE_DWORDX4 %0, %1, 0, 0, implicit $exec
49    GLOBAL_STORE_DWORDX4 %0, %2, 16, 0, implicit $exec
50    GLOBAL_STORE_DWORDX4 %0, %3, 32, 0, implicit $exec
51    GLOBAL_STORE_DWORDX4 %0, %4, 48, 0, implicit $exec
52...
53
54# GCN-LABEL: {{^}}name: subreg_full{{$}}
55# GCN:      undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec
56# GCN-NEXT: %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec
57# GCN-NEXT: %1.sub2:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec
58# GCN-NEXT: %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec
59# GCN-NEXT: KILL %0.sub2_sub3{{$}}
60# GCN-NEXT: GLOBAL_STORE_DWORDX4 %0.sub0_sub1, %1, 0, 0, implicit $exec
61
62---
63name:            subreg_full
64tracksRegLiveness: true
65registers:
66  - { id: 0, class: vreg_128 }
67  - { id: 1, class: vreg_128 }
68body:             |
69  bb.0:
70    %0 = IMPLICIT_DEF
71    undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec
72    %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec
73    %1.sub2:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec
74    %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec
75    GLOBAL_STORE_DWORDX4 %0.sub0_sub1, %1, 0, 0, implicit $exec
76...
77
78# GCN-LABEL: {{^}}name: subreg_part{{$}}
79# GCN:      undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec
80# GCN-NEXT: %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec
81# GCN-NEXT: %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec
82# GCN-NEXT: KILL %0.sub2_sub3{{$}}
83# GCN-NEXT: GLOBAL_STORE_DWORDX4 %0.sub0_sub1, %1, 0, 0, implicit $exec
84
85---
86name:            subreg_part
87tracksRegLiveness: true
88registers:
89  - { id: 0, class: vreg_128 }
90  - { id: 1, class: vreg_128 }
91body:             |
92  bb.0:
93    %0 = IMPLICIT_DEF
94    undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec
95    %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec
96    %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec
97    GLOBAL_STORE_DWORDX4 %0.sub0_sub1, %1, 0, 0, implicit $exec
98...
99
100# GCN-LABEL: {{^}}name: dead{{$}}
101# GCN:      dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
102# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
103# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
104# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec
105# GCN-NEXT: KILL %0{{$}}
106
107---
108name:            dead
109tracksRegLiveness: true
110registers:
111  - { id: 0, class: vreg_64 }
112  - { id: 1, class: vreg_128 }
113  - { id: 2, class: vreg_128 }
114  - { id: 3, class: vreg_128 }
115  - { id: 4, class: vreg_128 }
116body:             |
117  bb.0:
118    %0 = IMPLICIT_DEF
119    dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
120    dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
121    dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
122    dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec
123...
124
125# GCN-LABEL: {{^}}name: subreg_dead{{$}}
126# GCN:       undef %2.sub0:vreg_64 = GLOBAL_LOAD_DWORD %0, 16, 0, implicit $exec
127# GCN-NEXT:  dead %2.sub1:vreg_64 = GLOBAL_LOAD_DWORD %0, 32, 0, implicit $exec
128# GCN-NEXT: KILL %0{{$}}
129# GCN-NEXT: GLOBAL_STORE_DWORD %1, %2.sub0, 0, 0, implicit $exec
130
131---
132name:            subreg_dead
133tracksRegLiveness: true
134body:             |
135  bb.0:
136    %0:vreg_64 = IMPLICIT_DEF
137    %1:vreg_64 = IMPLICIT_DEF
138    undef %2.sub0:vreg_64 = GLOBAL_LOAD_DWORD %0, 16, 0, implicit $exec
139    dead %2.sub1:vreg_64 = GLOBAL_LOAD_DWORD %0, 32, 0, implicit $exec
140    GLOBAL_STORE_DWORD %1, %2.sub0, 0, 0, implicit $exec
141...
142
143# GCN-LABEL: {{^}}name: kill{{$}}
144# GCN:      %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
145# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec
146# GCN-NEXT: KILL %1{{$}}
147# GCN-NEXT: KILL %0{{$}}
148
149---
150name:            kill
151tracksRegLiveness: true
152body:             |
153  bb.0:
154    %0:vreg_64 = IMPLICIT_DEF
155    %1:vreg_64 = IMPLICIT_DEF
156    %2:vreg_64 = IMPLICIT_DEF
157    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
158    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 killed %1, 16, 0, implicit $exec
159    GLOBAL_STORE_DWORDX4 %2, %3, 0, 0, implicit $exec
160    GLOBAL_STORE_DWORDX4 %2, %4, 16, 0, implicit $exec
161...
162
163# GCN-LABEL: {{^}}name: indirect{{$}}
164# GCN:      %1:vreg_64 = GLOBAL_LOAD_DWORDX2 %0, 0, 0, implicit $exec
165# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 0, 0, implicit $exec
166# GCN-NEXT: %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec
167# GCN-NEXT: KILL %1{{$}}
168
169---
170name:            indirect
171tracksRegLiveness: true
172registers:
173  - { id: 0, class: vreg_64 }
174  - { id: 1, class: vreg_64 }
175  - { id: 2, class: vreg_128 }
176  - { id: 3, class: vreg_128 }
177body:             |
178  bb.0:
179    %0 = IMPLICIT_DEF
180    %1:vreg_64 = GLOBAL_LOAD_DWORDX2 %0, 0, 0, implicit $exec
181    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 0, 0, implicit $exec
182    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec
183    GLOBAL_STORE_DWORDX4 %0, %2, 0, 0, implicit $exec
184    GLOBAL_STORE_DWORDX4 %0, %3, 16, 0, implicit $exec
185...
186
187# GCN-LABEL: {{^}}name: stack{{$}}
188# GCN:      %0:vreg_64 = IMPLICIT_DEF
189# GCN-NEXT: %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %stack.0, 0, 0, implicit $exec
190# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %stack.0, 16, 0, implicit $exec
191# GCN-NEXT: GLOBAL_STORE_DWORDX4 %0, %1, 0, 0, implicit $exec
192
193---
194name:            stack
195tracksRegLiveness: true
196registers:
197  - { id: 0, class: vreg_64 }
198  - { id: 1, class: vreg_128 }
199  - { id: 2, class: vreg_128 }
200stack:
201  - { id: 0, type: default, offset: 0, size: 64, alignment: 8 }
202body:             |
203  bb.0:
204    %0 = IMPLICIT_DEF
205    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %stack.0, 0, 0, implicit $exec
206    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %stack.0, 16, 0, implicit $exec
207    GLOBAL_STORE_DWORDX4 %0, %1, 0, 0, implicit $exec
208    GLOBAL_STORE_DWORDX4 %0, %2, 16, 0, implicit $exec
209...
210
211# GCN-LABEL: {{^}}name: overflow_counter{{$}}
212# GCN:      dead %2:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec
213# GCN-NEXT: dead %3:vgpr_32 = GLOBAL_LOAD_DWORD %0, 4, 0, implicit $exec
214# GCN-NEXT: dead %4:vgpr_32 = GLOBAL_LOAD_DWORD %0, 8, 0, implicit $exec
215# GCN-NEXT: dead %5:vgpr_32 = GLOBAL_LOAD_DWORD %0, 12, 0, implicit $exec
216# GCN-NEXT: dead %6:vgpr_32 = GLOBAL_LOAD_DWORD %0, 16, 0, implicit $exec
217# GCN-NEXT: dead %7:vgpr_32 = GLOBAL_LOAD_DWORD %0, 20, 0, implicit $exec
218# GCN-NEXT: dead %8:vgpr_32 = GLOBAL_LOAD_DWORD %0, 24, 0, implicit $exec
219# GCN-NEXT: dead %9:vgpr_32 = GLOBAL_LOAD_DWORD %0, 28, 0, implicit $exec
220# GCN-NEXT: dead %10:vgpr_32 = GLOBAL_LOAD_DWORD %0, 32, 0, implicit $exec
221# GCN-NEXT: dead %11:vgpr_32 = GLOBAL_LOAD_DWORD %0, 36, 0, implicit $exec
222# GCN-NEXT: dead %12:vgpr_32 = GLOBAL_LOAD_DWORD %0, 40, 0, implicit $exec
223# GCN-NEXT: dead %13:vgpr_32 = GLOBAL_LOAD_DWORD %0, 44, 0, implicit $exec
224# GCN-NEXT: dead %14:vgpr_32 = GLOBAL_LOAD_DWORD %0, 48, 0, implicit $exec
225# GCN-NEXT: dead %15:vgpr_32 = GLOBAL_LOAD_DWORD %0, 52, 0, implicit $exec
226# GCN-NEXT: dead %16:vgpr_32 = GLOBAL_LOAD_DWORD %0, 56, 0, implicit $exec
227# GCN-NEXT: KILL %0{{$}}
228# GCN-NEXT: dead %17:vgpr_32 = GLOBAL_LOAD_DWORD %1, 60, 0, implicit $exec
229# GCN-NEXT: dead %18:vgpr_32 = GLOBAL_LOAD_DWORD %1, 64, 0, implicit $exec
230# GCN-NEXT: KILL %1{{$}}
231
232---
233name:            overflow_counter
234tracksRegLiveness: true
235body:             |
236  bb.0:
237    %0:vreg_64 = IMPLICIT_DEF
238    %1:vreg_64 = IMPLICIT_DEF
239    %2:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec
240    %3:vgpr_32 = GLOBAL_LOAD_DWORD %0, 4, 0, implicit $exec
241    %4:vgpr_32 = GLOBAL_LOAD_DWORD %0, 8, 0, implicit $exec
242    %5:vgpr_32 = GLOBAL_LOAD_DWORD %0, 12, 0, implicit $exec
243    %6:vgpr_32 = GLOBAL_LOAD_DWORD %0, 16, 0, implicit $exec
244    %7:vgpr_32 = GLOBAL_LOAD_DWORD %0, 20, 0, implicit $exec
245    %8:vgpr_32 = GLOBAL_LOAD_DWORD %0, 24, 0, implicit $exec
246    %9:vgpr_32 = GLOBAL_LOAD_DWORD %0, 28, 0, implicit $exec
247    %10:vgpr_32 = GLOBAL_LOAD_DWORD %0, 32, 0, implicit $exec
248    %11:vgpr_32 = GLOBAL_LOAD_DWORD %0, 36, 0, implicit $exec
249    %12:vgpr_32 = GLOBAL_LOAD_DWORD %0, 40, 0, implicit $exec
250    %13:vgpr_32 = GLOBAL_LOAD_DWORD %0, 44, 0, implicit $exec
251    %14:vgpr_32 = GLOBAL_LOAD_DWORD %0, 48, 0, implicit $exec
252    %15:vgpr_32 = GLOBAL_LOAD_DWORD %0, 52, 0, implicit $exec
253    %16:vgpr_32 = GLOBAL_LOAD_DWORD %0, 56, 0, implicit $exec
254    %17:vgpr_32 = GLOBAL_LOAD_DWORD %1, 60, 0, implicit $exec
255    %18:vgpr_32 = GLOBAL_LOAD_DWORD %1, 64, 0, implicit $exec
256...
257
258# GCN-LABEL: {{^}}name: reg_pressure{{$}}
259# GCN:      dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
260# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
261# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
262# GCN-NEXT: dead %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec
263# GCN-NEXT: dead %6:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 64, 0, implicit $exec
264# GCN-NEXT: dead %7:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 80, 0, implicit $exec
265# GCN-NEXT: dead %8:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 96, 0, implicit $exec
266# GCN-NEXT: dead %9:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 128, 0, implicit $exec
267# GCN-NEXT: dead %10:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 144, 0, implicit $exec
268# GCN-NEXT: KILL %1{{$}}
269# GCN-NEXT: KILL %0{{$}}
270
271---
272name:            reg_pressure
273tracksRegLiveness: true
274body:             |
275  bb.0:
276    %0:vreg_64 = IMPLICIT_DEF
277    %1:vreg_64 = IMPLICIT_DEF
278    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
279    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
280    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
281    %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec
282    %6:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 64, 0, implicit $exec
283    %7:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 80, 0, implicit $exec
284    %8:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 96, 0, implicit $exec
285    %9:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 128, 0, implicit $exec
286    %10:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 144, 0, implicit $exec
287...
288
289# GCN-LABEL: {{^}}name: image_clause{{$}}
290# GCN:      %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec
291# GCN-NEXT: %4:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec
292# GCN-NEXT: %5:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec
293# GCN-NEXT: KILL undef %2:sgpr_128{{$}}
294# GCN-NEXT: IMAGE_STORE_V4_V2 %3, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec
295
296---
297name:            image_clause
298tracksRegLiveness: true
299registers:
300  - { id: 0, class: vreg_64 }
301  - { id: 1, class: sgpr_256 }
302  - { id: 2, class: sgpr_128 }
303  - { id: 3, class: vreg_128 }
304  - { id: 4, class: vreg_128 }
305  - { id: 5, class: vreg_128 }
306body:             |
307  bb.0:
308    %0 = IMPLICIT_DEF
309    %1 = IMPLICIT_DEF
310    %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s128))
311    %4:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s128))
312    %5:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, undef %2:sgpr_128, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s128))
313    IMAGE_STORE_V4_V2 %3, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store (s128))
314    IMAGE_STORE_V4_V2 %4, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store (s128))
315    IMAGE_STORE_V4_V2 %5, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store (s128))
316...
317
318# GCN-LABEL: {{^}}name: mixed_clause{{$}}
319# GCN:      dead %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, %2, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec
320# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
321# GCN-NEXT: dead %5:vgpr_32 = BUFFER_LOAD_DWORD_OFFSET %2, 0, 0, 0, 0, implicit $exec
322# GCN-NEXT: KILL %1{{$}}
323# GCN-NEXT: KILL %2{{$}}
324# GCN-NEXT: KILL %0{{$}}
325
326---
327name:            mixed_clause
328tracksRegLiveness: true
329registers:
330  - { id: 0, class: vreg_64 }
331  - { id: 1, class: sgpr_256 }
332  - { id: 2, class: sgpr_128 }
333  - { id: 3, class: vreg_128 }
334  - { id: 4, class: vreg_128 }
335  - { id: 5, class: vgpr_32 }
336body:             |
337  bb.0:
338    %0 = IMPLICIT_DEF
339    %1 = IMPLICIT_DEF
340    %2 = IMPLICIT_DEF
341    %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, %2, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s128))
342    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
343    %5:vgpr_32 = BUFFER_LOAD_DWORD_OFFSET %2, 0, 0, 0, 0, implicit $exec
344...
345
346# GCN-LABEL: {{^}}name: atomic{{$}}
347# GCN:      %1:vgpr_32 = IMPLICIT_DEF
348# GCN-NEXT: dead %2:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr
349# GCN-NEXT: dead %3:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr
350# GCN-NEXT: FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr
351# GCN-NEXT: FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr
352# GCN-NEXT: S_ENDPGM 0
353
354---
355name:            atomic
356tracksRegLiveness: true
357registers:
358  - { id: 0, class: vreg_64 }
359  - { id: 1, class: vgpr_32 }
360  - { id: 2, class: vgpr_32 }
361  - { id: 3, class: vgpr_32 }
362body:             |
363  bb.0:
364    %0 = IMPLICIT_DEF
365    %1 = IMPLICIT_DEF
366    %2:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr
367    %3:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr
368    FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr
369    FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr
370    S_ENDPGM 0
371...
372
373# One of the pointers has an additional use after the clause, but one
374# doesn't. Only the final use should be killed.
375
376# GCN-LABEL: {{^}}name: ptr_use_after_clause{{$}}
377# GCN: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
378# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec
379# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
380# GCN-NEXT: dead %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 48, 0, implicit $exec
381# GCN-NEXT: KILL %1{{$}}
382# GCN-NEXT: S_NOP 0, implicit %0
383---
384name:            ptr_use_after_clause
385tracksRegLiveness: true
386body:             |
387  bb.0:
388    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
389    %0:vreg_64 = COPY $vgpr0_vgpr1
390    %1:vreg_64 = COPY $vgpr2_vgpr3
391    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
392    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec
393    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
394    %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 48, 0, implicit $exec
395    S_NOP 0, implicit %0
396...
397
398# Only part of the register is really live past the clause.
399# GCN-LABEL: {{^}}name: ptr_use_after_clause_subreg{{$}}
400# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
401# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec
402# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec
403# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec
404# GCN-NEXT: KILL %0.sub2_sub3{{$}}
405# GCN-NEXT: S_NOP 0, implicit %0.sub0_sub1{{$}}
406---
407name:            ptr_use_after_clause_subreg
408tracksRegLiveness: true
409body:             |
410  bb.0:
411    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
412    %0:vreg_128 = COPY $vgpr0_vgpr1_vgpr2_vgpr3
413    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
414    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec
415    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec
416    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec
417    S_NOP 0, implicit %0.sub0_sub1
418...
419
420# More complex situation where only some of the use subregisters live
421# beyond the clause.
422
423# GCN-LABEL: {{^}}name: ptr_use_after_clause_subreg_multi{{$}}
424# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
425# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec
426# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub3_sub4, 32, 0, implicit $exec
427# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub6_sub7, 48, 0, implicit $exec
428# GCN-NEXT: KILL %0.sub2_sub3_sub4, %0.sub7{{$}}
429# GCN-NEXT: S_NOP 0, implicit %0.sub0_sub1, implicit %0.sub5_sub6
430---
431name:            ptr_use_after_clause_subreg_multi
432tracksRegLiveness: true
433body:             |
434  bb.0:
435    liveins: $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7
436    %0:vreg_256 = COPY $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7
437    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
438    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec
439    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub3_sub4, 32, 0, implicit $exec
440    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub6_sub7, 48, 0, implicit $exec
441    S_NOP 0, implicit %0.sub0_sub1, implicit %0.sub5_sub6
442...
443
444# Have subranges, but none of them are killed
445# GCN-LABEL: {{^}}name: no_killed_subranges{{$}}
446# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
447# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec
448# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec
449# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec
450# GCN-NEXT: S_NOP 0, implicit %0.sub0_sub1{{$}}
451# GCN-NEXT: S_NOP 0, implicit %0.sub2_sub3{{$}}
452---
453name:            no_killed_subranges
454tracksRegLiveness: true
455body:             |
456  bb.0:
457    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
458    %0:vreg_128 = COPY $vgpr0_vgpr1_vgpr2_vgpr3
459    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
460    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec
461    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec
462    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec
463    S_NOP 0, implicit %0.sub0_sub1
464    S_NOP 0, implicit %0.sub2_sub3
465...
466
467# sub2 is undef at entry to the soft clause. It should not be have its
468# live range extended.
469
470# GCN-LABEL: name: no_killed_undef_subrange_use
471# GCN:      dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
472# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec
473# GCN-NEXT: KILL %0.sub0_sub1{{$}}
474# GCN-NEXT: %0.sub2:vreg_128 = V_MOV_B32_e32 0, implicit $exec
475# GCN-NEXT: S_NOP 0, implicit %0.sub2
476---
477name:            no_killed_undef_subrange_use
478tracksRegLiveness: true
479body:             |
480  bb.0:
481    liveins: $vgpr0_vgpr1
482    undef %0.sub0_sub1:vreg_128 = COPY $vgpr0_vgpr1
483    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
484    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec
485    %0.sub2:vreg_128 = V_MOV_B32_e32 0, implicit $exec
486    S_NOP 0, implicit %0.sub2
487...
488
489# Make sure intervening implicit_defs are not treated as breaking the
490# clause
491#
492# GCN-LABEL: {{^}}name: implicit_def_no_break{{$}}
493# GCN: %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
494# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
495# GCN-NEXT: %3:vreg_64 = IMPLICIT_DEF
496# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 32, 0, implicit $exec
497# GCN-NEXT: %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 48, 0, implicit $exec
498# GCN-NEXT: KILL %3{{$}}
499# GCN-NEXT: KILL %0{{$}}
500---
501name:            implicit_def_no_break
502tracksRegLiveness: true
503body:             |
504  bb.0:
505    liveins: $vgpr0_vgpr1
506    %0:vreg_64 = COPY $vgpr0_vgpr1
507    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
508    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
509    %3:vreg_64 = IMPLICIT_DEF
510    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 32, 0, implicit $exec
511    %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 48, 0, implicit $exec
512    S_NOP 0, implicit %1, implicit %2, implicit %4, implicit %5
513...
514
515# GCN-LABEL: {{^}}name: kill_part_subreg{{$}}
516# GCN: undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec
517# GCN-NEXT: %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec
518# GCN-NEXT: %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec
519# GCN-NEXT: KILL %0.sub0_sub1_sub2, %0.sub3
520---
521name:            kill_part_subreg
522tracksRegLiveness: true
523body:             |
524  bb.0:
525    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
526    %0:vreg_128 = COPY $vgpr0_vgpr1_vgpr2_vgpr3
527    undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec
528    %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec
529    %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec
530    S_NOP 0, implicit %1
531...
532
533# GCN-LABEL: {{^}}name: mem_clause_sreg256_used_stack{{$}}
534# GCN:      undef %0.sub7:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 8, 0
535# GCN-NEXT: dead %0.sub3:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 24, 0
536# GCN-NEXT:  KILL undef %1
537---
538name:            mem_clause_sreg256_used_stack
539stack:
540  - { id: 0, type: default, offset: 0, size: 40, alignment: 8 }
541machineFunctionInfo:
542  isEntryFunction: true
543  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
544  stackPtrOffsetReg: '$sgpr32'
545body:             |
546  bb.0:
547
548    undef %0.sub7:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 8, 0
549    %0.sub3:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 24, 0
550    S_ENDPGM 0
551
552...
553