1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-globals
2; RUN: opt -mtriple=amdgcn-unknown-amdhsa -S -amdgpu-annotate-kernel-features < %s | FileCheck -check-prefixes=AKF_HSA %s
3; RUN: opt -mtriple=amdgcn-unknown-amdhsa -S -amdgpu-attributor < %s | FileCheck -check-prefixes=ATTRIBUTOR_HSA %s
4
5; TODO: The test contains UB which is refined by the Attributor and should be removed.
6
7declare i32 @llvm.amdgcn.workgroup.id.x() #0
8declare i32 @llvm.amdgcn.workgroup.id.y() #0
9declare i32 @llvm.amdgcn.workgroup.id.z() #0
10
11declare i32 @llvm.amdgcn.workitem.id.x() #0
12declare i32 @llvm.amdgcn.workitem.id.y() #0
13declare i32 @llvm.amdgcn.workitem.id.z() #0
14
15declare i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr() #0
16declare i8 addrspace(4)* @llvm.amdgcn.queue.ptr() #0
17declare i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() #0
18declare i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() #0
19declare i64 @llvm.amdgcn.dispatch.id() #0
20
21define void @use_workitem_id_x() #1 {
22; AKF_HSA-LABEL: define {{[^@]+}}@use_workitem_id_x
23; AKF_HSA-SAME: () #[[ATTR1:[0-9]+]] {
24; AKF_HSA-NEXT:    [[VAL:%.*]] = call i32 @llvm.amdgcn.workitem.id.x()
25; AKF_HSA-NEXT:    store volatile i32 [[VAL]], i32 addrspace(1)* undef, align 4
26; AKF_HSA-NEXT:    ret void
27;
28; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_workitem_id_x
29; ATTRIBUTOR_HSA-SAME: () #[[ATTR1:[0-9]+]] {
30; ATTRIBUTOR_HSA-NEXT:    ret void
31;
32  %val = call i32 @llvm.amdgcn.workitem.id.x()
33  store volatile i32 %val, i32 addrspace(1)* undef
34  ret void
35}
36
37define void @use_workitem_id_y() #1 {
38; AKF_HSA-LABEL: define {{[^@]+}}@use_workitem_id_y
39; AKF_HSA-SAME: () #[[ATTR2:[0-9]+]] {
40; AKF_HSA-NEXT:    [[VAL:%.*]] = call i32 @llvm.amdgcn.workitem.id.y()
41; AKF_HSA-NEXT:    store volatile i32 [[VAL]], i32 addrspace(1)* undef, align 4
42; AKF_HSA-NEXT:    ret void
43;
44; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_workitem_id_y
45; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
46; ATTRIBUTOR_HSA-NEXT:    ret void
47;
48  %val = call i32 @llvm.amdgcn.workitem.id.y()
49  store volatile i32 %val, i32 addrspace(1)* undef
50  ret void
51}
52
53define void @use_workitem_id_z() #1 {
54; AKF_HSA-LABEL: define {{[^@]+}}@use_workitem_id_z
55; AKF_HSA-SAME: () #[[ATTR3:[0-9]+]] {
56; AKF_HSA-NEXT:    [[VAL:%.*]] = call i32 @llvm.amdgcn.workitem.id.z()
57; AKF_HSA-NEXT:    store volatile i32 [[VAL]], i32 addrspace(1)* undef, align 4
58; AKF_HSA-NEXT:    ret void
59;
60; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_workitem_id_z
61; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
62; ATTRIBUTOR_HSA-NEXT:    ret void
63;
64  %val = call i32 @llvm.amdgcn.workitem.id.z()
65  store volatile i32 %val, i32 addrspace(1)* undef
66  ret void
67}
68
69define void @use_workgroup_id_x() #1 {
70; AKF_HSA-LABEL: define {{[^@]+}}@use_workgroup_id_x
71; AKF_HSA-SAME: () #[[ATTR4:[0-9]+]] {
72; AKF_HSA-NEXT:    [[VAL:%.*]] = call i32 @llvm.amdgcn.workgroup.id.x()
73; AKF_HSA-NEXT:    store volatile i32 [[VAL]], i32 addrspace(1)* undef, align 4
74; AKF_HSA-NEXT:    ret void
75;
76; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_workgroup_id_x
77; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
78; ATTRIBUTOR_HSA-NEXT:    ret void
79;
80  %val = call i32 @llvm.amdgcn.workgroup.id.x()
81  store volatile i32 %val, i32 addrspace(1)* undef
82  ret void
83}
84
85define void @use_workgroup_id_y() #1 {
86; AKF_HSA-LABEL: define {{[^@]+}}@use_workgroup_id_y
87; AKF_HSA-SAME: () #[[ATTR5:[0-9]+]] {
88; AKF_HSA-NEXT:    [[VAL:%.*]] = call i32 @llvm.amdgcn.workgroup.id.y()
89; AKF_HSA-NEXT:    store volatile i32 [[VAL]], i32 addrspace(1)* undef, align 4
90; AKF_HSA-NEXT:    ret void
91;
92; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_workgroup_id_y
93; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
94; ATTRIBUTOR_HSA-NEXT:    ret void
95;
96  %val = call i32 @llvm.amdgcn.workgroup.id.y()
97  store volatile i32 %val, i32 addrspace(1)* undef
98  ret void
99}
100
101define void @use_workgroup_id_z() #1 {
102; AKF_HSA-LABEL: define {{[^@]+}}@use_workgroup_id_z
103; AKF_HSA-SAME: () #[[ATTR6:[0-9]+]] {
104; AKF_HSA-NEXT:    [[VAL:%.*]] = call i32 @llvm.amdgcn.workgroup.id.z()
105; AKF_HSA-NEXT:    store volatile i32 [[VAL]], i32 addrspace(1)* undef, align 4
106; AKF_HSA-NEXT:    ret void
107;
108; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_workgroup_id_z
109; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
110; ATTRIBUTOR_HSA-NEXT:    ret void
111;
112  %val = call i32 @llvm.amdgcn.workgroup.id.z()
113  store volatile i32 %val, i32 addrspace(1)* undef
114  ret void
115}
116
117define void @use_dispatch_ptr() #1 {
118; AKF_HSA-LABEL: define {{[^@]+}}@use_dispatch_ptr
119; AKF_HSA-SAME: () #[[ATTR7:[0-9]+]] {
120; AKF_HSA-NEXT:    [[DISPATCH_PTR:%.*]] = call i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr()
121; AKF_HSA-NEXT:    store volatile i8 addrspace(4)* [[DISPATCH_PTR]], i8 addrspace(4)* addrspace(1)* undef, align 8
122; AKF_HSA-NEXT:    ret void
123;
124; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_dispatch_ptr
125; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
126; ATTRIBUTOR_HSA-NEXT:    ret void
127;
128  %dispatch.ptr = call i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr()
129  store volatile i8 addrspace(4)* %dispatch.ptr, i8 addrspace(4)* addrspace(1)* undef
130  ret void
131}
132
133define void @use_queue_ptr() #1 {
134; AKF_HSA-LABEL: define {{[^@]+}}@use_queue_ptr
135; AKF_HSA-SAME: () #[[ATTR8:[0-9]+]] {
136; AKF_HSA-NEXT:    [[QUEUE_PTR:%.*]] = call i8 addrspace(4)* @llvm.amdgcn.queue.ptr()
137; AKF_HSA-NEXT:    store volatile i8 addrspace(4)* [[QUEUE_PTR]], i8 addrspace(4)* addrspace(1)* undef, align 8
138; AKF_HSA-NEXT:    ret void
139;
140; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_queue_ptr
141; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
142; ATTRIBUTOR_HSA-NEXT:    ret void
143;
144  %queue.ptr = call i8 addrspace(4)* @llvm.amdgcn.queue.ptr()
145  store volatile i8 addrspace(4)* %queue.ptr, i8 addrspace(4)* addrspace(1)* undef
146  ret void
147}
148
149define void @use_dispatch_id() #1 {
150; AKF_HSA-LABEL: define {{[^@]+}}@use_dispatch_id
151; AKF_HSA-SAME: () #[[ATTR9:[0-9]+]] {
152; AKF_HSA-NEXT:    [[VAL:%.*]] = call i64 @llvm.amdgcn.dispatch.id()
153; AKF_HSA-NEXT:    store volatile i64 [[VAL]], i64 addrspace(1)* undef, align 4
154; AKF_HSA-NEXT:    ret void
155;
156; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_dispatch_id
157; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
158; ATTRIBUTOR_HSA-NEXT:    ret void
159;
160  %val = call i64 @llvm.amdgcn.dispatch.id()
161  store volatile i64 %val, i64 addrspace(1)* undef
162  ret void
163}
164
165define void @use_workgroup_id_y_workgroup_id_z() #1 {
166; AKF_HSA-LABEL: define {{[^@]+}}@use_workgroup_id_y_workgroup_id_z
167; AKF_HSA-SAME: () #[[ATTR10:[0-9]+]] {
168; AKF_HSA-NEXT:    [[VAL0:%.*]] = call i32 @llvm.amdgcn.workgroup.id.y()
169; AKF_HSA-NEXT:    [[VAL1:%.*]] = call i32 @llvm.amdgcn.workgroup.id.z()
170; AKF_HSA-NEXT:    store volatile i32 [[VAL0]], i32 addrspace(1)* undef, align 4
171; AKF_HSA-NEXT:    store volatile i32 [[VAL1]], i32 addrspace(1)* undef, align 4
172; AKF_HSA-NEXT:    ret void
173;
174; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_workgroup_id_y_workgroup_id_z
175; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
176; ATTRIBUTOR_HSA-NEXT:    ret void
177;
178  %val0 = call i32 @llvm.amdgcn.workgroup.id.y()
179  %val1 = call i32 @llvm.amdgcn.workgroup.id.z()
180  store volatile i32 %val0, i32 addrspace(1)* undef
181  store volatile i32 %val1, i32 addrspace(1)* undef
182  ret void
183}
184
185define void @func_indirect_use_workitem_id_x() #1 {
186; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workitem_id_x
187; AKF_HSA-SAME: () #[[ATTR1]] {
188; AKF_HSA-NEXT:    call void @use_workitem_id_x()
189; AKF_HSA-NEXT:    ret void
190;
191; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workitem_id_x
192; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
193; ATTRIBUTOR_HSA-NEXT:    call void @use_workitem_id_x() #[[ATTR10:[0-9]+]]
194; ATTRIBUTOR_HSA-NEXT:    ret void
195;
196  call void @use_workitem_id_x()
197  ret void
198}
199
200define void @kernel_indirect_use_workitem_id_x() #1 {
201; AKF_HSA-LABEL: define {{[^@]+}}@kernel_indirect_use_workitem_id_x
202; AKF_HSA-SAME: () #[[ATTR1]] {
203; AKF_HSA-NEXT:    call void @use_workitem_id_x()
204; AKF_HSA-NEXT:    ret void
205;
206; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@kernel_indirect_use_workitem_id_x
207; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
208; ATTRIBUTOR_HSA-NEXT:    call void @use_workitem_id_x() #[[ATTR10]]
209; ATTRIBUTOR_HSA-NEXT:    ret void
210;
211  call void @use_workitem_id_x()
212  ret void
213}
214
215define void @func_indirect_use_workitem_id_y() #1 {
216; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workitem_id_y
217; AKF_HSA-SAME: () #[[ATTR2]] {
218; AKF_HSA-NEXT:    call void @use_workitem_id_y()
219; AKF_HSA-NEXT:    ret void
220;
221; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workitem_id_y
222; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
223; ATTRIBUTOR_HSA-NEXT:    call void @use_workitem_id_y() #[[ATTR10]]
224; ATTRIBUTOR_HSA-NEXT:    ret void
225;
226  call void @use_workitem_id_y()
227  ret void
228}
229
230define void @func_indirect_use_workitem_id_z() #1 {
231; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workitem_id_z
232; AKF_HSA-SAME: () #[[ATTR3]] {
233; AKF_HSA-NEXT:    call void @use_workitem_id_z()
234; AKF_HSA-NEXT:    ret void
235;
236; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workitem_id_z
237; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
238; ATTRIBUTOR_HSA-NEXT:    call void @use_workitem_id_z() #[[ATTR10]]
239; ATTRIBUTOR_HSA-NEXT:    ret void
240;
241  call void @use_workitem_id_z()
242  ret void
243}
244
245define void @func_indirect_use_workgroup_id_x() #1 {
246; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workgroup_id_x
247; AKF_HSA-SAME: () #[[ATTR4]] {
248; AKF_HSA-NEXT:    call void @use_workgroup_id_x()
249; AKF_HSA-NEXT:    ret void
250;
251; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workgroup_id_x
252; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
253; ATTRIBUTOR_HSA-NEXT:    call void @use_workgroup_id_x() #[[ATTR10]]
254; ATTRIBUTOR_HSA-NEXT:    ret void
255;
256  call void @use_workgroup_id_x()
257  ret void
258}
259
260define void @kernel_indirect_use_workgroup_id_x() #1 {
261; AKF_HSA-LABEL: define {{[^@]+}}@kernel_indirect_use_workgroup_id_x
262; AKF_HSA-SAME: () #[[ATTR4]] {
263; AKF_HSA-NEXT:    call void @use_workgroup_id_x()
264; AKF_HSA-NEXT:    ret void
265;
266; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@kernel_indirect_use_workgroup_id_x
267; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
268; ATTRIBUTOR_HSA-NEXT:    call void @use_workgroup_id_x() #[[ATTR10]]
269; ATTRIBUTOR_HSA-NEXT:    ret void
270;
271  call void @use_workgroup_id_x()
272  ret void
273}
274
275define void @func_indirect_use_workgroup_id_y() #1 {
276; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workgroup_id_y
277; AKF_HSA-SAME: () #[[ATTR5]] {
278; AKF_HSA-NEXT:    call void @use_workgroup_id_y()
279; AKF_HSA-NEXT:    ret void
280;
281; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workgroup_id_y
282; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
283; ATTRIBUTOR_HSA-NEXT:    call void @use_workgroup_id_y() #[[ATTR10]]
284; ATTRIBUTOR_HSA-NEXT:    ret void
285;
286  call void @use_workgroup_id_y()
287  ret void
288}
289
290define void @func_indirect_use_workgroup_id_z() #1 {
291; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workgroup_id_z
292; AKF_HSA-SAME: () #[[ATTR6]] {
293; AKF_HSA-NEXT:    call void @use_workgroup_id_z()
294; AKF_HSA-NEXT:    ret void
295;
296; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workgroup_id_z
297; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
298; ATTRIBUTOR_HSA-NEXT:    call void @use_workgroup_id_z() #[[ATTR10]]
299; ATTRIBUTOR_HSA-NEXT:    ret void
300;
301  call void @use_workgroup_id_z()
302  ret void
303}
304
305define void @func_indirect_indirect_use_workgroup_id_y() #1 {
306; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_indirect_use_workgroup_id_y
307; AKF_HSA-SAME: () #[[ATTR5]] {
308; AKF_HSA-NEXT:    call void @func_indirect_use_workgroup_id_y()
309; AKF_HSA-NEXT:    ret void
310;
311; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_indirect_use_workgroup_id_y
312; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
313; ATTRIBUTOR_HSA-NEXT:    call void @func_indirect_use_workgroup_id_y() #[[ATTR10]]
314; ATTRIBUTOR_HSA-NEXT:    ret void
315;
316  call void @func_indirect_use_workgroup_id_y()
317  ret void
318}
319
320define void @indirect_x2_use_workgroup_id_y() #1 {
321; AKF_HSA-LABEL: define {{[^@]+}}@indirect_x2_use_workgroup_id_y
322; AKF_HSA-SAME: () #[[ATTR5]] {
323; AKF_HSA-NEXT:    call void @func_indirect_indirect_use_workgroup_id_y()
324; AKF_HSA-NEXT:    ret void
325;
326; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@indirect_x2_use_workgroup_id_y
327; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
328; ATTRIBUTOR_HSA-NEXT:    call void @func_indirect_indirect_use_workgroup_id_y() #[[ATTR10]]
329; ATTRIBUTOR_HSA-NEXT:    ret void
330;
331  call void @func_indirect_indirect_use_workgroup_id_y()
332  ret void
333}
334
335define void @func_indirect_use_dispatch_ptr() #1 {
336; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_dispatch_ptr
337; AKF_HSA-SAME: () #[[ATTR7]] {
338; AKF_HSA-NEXT:    call void @use_dispatch_ptr()
339; AKF_HSA-NEXT:    ret void
340;
341; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_dispatch_ptr
342; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
343; ATTRIBUTOR_HSA-NEXT:    call void @use_dispatch_ptr() #[[ATTR10]]
344; ATTRIBUTOR_HSA-NEXT:    ret void
345;
346  call void @use_dispatch_ptr()
347  ret void
348}
349
350define void @func_indirect_use_queue_ptr() #1 {
351; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_queue_ptr
352; AKF_HSA-SAME: () #[[ATTR8]] {
353; AKF_HSA-NEXT:    call void @use_queue_ptr()
354; AKF_HSA-NEXT:    ret void
355;
356; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_queue_ptr
357; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
358; ATTRIBUTOR_HSA-NEXT:    call void @use_queue_ptr() #[[ATTR10]]
359; ATTRIBUTOR_HSA-NEXT:    ret void
360;
361  call void @use_queue_ptr()
362  ret void
363}
364
365define void @func_indirect_use_dispatch_id() #1 {
366; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_dispatch_id
367; AKF_HSA-SAME: () #[[ATTR9]] {
368; AKF_HSA-NEXT:    call void @use_dispatch_id()
369; AKF_HSA-NEXT:    ret void
370;
371; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_dispatch_id
372; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
373; ATTRIBUTOR_HSA-NEXT:    call void @use_dispatch_id() #[[ATTR10]]
374; ATTRIBUTOR_HSA-NEXT:    ret void
375;
376  call void @use_dispatch_id()
377  ret void
378}
379
380define void @func_indirect_use_workgroup_id_y_workgroup_id_z() #1 {
381; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workgroup_id_y_workgroup_id_z
382; AKF_HSA-SAME: () #[[ATTR11:[0-9]+]] {
383; AKF_HSA-NEXT:    call void @func_indirect_use_workgroup_id_y_workgroup_id_z()
384; AKF_HSA-NEXT:    ret void
385;
386; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_workgroup_id_y_workgroup_id_z
387; ATTRIBUTOR_HSA-SAME: () #[[ATTR2:[0-9]+]] {
388; ATTRIBUTOR_HSA-NEXT:    unreachable
389;
390  call void @func_indirect_use_workgroup_id_y_workgroup_id_z()
391  ret void
392}
393
394define void @recursive_use_workitem_id_y() #1 {
395; AKF_HSA-LABEL: define {{[^@]+}}@recursive_use_workitem_id_y
396; AKF_HSA-SAME: () #[[ATTR2]] {
397; AKF_HSA-NEXT:    [[VAL:%.*]] = call i32 @llvm.amdgcn.workitem.id.y()
398; AKF_HSA-NEXT:    store volatile i32 [[VAL]], i32 addrspace(1)* undef, align 4
399; AKF_HSA-NEXT:    call void @recursive_use_workitem_id_y()
400; AKF_HSA-NEXT:    ret void
401;
402; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@recursive_use_workitem_id_y
403; ATTRIBUTOR_HSA-SAME: () #[[ATTR3:[0-9]+]] {
404; ATTRIBUTOR_HSA-NEXT:    call void @recursive_use_workitem_id_y() #[[ATTR11:[0-9]+]]
405; ATTRIBUTOR_HSA-NEXT:    unreachable
406;
407  %val = call i32 @llvm.amdgcn.workitem.id.y()
408  store volatile i32 %val, i32 addrspace(1)* undef
409  call void @recursive_use_workitem_id_y()
410  ret void
411}
412
413define void @call_recursive_use_workitem_id_y() #1 {
414; AKF_HSA-LABEL: define {{[^@]+}}@call_recursive_use_workitem_id_y
415; AKF_HSA-SAME: () #[[ATTR2]] {
416; AKF_HSA-NEXT:    call void @recursive_use_workitem_id_y()
417; AKF_HSA-NEXT:    ret void
418;
419; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@call_recursive_use_workitem_id_y
420; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
421; ATTRIBUTOR_HSA-NEXT:    call void @recursive_use_workitem_id_y() #[[ATTR11]]
422; ATTRIBUTOR_HSA-NEXT:    unreachable
423;
424  call void @recursive_use_workitem_id_y()
425  ret void
426}
427
428define void @use_group_to_flat_addrspacecast(i32 addrspace(3)* %ptr) #1 {
429; AKF_HSA-LABEL: define {{[^@]+}}@use_group_to_flat_addrspacecast
430; AKF_HSA-SAME: (i32 addrspace(3)* [[PTR:%.*]]) #[[ATTR8]] {
431; AKF_HSA-NEXT:    [[STOF:%.*]] = addrspacecast i32 addrspace(3)* [[PTR]] to i32 addrspace(4)*
432; AKF_HSA-NEXT:    store volatile i32 0, i32 addrspace(4)* [[STOF]], align 4
433; AKF_HSA-NEXT:    ret void
434;
435; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_group_to_flat_addrspacecast
436; ATTRIBUTOR_HSA-SAME: (i32 addrspace(3)* [[PTR:%.*]]) #[[ATTR4:[0-9]+]] {
437; ATTRIBUTOR_HSA-NEXT:    [[STOF:%.*]] = addrspacecast i32 addrspace(3)* [[PTR]] to i32 addrspace(4)*
438; ATTRIBUTOR_HSA-NEXT:    store volatile i32 0, i32 addrspace(4)* [[STOF]], align 4
439; ATTRIBUTOR_HSA-NEXT:    ret void
440;
441  %stof = addrspacecast i32 addrspace(3)* %ptr to i32 addrspace(4)*
442  store volatile i32 0, i32 addrspace(4)* %stof
443  ret void
444}
445
446
447define void @use_group_to_flat_addrspacecast_gfx9(i32 addrspace(3)* %ptr) #2 {
448; AKF_HSA-LABEL: define {{[^@]+}}@use_group_to_flat_addrspacecast_gfx9
449; AKF_HSA-SAME: (i32 addrspace(3)* [[PTR:%.*]]) #[[ATTR12:[0-9]+]] {
450; AKF_HSA-NEXT:    [[STOF:%.*]] = addrspacecast i32 addrspace(3)* [[PTR]] to i32 addrspace(4)*
451; AKF_HSA-NEXT:    store volatile i32 0, i32 addrspace(4)* [[STOF]], align 4
452; AKF_HSA-NEXT:    ret void
453;
454; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_group_to_flat_addrspacecast_gfx9
455; ATTRIBUTOR_HSA-SAME: (i32 addrspace(3)* [[PTR:%.*]]) #[[ATTR5:[0-9]+]] {
456; ATTRIBUTOR_HSA-NEXT:    [[STOF:%.*]] = addrspacecast i32 addrspace(3)* [[PTR]] to i32 addrspace(4)*
457; ATTRIBUTOR_HSA-NEXT:    store volatile i32 0, i32 addrspace(4)* [[STOF]], align 4
458; ATTRIBUTOR_HSA-NEXT:    ret void
459;
460  %stof = addrspacecast i32 addrspace(3)* %ptr to i32 addrspace(4)*
461  store volatile i32 0, i32 addrspace(4)* %stof
462  ret void
463}
464
465define void @use_group_to_flat_addrspacecast_queue_ptr_gfx9(i32 addrspace(3)* %ptr) #2 {
466; AKF_HSA-LABEL: define {{[^@]+}}@use_group_to_flat_addrspacecast_queue_ptr_gfx9
467; AKF_HSA-SAME: (i32 addrspace(3)* [[PTR:%.*]]) #[[ATTR13:[0-9]+]] {
468; AKF_HSA-NEXT:    [[STOF:%.*]] = addrspacecast i32 addrspace(3)* [[PTR]] to i32 addrspace(4)*
469; AKF_HSA-NEXT:    store volatile i32 0, i32 addrspace(4)* [[STOF]], align 4
470; AKF_HSA-NEXT:    call void @func_indirect_use_queue_ptr()
471; AKF_HSA-NEXT:    ret void
472;
473; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_group_to_flat_addrspacecast_queue_ptr_gfx9
474; ATTRIBUTOR_HSA-SAME: (i32 addrspace(3)* [[PTR:%.*]]) #[[ATTR5]] {
475; ATTRIBUTOR_HSA-NEXT:    [[STOF:%.*]] = addrspacecast i32 addrspace(3)* [[PTR]] to i32 addrspace(4)*
476; ATTRIBUTOR_HSA-NEXT:    store volatile i32 0, i32 addrspace(4)* [[STOF]], align 4
477; ATTRIBUTOR_HSA-NEXT:    call void @func_indirect_use_queue_ptr() #[[ATTR10]]
478; ATTRIBUTOR_HSA-NEXT:    ret void
479;
480  %stof = addrspacecast i32 addrspace(3)* %ptr to i32 addrspace(4)*
481  store volatile i32 0, i32 addrspace(4)* %stof
482  call void @func_indirect_use_queue_ptr()
483  ret void
484}
485
486define void @indirect_use_group_to_flat_addrspacecast() #1 {
487; AKF_HSA-LABEL: define {{[^@]+}}@indirect_use_group_to_flat_addrspacecast
488; AKF_HSA-SAME: () #[[ATTR8]] {
489; AKF_HSA-NEXT:    call void @use_group_to_flat_addrspacecast(i32 addrspace(3)* null)
490; AKF_HSA-NEXT:    ret void
491;
492; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@indirect_use_group_to_flat_addrspacecast
493; ATTRIBUTOR_HSA-SAME: () #[[ATTR4]] {
494; ATTRIBUTOR_HSA-NEXT:    call void @use_group_to_flat_addrspacecast(i32 addrspace(3)* null) #[[ATTR10]]
495; ATTRIBUTOR_HSA-NEXT:    ret void
496;
497  call void @use_group_to_flat_addrspacecast(i32 addrspace(3)* null)
498  ret void
499}
500
501define void @indirect_use_group_to_flat_addrspacecast_gfx9() #1 {
502; AKF_HSA-LABEL: define {{[^@]+}}@indirect_use_group_to_flat_addrspacecast_gfx9
503; AKF_HSA-SAME: () #[[ATTR11]] {
504; AKF_HSA-NEXT:    call void @use_group_to_flat_addrspacecast_gfx9(i32 addrspace(3)* null)
505; AKF_HSA-NEXT:    ret void
506;
507; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@indirect_use_group_to_flat_addrspacecast_gfx9
508; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
509; ATTRIBUTOR_HSA-NEXT:    call void @use_group_to_flat_addrspacecast_gfx9(i32 addrspace(3)* null) #[[ATTR10]]
510; ATTRIBUTOR_HSA-NEXT:    ret void
511;
512  call void @use_group_to_flat_addrspacecast_gfx9(i32 addrspace(3)* null)
513  ret void
514}
515
516define void @indirect_use_group_to_flat_addrspacecast_queue_ptr_gfx9() #1 {
517; AKF_HSA-LABEL: define {{[^@]+}}@indirect_use_group_to_flat_addrspacecast_queue_ptr_gfx9
518; AKF_HSA-SAME: () #[[ATTR8]] {
519; AKF_HSA-NEXT:    call void @use_group_to_flat_addrspacecast_queue_ptr_gfx9(i32 addrspace(3)* null)
520; AKF_HSA-NEXT:    ret void
521;
522; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@indirect_use_group_to_flat_addrspacecast_queue_ptr_gfx9
523; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
524; ATTRIBUTOR_HSA-NEXT:    call void @use_group_to_flat_addrspacecast_queue_ptr_gfx9(i32 addrspace(3)* null) #[[ATTR10]]
525; ATTRIBUTOR_HSA-NEXT:    ret void
526;
527  call void @use_group_to_flat_addrspacecast_queue_ptr_gfx9(i32 addrspace(3)* null)
528  ret void
529}
530
531define void @use_kernarg_segment_ptr() #1 {
532; AKF_HSA-LABEL: define {{[^@]+}}@use_kernarg_segment_ptr
533; AKF_HSA-SAME: () #[[ATTR14:[0-9]+]] {
534; AKF_HSA-NEXT:    [[KERNARG_SEGMENT_PTR:%.*]] = call i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr()
535; AKF_HSA-NEXT:    store volatile i8 addrspace(4)* [[KERNARG_SEGMENT_PTR]], i8 addrspace(4)* addrspace(1)* undef, align 8
536; AKF_HSA-NEXT:    ret void
537;
538; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_kernarg_segment_ptr
539; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
540; ATTRIBUTOR_HSA-NEXT:    ret void
541;
542  %kernarg.segment.ptr = call i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr()
543  store volatile i8 addrspace(4)* %kernarg.segment.ptr, i8 addrspace(4)* addrspace(1)* undef
544  ret void
545}
546define void @func_indirect_use_kernarg_segment_ptr() #1 {
547; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_kernarg_segment_ptr
548; AKF_HSA-SAME: () #[[ATTR11]] {
549; AKF_HSA-NEXT:    call void @use_kernarg_segment_ptr()
550; AKF_HSA-NEXT:    ret void
551;
552; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_kernarg_segment_ptr
553; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
554; ATTRIBUTOR_HSA-NEXT:    call void @use_kernarg_segment_ptr() #[[ATTR10]]
555; ATTRIBUTOR_HSA-NEXT:    ret void
556;
557  call void @use_kernarg_segment_ptr()
558  ret void
559}
560
561define amdgpu_kernel void @kern_use_implicitarg_ptr() #1 {
562; AKF_HSA-LABEL: define {{[^@]+}}@kern_use_implicitarg_ptr
563; AKF_HSA-SAME: () #[[ATTR15:[0-9]+]] {
564; AKF_HSA-NEXT:    [[IMPLICITARG_PTR:%.*]] = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
565; AKF_HSA-NEXT:    store volatile i8 addrspace(4)* [[IMPLICITARG_PTR]], i8 addrspace(4)* addrspace(1)* undef, align 8
566; AKF_HSA-NEXT:    ret void
567;
568; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@kern_use_implicitarg_ptr
569; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
570; ATTRIBUTOR_HSA-NEXT:    ret void
571;
572  %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
573  store volatile i8 addrspace(4)* %implicitarg.ptr, i8 addrspace(4)* addrspace(1)* undef
574  ret void
575}
576
577define void @use_implicitarg_ptr() #1 {
578; AKF_HSA-LABEL: define {{[^@]+}}@use_implicitarg_ptr
579; AKF_HSA-SAME: () #[[ATTR16:[0-9]+]] {
580; AKF_HSA-NEXT:    [[IMPLICITARG_PTR:%.*]] = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
581; AKF_HSA-NEXT:    store volatile i8 addrspace(4)* [[IMPLICITARG_PTR]], i8 addrspace(4)* addrspace(1)* undef, align 8
582; AKF_HSA-NEXT:    ret void
583;
584; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_implicitarg_ptr
585; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
586; ATTRIBUTOR_HSA-NEXT:    ret void
587;
588  %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
589  store volatile i8 addrspace(4)* %implicitarg.ptr, i8 addrspace(4)* addrspace(1)* undef
590  ret void
591}
592
593define void @func_indirect_use_implicitarg_ptr() #1 {
594; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_implicitarg_ptr
595; AKF_HSA-SAME: () #[[ATTR16]] {
596; AKF_HSA-NEXT:    call void @use_implicitarg_ptr()
597; AKF_HSA-NEXT:    ret void
598;
599; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_implicitarg_ptr
600; ATTRIBUTOR_HSA-SAME: () #[[ATTR1]] {
601; ATTRIBUTOR_HSA-NEXT:    call void @use_implicitarg_ptr() #[[ATTR10]]
602; ATTRIBUTOR_HSA-NEXT:    ret void
603;
604  call void @use_implicitarg_ptr()
605  ret void
606}
607
608declare void @external.func() #3
609
610; This function gets deleted.
611define internal void @defined.func() #3 {
612; AKF_HSA-LABEL: define {{[^@]+}}@defined.func
613; AKF_HSA-SAME: () #[[ATTR17:[0-9]+]] {
614; AKF_HSA-NEXT:    ret void
615;
616  ret void
617}
618
619define void @func_call_external() #3 {
620; AKF_HSA-LABEL: define {{[^@]+}}@func_call_external
621; AKF_HSA-SAME: () #[[ATTR17]] {
622; AKF_HSA-NEXT:    call void @external.func()
623; AKF_HSA-NEXT:    ret void
624;
625; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_call_external
626; ATTRIBUTOR_HSA-SAME: () #[[ATTR6:[0-9]+]] {
627; ATTRIBUTOR_HSA-NEXT:    call void @external.func() #[[ATTR10]]
628; ATTRIBUTOR_HSA-NEXT:    ret void
629;
630  call void @external.func()
631  ret void
632}
633
634define void @func_call_defined() #3 {
635; AKF_HSA-LABEL: define {{[^@]+}}@func_call_defined
636; AKF_HSA-SAME: () #[[ATTR17]] {
637; AKF_HSA-NEXT:    call void @defined.func()
638; AKF_HSA-NEXT:    ret void
639;
640; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_call_defined
641; ATTRIBUTOR_HSA-SAME: () #[[ATTR7:[0-9]+]] {
642; ATTRIBUTOR_HSA-NEXT:    ret void
643;
644  call void @defined.func()
645  ret void
646}
647define void @func_call_asm() #3 {
648; AKF_HSA-LABEL: define {{[^@]+}}@func_call_asm
649; AKF_HSA-SAME: () #[[ATTR18:[0-9]+]] {
650; AKF_HSA-NEXT:    call void asm sideeffect "", ""() #[[ATTR18]]
651; AKF_HSA-NEXT:    ret void
652;
653; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_call_asm
654; ATTRIBUTOR_HSA-SAME: () #[[ATTR7]] {
655; ATTRIBUTOR_HSA-NEXT:    call void asm sideeffect "", ""() #[[ATTR10]]
656; ATTRIBUTOR_HSA-NEXT:    ret void
657;
658  call void asm sideeffect "", ""() #3
659  ret void
660}
661
662define amdgpu_kernel void @kern_call_external() #3 {
663; AKF_HSA-LABEL: define {{[^@]+}}@kern_call_external
664; AKF_HSA-SAME: () #[[ATTR19:[0-9]+]] {
665; AKF_HSA-NEXT:    call void @external.func()
666; AKF_HSA-NEXT:    ret void
667;
668; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@kern_call_external
669; ATTRIBUTOR_HSA-SAME: () #[[ATTR8:[0-9]+]] {
670; ATTRIBUTOR_HSA-NEXT:    call void @external.func() #[[ATTR10]]
671; ATTRIBUTOR_HSA-NEXT:    ret void
672;
673  call void @external.func()
674  ret void
675}
676
677define amdgpu_kernel void @func_kern_defined() #3 {
678; AKF_HSA-LABEL: define {{[^@]+}}@func_kern_defined
679; AKF_HSA-SAME: () #[[ATTR19]] {
680; AKF_HSA-NEXT:    call void @defined.func()
681; AKF_HSA-NEXT:    ret void
682;
683; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_kern_defined
684; ATTRIBUTOR_HSA-SAME: () #[[ATTR7]] {
685; ATTRIBUTOR_HSA-NEXT:    ret void
686;
687  call void @defined.func()
688  ret void
689}
690
691define i32 @use_dispatch_ptr_ret_type() #1 {
692; AKF_HSA-LABEL: define {{[^@]+}}@use_dispatch_ptr_ret_type
693; AKF_HSA-SAME: () #[[ATTR20:[0-9]+]] {
694; AKF_HSA-NEXT:    [[DISPATCH_PTR:%.*]] = call i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr()
695; AKF_HSA-NEXT:    store volatile i8 addrspace(4)* [[DISPATCH_PTR]], i8 addrspace(4)* addrspace(1)* undef, align 8
696; AKF_HSA-NEXT:    ret i32 0
697;
698; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@use_dispatch_ptr_ret_type
699; ATTRIBUTOR_HSA-SAME: () #[[ATTR9:[0-9]+]] {
700; ATTRIBUTOR_HSA-NEXT:    ret i32 0
701;
702  %dispatch.ptr = call i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr()
703  store volatile i8 addrspace(4)* %dispatch.ptr, i8 addrspace(4)* addrspace(1)* undef
704  ret i32 0
705}
706
707define float @func_indirect_use_dispatch_ptr_constexpr_cast_func() #1 {
708; AKF_HSA-LABEL: define {{[^@]+}}@func_indirect_use_dispatch_ptr_constexpr_cast_func
709; AKF_HSA-SAME: () #[[ATTR20]] {
710; AKF_HSA-NEXT:    [[F:%.*]] = call float bitcast (i32 ()* @use_dispatch_ptr_ret_type to float ()*)()
711; AKF_HSA-NEXT:    [[FADD:%.*]] = fadd float [[F]], 1.000000e+00
712; AKF_HSA-NEXT:    ret float [[FADD]]
713;
714; ATTRIBUTOR_HSA-LABEL: define {{[^@]+}}@func_indirect_use_dispatch_ptr_constexpr_cast_func
715; ATTRIBUTOR_HSA-SAME: () #[[ATTR9]] {
716; ATTRIBUTOR_HSA-NEXT:    [[F:%.*]] = call float bitcast (i32 ()* @use_dispatch_ptr_ret_type to float ()*)()
717; ATTRIBUTOR_HSA-NEXT:    [[FADD:%.*]] = fadd float [[F]], 1.000000e+00
718; ATTRIBUTOR_HSA-NEXT:    ret float [[FADD]]
719;
720  %f = call float bitcast (i32()* @use_dispatch_ptr_ret_type to float()*)()
721  %fadd = fadd float %f, 1.0
722  ret float %fadd
723}
724
725attributes #0 = { nounwind readnone speculatable }
726attributes #1 = { nounwind "target-cpu"="fiji" }
727attributes #2 = { nounwind "target-cpu"="gfx900" }
728attributes #3 = { nounwind }
729
730;.
731; AKF_HSA: attributes #[[ATTR0:[0-9]+]] = { nounwind readnone speculatable willreturn }
732; AKF_HSA: attributes #[[ATTR1]] = { nounwind "amdgpu-work-item-id-x" "target-cpu"="fiji" "uniform-work-group-size"="false" }
733; AKF_HSA: attributes #[[ATTR2]] = { nounwind "amdgpu-work-item-id-y" "target-cpu"="fiji" "uniform-work-group-size"="false" }
734; AKF_HSA: attributes #[[ATTR3]] = { nounwind "amdgpu-work-item-id-z" "target-cpu"="fiji" "uniform-work-group-size"="false" }
735; AKF_HSA: attributes #[[ATTR4]] = { nounwind "amdgpu-work-group-id-x" "target-cpu"="fiji" "uniform-work-group-size"="false" }
736; AKF_HSA: attributes #[[ATTR5]] = { nounwind "amdgpu-work-group-id-y" "target-cpu"="fiji" "uniform-work-group-size"="false" }
737; AKF_HSA: attributes #[[ATTR6]] = { nounwind "amdgpu-work-group-id-z" "target-cpu"="fiji" "uniform-work-group-size"="false" }
738; AKF_HSA: attributes #[[ATTR7]] = { nounwind "amdgpu-dispatch-ptr" "target-cpu"="fiji" "uniform-work-group-size"="false" }
739; AKF_HSA: attributes #[[ATTR8]] = { nounwind "amdgpu-queue-ptr" "target-cpu"="fiji" "uniform-work-group-size"="false" }
740; AKF_HSA: attributes #[[ATTR9]] = { nounwind "amdgpu-dispatch-id" "target-cpu"="fiji" "uniform-work-group-size"="false" }
741; AKF_HSA: attributes #[[ATTR10]] = { nounwind "amdgpu-work-group-id-y" "amdgpu-work-group-id-z" "target-cpu"="fiji" }
742; AKF_HSA: attributes #[[ATTR11]] = { nounwind "target-cpu"="fiji" "uniform-work-group-size"="false" }
743; AKF_HSA: attributes #[[ATTR12]] = { nounwind "target-cpu"="gfx900" "uniform-work-group-size"="false" }
744; AKF_HSA: attributes #[[ATTR13]] = { nounwind "amdgpu-queue-ptr" "target-cpu"="gfx900" "uniform-work-group-size"="false" }
745; AKF_HSA: attributes #[[ATTR14]] = { nounwind "amdgpu-kernarg-segment-ptr" "target-cpu"="fiji" "uniform-work-group-size"="false" }
746; AKF_HSA: attributes #[[ATTR15]] = { nounwind "amdgpu-implicitarg-ptr" "target-cpu"="fiji" }
747; AKF_HSA: attributes #[[ATTR16]] = { nounwind "amdgpu-implicitarg-ptr" "target-cpu"="fiji" "uniform-work-group-size"="false" }
748; AKF_HSA: attributes #[[ATTR17]] = { nounwind "uniform-work-group-size"="false" }
749; AKF_HSA: attributes #[[ATTR18]] = { nounwind }
750; AKF_HSA: attributes #[[ATTR19]] = { nounwind "amdgpu-calls" "uniform-work-group-size"="false" }
751; AKF_HSA: attributes #[[ATTR20]] = { nounwind "amdgpu-dispatch-id" "amdgpu-dispatch-ptr" "amdgpu-implicitarg-ptr" "amdgpu-queue-ptr" "amdgpu-work-group-id-x" "amdgpu-work-group-id-y" "amdgpu-work-group-id-z" "amdgpu-work-item-id-x" "amdgpu-work-item-id-y" "amdgpu-work-item-id-z" "target-cpu"="fiji" }
752;.
753; ATTRIBUTOR_HSA: attributes #[[ATTR0:[0-9]+]] = { nounwind readnone speculatable willreturn "uniform-work-group-size"="false" }
754; ATTRIBUTOR_HSA: attributes #[[ATTR1]] = { nounwind "target-cpu"="fiji" "uniform-work-group-size"="false" }
755; ATTRIBUTOR_HSA: attributes #[[ATTR2]] = { noreturn nounwind readnone "target-cpu"="fiji" "uniform-work-group-size"="false" }
756; ATTRIBUTOR_HSA: attributes #[[ATTR3]] = { noreturn nounwind "target-cpu"="fiji" "uniform-work-group-size"="false" }
757; ATTRIBUTOR_HSA: attributes #[[ATTR4]] = { nounwind "amdgpu-queue-ptr" "target-cpu"="fiji" "uniform-work-group-size"="false" }
758; ATTRIBUTOR_HSA: attributes #[[ATTR5]] = { nounwind "target-cpu"="gfx900" "uniform-work-group-size"="false" }
759; ATTRIBUTOR_HSA: attributes #[[ATTR6]] = { nounwind "amdgpu-dispatch-id" "amdgpu-dispatch-ptr" "amdgpu-implicitarg-ptr" "amdgpu-queue-ptr" "amdgpu-work-group-id-x" "amdgpu-work-group-id-y" "amdgpu-work-group-id-z" "amdgpu-work-item-id-x" "amdgpu-work-item-id-y" "amdgpu-work-item-id-z" "uniform-work-group-size"="false" }
760; ATTRIBUTOR_HSA: attributes #[[ATTR7]] = { nounwind "uniform-work-group-size"="false" }
761; ATTRIBUTOR_HSA: attributes #[[ATTR8]] = { nounwind "amdgpu-calls" "amdgpu-dispatch-id" "amdgpu-dispatch-ptr" "amdgpu-implicitarg-ptr" "amdgpu-queue-ptr" "amdgpu-work-group-id-x" "amdgpu-work-group-id-y" "amdgpu-work-group-id-z" "amdgpu-work-item-id-x" "amdgpu-work-item-id-y" "amdgpu-work-item-id-z" "uniform-work-group-size"="false" }
762; ATTRIBUTOR_HSA: attributes #[[ATTR9]] = { nounwind "amdgpu-dispatch-id" "amdgpu-dispatch-ptr" "amdgpu-implicitarg-ptr" "amdgpu-queue-ptr" "amdgpu-work-group-id-x" "amdgpu-work-group-id-y" "amdgpu-work-group-id-z" "amdgpu-work-item-id-x" "amdgpu-work-item-id-y" "amdgpu-work-item-id-z" "target-cpu"="fiji" "uniform-work-group-size"="false" }
763; ATTRIBUTOR_HSA: attributes #[[ATTR10]] = { nounwind }
764; ATTRIBUTOR_HSA: attributes #[[ATTR11]] = { noreturn nounwind }
765;.
766