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