[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AMDGPU / annotate-kernel-features-hsa-call.ll
blobca6739f5d37e24c6896cdf7256cf8cfc14cce829
1 ; RUN: opt -S -mtriple=amdgcn-unknown-amdhsa -amdgpu-annotate-kernel-features %s | FileCheck -check-prefix=HSA %s
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
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
11 declare i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr() #0
12 declare i8 addrspace(4)* @llvm.amdgcn.queue.ptr() #0
13 declare i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr() #0
14 declare i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr() #0
15 declare i64 @llvm.amdgcn.dispatch.id() #0
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
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
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
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
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
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
59 ; HSA: define void @use_dispatch_ptr() #7 {
60 define void @use_dispatch_ptr() #1 {
61   %dispatch.ptr = call i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr()
62   store volatile i8 addrspace(4)* %dispatch.ptr, i8 addrspace(4)* addrspace(1)* undef
63   ret void
66 ; HSA: define void @use_queue_ptr() #8 {
67 define void @use_queue_ptr() #1 {
68   %queue.ptr = call i8 addrspace(4)* @llvm.amdgcn.queue.ptr()
69   store volatile i8 addrspace(4)* %queue.ptr, i8 addrspace(4)* addrspace(1)* undef
70   ret void
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
227 ; HSA: define void @use_kernarg_segment_ptr() #14 {
228 define void @use_kernarg_segment_ptr() #1 {
229   %kernarg.segment.ptr = call i8 addrspace(4)* @llvm.amdgcn.kernarg.segment.ptr()
230   store volatile i8 addrspace(4)* %kernarg.segment.ptr, i8 addrspace(4)* addrspace(1)* undef
231   ret void
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
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(4)* @llvm.amdgcn.implicitarg.ptr()
243   store volatile i8 addrspace(4)* %implicitarg.ptr, i8 addrspace(4)* addrspace(1)* undef
244   ret void
247 ; HSA: define void @use_implicitarg_ptr() #16 {
248 define void @use_implicitarg_ptr() #1 {
249   %implicitarg.ptr = call i8 addrspace(4)* @llvm.amdgcn.implicitarg.ptr()
250   store volatile i8 addrspace(4)* %implicitarg.ptr, i8 addrspace(4)* addrspace(1)* undef
251   ret void
254 ; HSA: define void @func_indirect_use_implicitarg_ptr() #16 {
255 define void @func_indirect_use_implicitarg_ptr() #1 {
256   call void @use_implicitarg_ptr()
257   ret void
260 ; HSA: declare void @external.func() #17
261 declare void @external.func() #3
263 ; HSA: define internal void @defined.func() #17 {
264 define internal void @defined.func() #3 {
265   ret void
268 ; HSA: define void @func_call_external() #17 {
269 define void @func_call_external() #3 {
270   call void @external.func()
271   ret void
274 ; HSA: define void @func_call_defined() #17 {
275 define void @func_call_defined() #3 {
276   call void @defined.func()
277   ret void
280 ; HSA: define void @func_call_asm() #18 {
281 define void @func_call_asm() #3 {
282   call void asm sideeffect "", ""() #3
283   ret void
286 ; HSA: define amdgpu_kernel void @kern_call_external() #19 {
287 define amdgpu_kernel void @kern_call_external() #3 {
288   call void @external.func()
289   ret void
292 ; HSA: define amdgpu_kernel void @func_kern_defined() #19 {
293 define amdgpu_kernel void @func_kern_defined() #3 {
294   call void @defined.func()
295   ret void
298 attributes #0 = { nounwind readnone speculatable }
299 attributes #1 = { nounwind "target-cpu"="fiji" }
300 attributes #2 = { nounwind "target-cpu"="gfx900" }
301 attributes #3 = { nounwind }
303 ; HSA: attributes #0 = { nounwind readnone speculatable }
304 ; HSA: attributes #1 = { nounwind "amdgpu-work-item-id-x" "target-cpu"="fiji" "uniform-work-group-size"="false" }
305 ; HSA: attributes #2 = { nounwind "amdgpu-work-item-id-y" "target-cpu"="fiji" "uniform-work-group-size"="false" }
306 ; HSA: attributes #3 = { nounwind "amdgpu-work-item-id-z" "target-cpu"="fiji" "uniform-work-group-size"="false" }
307 ; HSA: attributes #4 = { nounwind "amdgpu-work-group-id-x" "target-cpu"="fiji" "uniform-work-group-size"="false" }
308 ; HSA: attributes #5 = { nounwind "amdgpu-work-group-id-y" "target-cpu"="fiji" "uniform-work-group-size"="false" }
309 ; HSA: attributes #6 = { nounwind "amdgpu-work-group-id-z" "target-cpu"="fiji" "uniform-work-group-size"="false" }
310 ; HSA: attributes #7 = { nounwind "amdgpu-dispatch-ptr" "target-cpu"="fiji" "uniform-work-group-size"="false" }
311 ; HSA: attributes #8 = { nounwind "amdgpu-queue-ptr" "target-cpu"="fiji" "uniform-work-group-size"="false" }
312 ; HSA: attributes #9 = { nounwind "amdgpu-dispatch-id" "target-cpu"="fiji" "uniform-work-group-size"="false" }
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" "uniform-work-group-size"="false" }
315 ; HSA: attributes #12 = { nounwind "target-cpu"="gfx900" "uniform-work-group-size"="false" }
316 ; HSA: attributes #13 = { nounwind "amdgpu-queue-ptr" "target-cpu"="gfx900" "uniform-work-group-size"="false" }
317 ; HSA: attributes #14 = { nounwind "amdgpu-kernarg-segment-ptr" "target-cpu"="fiji" "uniform-work-group-size"="false" }
318 ; HSA: attributes #15 = { nounwind "amdgpu-implicitarg-ptr" "target-cpu"="fiji" }
319 ; HSA: attributes #16 = { nounwind "amdgpu-implicitarg-ptr" "target-cpu"="fiji" "uniform-work-group-size"="false" }
320 ; HSA: attributes #17 = { nounwind "uniform-work-group-size"="false" }
321 ; HSA: attributes #18 = { nounwind }
322 ; HSA: attributes #19 = { nounwind "amdgpu-flat-scratch" "uniform-work-group-size"="false" }