121
|
1 ; RUN: opt -S -mtriple=amdgcn-unknown-amdhsa -amdgpu-annotate-kernel-features %s | FileCheck -check-prefix=HSA %s
|
|
2
|
|
3 declare i32 @llvm.amdgcn.workgroup.id.x() #0
|
|
4 declare i32 @llvm.amdgcn.workgroup.id.y() #0
|
|
5 declare i32 @llvm.amdgcn.workgroup.id.z() #0
|
|
6
|
|
7 declare i32 @llvm.amdgcn.workitem.id.x() #0
|
|
8 declare i32 @llvm.amdgcn.workitem.id.y() #0
|
|
9 declare i32 @llvm.amdgcn.workitem.id.z() #0
|
|
10
|
|
11 declare i8 addrspace(2)* @llvm.amdgcn.dispatch.ptr() #0
|
|
12 declare i8 addrspace(2)* @llvm.amdgcn.queue.ptr() #0
|
|
13 declare i8 addrspace(2)* @llvm.amdgcn.kernarg.segment.ptr() #0
|
|
14 declare i8 addrspace(2)* @llvm.amdgcn.implicitarg.ptr() #0
|
|
15 declare i64 @llvm.amdgcn.dispatch.id() #0
|
|
16
|
|
17 ; HSA: define void @use_workitem_id_x() #1 {
|
|
18 define void @use_workitem_id_x() #1 {
|
|
19 %val = call i32 @llvm.amdgcn.workitem.id.x()
|
|
20 store volatile i32 %val, i32 addrspace(1)* undef
|
|
21 ret void
|
|
22 }
|
|
23
|
|
24 ; HSA: define void @use_workitem_id_y() #2 {
|
|
25 define void @use_workitem_id_y() #1 {
|
|
26 %val = call i32 @llvm.amdgcn.workitem.id.y()
|
|
27 store volatile i32 %val, i32 addrspace(1)* undef
|
|
28 ret void
|
|
29 }
|
|
30
|
|
31 ; HSA: define void @use_workitem_id_z() #3 {
|
|
32 define void @use_workitem_id_z() #1 {
|
|
33 %val = call i32 @llvm.amdgcn.workitem.id.z()
|
|
34 store volatile i32 %val, i32 addrspace(1)* undef
|
|
35 ret void
|
|
36 }
|
|
37
|
|
38 ; HSA: define void @use_workgroup_id_x() #4 {
|
|
39 define void @use_workgroup_id_x() #1 {
|
|
40 %val = call i32 @llvm.amdgcn.workgroup.id.x()
|
|
41 store volatile i32 %val, i32 addrspace(1)* undef
|
|
42 ret void
|
|
43 }
|
|
44
|
|
45 ; HSA: define void @use_workgroup_id_y() #5 {
|
|
46 define void @use_workgroup_id_y() #1 {
|
|
47 %val = call i32 @llvm.amdgcn.workgroup.id.y()
|
|
48 store volatile i32 %val, i32 addrspace(1)* undef
|
|
49 ret void
|
|
50 }
|
|
51
|
|
52 ; HSA: define void @use_workgroup_id_z() #6 {
|
|
53 define void @use_workgroup_id_z() #1 {
|
|
54 %val = call i32 @llvm.amdgcn.workgroup.id.z()
|
|
55 store volatile i32 %val, i32 addrspace(1)* undef
|
|
56 ret void
|
|
57 }
|
|
58
|
|
59 ; HSA: define void @use_dispatch_ptr() #7 {
|
|
60 define void @use_dispatch_ptr() #1 {
|
|
61 %dispatch.ptr = call i8 addrspace(2)* @llvm.amdgcn.dispatch.ptr()
|
|
62 store volatile i8 addrspace(2)* %dispatch.ptr, i8 addrspace(2)* addrspace(1)* undef
|
|
63 ret void
|
|
64 }
|
|
65
|
|
66 ; HSA: define void @use_queue_ptr() #8 {
|
|
67 define void @use_queue_ptr() #1 {
|
|
68 %queue.ptr = call i8 addrspace(2)* @llvm.amdgcn.queue.ptr()
|
|
69 store volatile i8 addrspace(2)* %queue.ptr, i8 addrspace(2)* addrspace(1)* undef
|
|
70 ret void
|
|
71 }
|
|
72
|
|
73 ; HSA: define void @use_dispatch_id() #9 {
|
|
74 define void @use_dispatch_id() #1 {
|
|
75 %val = call i64 @llvm.amdgcn.dispatch.id()
|
|
76 store volatile i64 %val, i64 addrspace(1)* undef
|
|
77 ret void
|
|
78 }
|
|
79
|
|
80 ; HSA: define void @use_workgroup_id_y_workgroup_id_z() #10 {
|
|
81 define void @use_workgroup_id_y_workgroup_id_z() #1 {
|
|
82 %val0 = call i32 @llvm.amdgcn.workgroup.id.y()
|
|
83 %val1 = call i32 @llvm.amdgcn.workgroup.id.z()
|
|
84 store volatile i32 %val0, i32 addrspace(1)* undef
|
|
85 store volatile i32 %val1, i32 addrspace(1)* undef
|
|
86 ret void
|
|
87 }
|
|
88
|
|
89 ; HSA: define void @func_indirect_use_workitem_id_x() #1 {
|
|
90 define void @func_indirect_use_workitem_id_x() #1 {
|
|
91 call void @use_workitem_id_x()
|
|
92 ret void
|
|
93 }
|
|
94
|
|
95 ; HSA: define void @kernel_indirect_use_workitem_id_x() #1 {
|
|
96 define void @kernel_indirect_use_workitem_id_x() #1 {
|
|
97 call void @use_workitem_id_x()
|
|
98 ret void
|
|
99 }
|
|
100
|
|
101 ; HSA: define void @func_indirect_use_workitem_id_y() #2 {
|
|
102 define void @func_indirect_use_workitem_id_y() #1 {
|
|
103 call void @use_workitem_id_y()
|
|
104 ret void
|
|
105 }
|
|
106
|
|
107 ; HSA: define void @func_indirect_use_workitem_id_z() #3 {
|
|
108 define void @func_indirect_use_workitem_id_z() #1 {
|
|
109 call void @use_workitem_id_z()
|
|
110 ret void
|
|
111 }
|
|
112
|
|
113 ; HSA: define void @func_indirect_use_workgroup_id_x() #4 {
|
|
114 define void @func_indirect_use_workgroup_id_x() #1 {
|
|
115 call void @use_workgroup_id_x()
|
|
116 ret void
|
|
117 }
|
|
118
|
|
119 ; HSA: define void @kernel_indirect_use_workgroup_id_x() #4 {
|
|
120 define void @kernel_indirect_use_workgroup_id_x() #1 {
|
|
121 call void @use_workgroup_id_x()
|
|
122 ret void
|
|
123 }
|
|
124
|
|
125 ; HSA: define void @func_indirect_use_workgroup_id_y() #5 {
|
|
126 define void @func_indirect_use_workgroup_id_y() #1 {
|
|
127 call void @use_workgroup_id_y()
|
|
128 ret void
|
|
129 }
|
|
130
|
|
131 ; HSA: define void @func_indirect_use_workgroup_id_z() #6 {
|
|
132 define void @func_indirect_use_workgroup_id_z() #1 {
|
|
133 call void @use_workgroup_id_z()
|
|
134 ret void
|
|
135 }
|
|
136
|
|
137 ; HSA: define void @func_indirect_indirect_use_workgroup_id_y() #5 {
|
|
138 define void @func_indirect_indirect_use_workgroup_id_y() #1 {
|
|
139 call void @func_indirect_use_workgroup_id_y()
|
|
140 ret void
|
|
141 }
|
|
142
|
|
143 ; HSA: define void @indirect_x2_use_workgroup_id_y() #5 {
|
|
144 define void @indirect_x2_use_workgroup_id_y() #1 {
|
|
145 call void @func_indirect_indirect_use_workgroup_id_y()
|
|
146 ret void
|
|
147 }
|
|
148
|
|
149 ; HSA: define void @func_indirect_use_dispatch_ptr() #7 {
|
|
150 define void @func_indirect_use_dispatch_ptr() #1 {
|
|
151 call void @use_dispatch_ptr()
|
|
152 ret void
|
|
153 }
|
|
154
|
|
155 ; HSA: define void @func_indirect_use_queue_ptr() #8 {
|
|
156 define void @func_indirect_use_queue_ptr() #1 {
|
|
157 call void @use_queue_ptr()
|
|
158 ret void
|
|
159 }
|
|
160
|
|
161 ; HSA: define void @func_indirect_use_dispatch_id() #9 {
|
|
162 define void @func_indirect_use_dispatch_id() #1 {
|
|
163 call void @use_dispatch_id()
|
|
164 ret void
|
|
165 }
|
|
166
|
|
167 ; HSA: define void @func_indirect_use_workgroup_id_y_workgroup_id_z() #11 {
|
|
168 define void @func_indirect_use_workgroup_id_y_workgroup_id_z() #1 {
|
|
169 call void @func_indirect_use_workgroup_id_y_workgroup_id_z()
|
|
170 ret void
|
|
171 }
|
|
172
|
|
173 ; HSA: define void @recursive_use_workitem_id_y() #2 {
|
|
174 define void @recursive_use_workitem_id_y() #1 {
|
|
175 %val = call i32 @llvm.amdgcn.workitem.id.y()
|
|
176 store volatile i32 %val, i32 addrspace(1)* undef
|
|
177 call void @recursive_use_workitem_id_y()
|
|
178 ret void
|
|
179 }
|
|
180
|
|
181 ; HSA: define void @call_recursive_use_workitem_id_y() #2 {
|
|
182 define void @call_recursive_use_workitem_id_y() #1 {
|
|
183 call void @recursive_use_workitem_id_y()
|
|
184 ret void
|
|
185 }
|
|
186
|
|
187 ; HSA: define void @use_group_to_flat_addrspacecast(i32 addrspace(3)* %ptr) #8 {
|
|
188 define void @use_group_to_flat_addrspacecast(i32 addrspace(3)* %ptr) #1 {
|
|
189 %stof = addrspacecast i32 addrspace(3)* %ptr to i32 addrspace(4)*
|
|
190 store volatile i32 0, i32 addrspace(4)* %stof
|
|
191 ret void
|
|
192 }
|
|
193
|
|
194 ; HSA: define void @use_group_to_flat_addrspacecast_gfx9(i32 addrspace(3)* %ptr) #12 {
|
|
195 define void @use_group_to_flat_addrspacecast_gfx9(i32 addrspace(3)* %ptr) #2 {
|
|
196 %stof = addrspacecast i32 addrspace(3)* %ptr to i32 addrspace(4)*
|
|
197 store volatile i32 0, i32 addrspace(4)* %stof
|
|
198 ret void
|
|
199 }
|
|
200
|
|
201 ; HSA: define void @use_group_to_flat_addrspacecast_queue_ptr_gfx9(i32 addrspace(3)* %ptr) #13 {
|
|
202 define void @use_group_to_flat_addrspacecast_queue_ptr_gfx9(i32 addrspace(3)* %ptr) #2 {
|
|
203 %stof = addrspacecast i32 addrspace(3)* %ptr to i32 addrspace(4)*
|
|
204 store volatile i32 0, i32 addrspace(4)* %stof
|
|
205 call void @func_indirect_use_queue_ptr()
|
|
206 ret void
|
|
207 }
|
|
208
|
|
209 ; HSA: define void @indirect_use_group_to_flat_addrspacecast() #8 {
|
|
210 define void @indirect_use_group_to_flat_addrspacecast() #1 {
|
|
211 call void @use_group_to_flat_addrspacecast(i32 addrspace(3)* null)
|
|
212 ret void
|
|
213 }
|
|
214
|
|
215 ; HSA: define void @indirect_use_group_to_flat_addrspacecast_gfx9() #11 {
|
|
216 define void @indirect_use_group_to_flat_addrspacecast_gfx9() #1 {
|
|
217 call void @use_group_to_flat_addrspacecast_gfx9(i32 addrspace(3)* null)
|
|
218 ret void
|
|
219 }
|
|
220
|
|
221 ; HSA: define void @indirect_use_group_to_flat_addrspacecast_queue_ptr_gfx9() #8 {
|
|
222 define void @indirect_use_group_to_flat_addrspacecast_queue_ptr_gfx9() #1 {
|
|
223 call void @use_group_to_flat_addrspacecast_queue_ptr_gfx9(i32 addrspace(3)* null)
|
|
224 ret void
|
|
225 }
|
|
226
|
|
227 ; HSA: define void @use_kernarg_segment_ptr() #14 {
|
|
228 define void @use_kernarg_segment_ptr() #1 {
|
|
229 %kernarg.segment.ptr = call i8 addrspace(2)* @llvm.amdgcn.kernarg.segment.ptr()
|
|
230 store volatile i8 addrspace(2)* %kernarg.segment.ptr, i8 addrspace(2)* addrspace(1)* undef
|
|
231 ret void
|
|
232 }
|
|
233
|
|
234 ; HSA: define void @func_indirect_use_kernarg_segment_ptr() #14 {
|
|
235 define void @func_indirect_use_kernarg_segment_ptr() #1 {
|
|
236 call void @use_kernarg_segment_ptr()
|
|
237 ret void
|
|
238 }
|
|
239
|
|
240 ; HSA: define amdgpu_kernel void @kern_use_implicitarg_ptr() #15 {
|
|
241 define amdgpu_kernel void @kern_use_implicitarg_ptr() #1 {
|
|
242 %implicitarg.ptr = call i8 addrspace(2)* @llvm.amdgcn.implicitarg.ptr()
|
|
243 store volatile i8 addrspace(2)* %implicitarg.ptr, i8 addrspace(2)* addrspace(1)* undef
|
|
244 ret void
|
|
245 }
|
|
246
|
|
247 ; HSA: define void @use_implicitarg_ptr() #15 {
|
|
248 define void @use_implicitarg_ptr() #1 {
|
|
249 %implicitarg.ptr = call i8 addrspace(2)* @llvm.amdgcn.implicitarg.ptr()
|
|
250 store volatile i8 addrspace(2)* %implicitarg.ptr, i8 addrspace(2)* addrspace(1)* undef
|
|
251 ret void
|
|
252 }
|
|
253
|
|
254 ; HSA: define void @func_indirect_use_implicitarg_ptr() #15 {
|
|
255 define void @func_indirect_use_implicitarg_ptr() #1 {
|
|
256 call void @use_implicitarg_ptr()
|
|
257 ret void
|
|
258 }
|
|
259
|
|
260 ; HSA: declare void @external.func() #16
|
|
261 declare void @external.func() #3
|
|
262
|
|
263 ; HSA: define internal void @defined.func() #16 {
|
|
264 define internal void @defined.func() #3 {
|
|
265 ret void
|
|
266 }
|
|
267
|
|
268 ; HSA: define void @func_call_external() #16 {
|
|
269 define void @func_call_external() #3 {
|
|
270 call void @external.func()
|
|
271 ret void
|
|
272 }
|
|
273
|
|
274 ; HSA: define void @func_call_defined() #16 {
|
|
275 define void @func_call_defined() #3 {
|
|
276 call void @defined.func()
|
|
277 ret void
|
|
278 }
|
|
279
|
|
280 ; HSA: define void @func_call_asm() #16 {
|
|
281 define void @func_call_asm() #3 {
|
|
282 call void asm sideeffect "", ""() #3
|
|
283 ret void
|
|
284 }
|
|
285
|
|
286 ; HSA: define amdgpu_kernel void @kern_call_external() #17 {
|
|
287 define amdgpu_kernel void @kern_call_external() #3 {
|
|
288 call void @external.func()
|
|
289 ret void
|
|
290 }
|
|
291
|
|
292 ; HSA: define amdgpu_kernel void @func_kern_defined() #17 {
|
|
293 define amdgpu_kernel void @func_kern_defined() #3 {
|
|
294 call void @defined.func()
|
|
295 ret void
|
|
296 }
|
|
297
|
|
298 attributes #0 = { nounwind readnone speculatable }
|
|
299 attributes #1 = { nounwind "target-cpu"="fiji" }
|
|
300 attributes #2 = { nounwind "target-cpu"="gfx900" }
|
|
301 attributes #3 = { nounwind }
|
|
302
|
|
303 ; HSA: attributes #0 = { nounwind readnone speculatable }
|
|
304 ; HSA: attributes #1 = { nounwind "amdgpu-work-item-id-x" "target-cpu"="fiji" }
|
|
305 ; HSA: attributes #2 = { nounwind "amdgpu-work-item-id-y" "target-cpu"="fiji" }
|
|
306 ; HSA: attributes #3 = { nounwind "amdgpu-work-item-id-z" "target-cpu"="fiji" }
|
|
307 ; HSA: attributes #4 = { nounwind "amdgpu-work-group-id-x" "target-cpu"="fiji" }
|
|
308 ; HSA: attributes #5 = { nounwind "amdgpu-work-group-id-y" "target-cpu"="fiji" }
|
|
309 ; HSA: attributes #6 = { nounwind "amdgpu-work-group-id-z" "target-cpu"="fiji" }
|
|
310 ; HSA: attributes #7 = { nounwind "amdgpu-dispatch-ptr" "target-cpu"="fiji" }
|
|
311 ; HSA: attributes #8 = { nounwind "amdgpu-queue-ptr" "target-cpu"="fiji" }
|
|
312 ; HSA: attributes #9 = { nounwind "amdgpu-dispatch-id" "target-cpu"="fiji" }
|
|
313 ; HSA: attributes #10 = { nounwind "amdgpu-work-group-id-y" "amdgpu-work-group-id-z" "target-cpu"="fiji" }
|
|
314 ; HSA: attributes #11 = { nounwind "target-cpu"="fiji" }
|
|
315 ; HSA: attributes #12 = { nounwind "target-cpu"="gfx900" }
|
|
316 ; HSA: attributes #13 = { nounwind "amdgpu-queue-ptr" "target-cpu"="gfx900" }
|
|
317 ; HSA: attributes #14 = { nounwind "amdgpu-kernarg-segment-ptr" "target-cpu"="fiji" }
|
|
318 ; HSA: attributes #15 = { nounwind "amdgpu-implicitarg-ptr" "target-cpu"="fiji" }
|
|
319 ; HSA: attributes #16 = { nounwind }
|
|
320 ; HSA: attributes #17 = { nounwind "amdgpu-flat-scratch" }
|