1# RUN: llc -march=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: KILL %0{{$}}
265# GCN-NEXT: dead %7:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 80, 0, implicit $exec
266# GCN-NEXT: dead %8:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 96, 0, implicit $exec
267# GCN-NEXT: KILL %1{{$}}
268
269---
270name:            reg_pressure
271tracksRegLiveness: true
272body:             |
273  bb.0:
274    %0:vreg_64 = IMPLICIT_DEF
275    %1:vreg_64 = IMPLICIT_DEF
276    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
277    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
278    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
279    %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 48, 0, implicit $exec
280    %6:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 64, 0, implicit $exec
281    %7:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 80, 0, implicit $exec
282    %8:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 96, 0, implicit $exec
283...
284
285# GCN-LABEL: {{^}}name: image_clause{{$}}
286# 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
287# 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
288# 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
289# GCN-NEXT: KILL undef %2:sgpr_128{{$}}
290# GCN-NEXT: IMAGE_STORE_V4_V2 %3, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec
291
292---
293name:            image_clause
294tracksRegLiveness: true
295registers:
296  - { id: 0, class: vreg_64 }
297  - { id: 1, class: sgpr_256 }
298  - { id: 2, class: sgpr_128 }
299  - { id: 3, class: vreg_128 }
300  - { id: 4, class: vreg_128 }
301  - { id: 5, class: vreg_128 }
302body:             |
303  bb.0:
304    %0 = IMPLICIT_DEF
305    %1 = IMPLICIT_DEF
306    %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))
307    %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))
308    %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))
309    IMAGE_STORE_V4_V2 %3, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store (s128))
310    IMAGE_STORE_V4_V2 %4, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store (s128))
311    IMAGE_STORE_V4_V2 %5, %0, %1, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store (s128))
312...
313
314# GCN-LABEL: {{^}}name: mixed_clause{{$}}
315# GCN:      dead %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, %2, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec
316# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
317# GCN-NEXT: dead %5:vgpr_32 = BUFFER_LOAD_DWORD_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec
318# GCN-NEXT: KILL %1{{$}}
319# GCN-NEXT: KILL %2{{$}}
320# GCN-NEXT: KILL %0{{$}}
321
322---
323name:            mixed_clause
324tracksRegLiveness: true
325registers:
326  - { id: 0, class: vreg_64 }
327  - { id: 1, class: sgpr_256 }
328  - { id: 2, class: sgpr_128 }
329  - { id: 3, class: vreg_128 }
330  - { id: 4, class: vreg_128 }
331  - { id: 5, class: vgpr_32 }
332body:             |
333  bb.0:
334    %0 = IMPLICIT_DEF
335    %1 = IMPLICIT_DEF
336    %2 = IMPLICIT_DEF
337    %3:vreg_128 = IMAGE_SAMPLE_LZ_V4_V2 %0, %1, %2, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (load (s128))
338    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
339    %5:vgpr_32 = BUFFER_LOAD_DWORD_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec
340...
341
342# GCN-LABEL: {{^}}name: atomic{{$}}
343# GCN:      %1:vgpr_32 = IMPLICIT_DEF
344# GCN-NEXT: dead %2:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr
345# GCN-NEXT: dead %3:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr
346# GCN-NEXT: FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr
347# GCN-NEXT: FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr
348# GCN-NEXT: S_ENDPGM 0
349
350---
351name:            atomic
352tracksRegLiveness: true
353registers:
354  - { id: 0, class: vreg_64 }
355  - { id: 1, class: vgpr_32 }
356  - { id: 2, class: vgpr_32 }
357  - { id: 3, class: vgpr_32 }
358body:             |
359  bb.0:
360    %0 = IMPLICIT_DEF
361    %1 = IMPLICIT_DEF
362    %2:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr
363    %3:vgpr_32 = FLAT_ATOMIC_ADD_RTN %0, %1, 0, 2, implicit $exec, implicit $flat_scr
364    FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr
365    FLAT_ATOMIC_ADD %0, %1, 0, 0, implicit $exec, implicit $flat_scr
366    S_ENDPGM 0
367...
368
369# One of the pointers has an additional use after the clause, but one
370# doesn't. Only the final use should be killed.
371
372# GCN-LABEL: {{^}}name: ptr_use_after_clause{{$}}
373# GCN: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
374# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec
375# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
376# GCN-NEXT: dead %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 48, 0, implicit $exec
377# GCN-NEXT: KILL %1{{$}}
378# GCN-NEXT: S_NOP 0, implicit %0
379---
380name:            ptr_use_after_clause
381tracksRegLiveness: true
382body:             |
383  bb.0:
384    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
385    %0:vreg_64 = COPY $vgpr0_vgpr1
386    %1:vreg_64 = COPY $vgpr2_vgpr3
387    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
388    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 16, 0, implicit $exec
389    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 32, 0, implicit $exec
390    %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %1, 48, 0, implicit $exec
391    S_NOP 0, implicit %0
392...
393
394# Only part of the register is really live past the clause.
395# GCN-LABEL: {{^}}name: ptr_use_after_clause_subreg{{$}}
396# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
397# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec
398# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec
399# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec
400# GCN-NEXT: KILL %0.sub2_sub3{{$}}
401# GCN-NEXT: S_NOP 0, implicit %0.sub0_sub1{{$}}
402---
403name:            ptr_use_after_clause_subreg
404tracksRegLiveness: true
405body:             |
406  bb.0:
407    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
408    %0:vreg_128 = COPY $vgpr0_vgpr1_vgpr2_vgpr3
409    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
410    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec
411    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec
412    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec
413    S_NOP 0, implicit %0.sub0_sub1
414...
415
416# More complex situation where only some of the use subregisters live
417# beyond the clause.
418
419# GCN-LABEL: {{^}}name: ptr_use_after_clause_subreg_multi{{$}}
420# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
421# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec
422# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub3_sub4, 32, 0, implicit $exec
423# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub6_sub7, 48, 0, implicit $exec
424# GCN-NEXT: KILL %0.sub2_sub3_sub4, %0.sub7{{$}}
425# GCN-NEXT: S_NOP 0, implicit %0.sub0_sub1, implicit %0.sub5_sub6
426---
427name:            ptr_use_after_clause_subreg_multi
428tracksRegLiveness: true
429body:             |
430  bb.0:
431    liveins: $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7
432    %0:vreg_256 = COPY $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7
433    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
434    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec
435    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub3_sub4, 32, 0, implicit $exec
436    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub6_sub7, 48, 0, implicit $exec
437    S_NOP 0, implicit %0.sub0_sub1, implicit %0.sub5_sub6
438...
439
440# Have subranges, but none of them are killed
441# GCN-LABEL: {{^}}name: no_killed_subranges{{$}}
442# GCN: dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
443# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec
444# GCN-NEXT: dead %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec
445# GCN-NEXT: dead %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec
446# GCN-NEXT: S_NOP 0, implicit %0.sub0_sub1{{$}}
447# GCN-NEXT: S_NOP 0, implicit %0.sub2_sub3{{$}}
448---
449name:            no_killed_subranges
450tracksRegLiveness: true
451body:             |
452  bb.0:
453    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
454    %0:vreg_128 = COPY $vgpr0_vgpr1_vgpr2_vgpr3
455    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
456    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 16, 0, implicit $exec
457    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec
458    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub2_sub3, 48, 0, implicit $exec
459    S_NOP 0, implicit %0.sub0_sub1
460    S_NOP 0, implicit %0.sub2_sub3
461...
462
463# sub2 is undef at entry to the soft clause. It should not be have its
464# live range extended.
465
466# GCN-LABEL: name: no_killed_undef_subrange_use
467# GCN:      dead %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
468# GCN-NEXT: dead %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec
469# GCN-NEXT: KILL %0.sub0_sub1{{$}}
470# GCN-NEXT: %0.sub2:vreg_128 = V_MOV_B32_e32 0, implicit $exec
471# GCN-NEXT: S_NOP 0, implicit %0.sub2
472---
473name:            no_killed_undef_subrange_use
474tracksRegLiveness: true
475body:             |
476  bb.0:
477    liveins: $vgpr0_vgpr1
478    undef %0.sub0_sub1:vreg_128 = COPY $vgpr0_vgpr1
479    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 0, 0, implicit $exec
480    %3:vreg_128 = GLOBAL_LOAD_DWORDX4 %0.sub0_sub1, 32, 0, implicit $exec
481    %0.sub2:vreg_128 = V_MOV_B32_e32 0, implicit $exec
482    S_NOP 0, implicit %0.sub2
483...
484
485# Make sure intervening implicit_defs are not treated as breaking the
486# clause
487#
488# GCN-LABEL: {{^}}name: implicit_def_no_break{{$}}
489# GCN: %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
490# GCN-NEXT: %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
491# GCN-NEXT: %3:vreg_64 = IMPLICIT_DEF
492# GCN-NEXT: %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 32, 0, implicit $exec
493# GCN-NEXT: %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 48, 0, implicit $exec
494# GCN-NEXT: KILL %3{{$}}
495# GCN-NEXT: KILL %0{{$}}
496---
497name:            implicit_def_no_break
498tracksRegLiveness: true
499body:             |
500  bb.0:
501    liveins: $vgpr0_vgpr1
502    %0:vreg_64 = COPY $vgpr0_vgpr1
503    %1:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 0, 0, implicit $exec
504    %2:vreg_128 = GLOBAL_LOAD_DWORDX4 %0, 16, 0, implicit $exec
505    %3:vreg_64 = IMPLICIT_DEF
506    %4:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 32, 0, implicit $exec
507    %5:vreg_128 = GLOBAL_LOAD_DWORDX4 %3, 48, 0, implicit $exec
508    S_NOP 0, implicit %1, implicit %2, implicit %4, implicit %5
509...
510
511# GCN-LABEL: {{^}}name: kill_part_subreg{{$}}
512# GCN: undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec
513# GCN-NEXT: %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec
514# GCN-NEXT: %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec
515# GCN-NEXT: KILL %0.sub0_sub1_sub2, %0.sub3
516---
517name:            kill_part_subreg
518tracksRegLiveness: true
519body:             |
520  bb.0:
521    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
522    %0:vreg_128 = COPY $vgpr0_vgpr1_vgpr2_vgpr3
523    undef %1.sub0:vreg_128 = GLOBAL_LOAD_DWORD %0.sub0_sub1, 0, 0, implicit $exec
524    %1.sub1:vreg_128 = GLOBAL_LOAD_DWORD %0.sub1_sub2, 16, 0, implicit $exec
525    %1.sub3:vreg_128 = GLOBAL_LOAD_DWORD %0.sub2_sub3, 32, 0, implicit $exec
526    S_NOP 0, implicit %1
527...
528
529# GCN-LABEL: {{^}}name: mem_clause_sreg256_used_stack{{$}}
530# GCN:      undef %0.sub7:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 8, 0
531# GCN-NEXT: dead %0.sub3:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 24, 0
532# GCN-NEXT:  KILL undef %1
533---
534name:            mem_clause_sreg256_used_stack
535stack:
536  - { id: 0, type: default, offset: 0, size: 40, alignment: 8 }
537machineFunctionInfo:
538  isEntryFunction: true
539  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
540  stackPtrOffsetReg: '$sgpr32'
541body:             |
542  bb.0:
543
544    undef %0.sub7:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 8, 0
545    %0.sub3:sgpr_256 = S_LOAD_DWORD_IMM undef %1:sgpr_64(p4), 24, 0
546    S_ENDPGM 0
547
548...
549