xref: /llvm-project/llvm/test/Analysis/UniformityAnalysis/AMDGPU/workitem-intrinsics.ll (revision 53fb907df4723f5267f30fe8da103f91dfb1a175)
1; RUN: opt -mtriple amdgcn-unknown-amdhsa -passes='print<uniformity>' -disable-output %s 2>&1 | FileCheck %s
2
3declare i32 @llvm.amdgcn.workitem.id.x() #0
4declare i32 @llvm.amdgcn.workitem.id.y() #0
5declare i32 @llvm.amdgcn.workitem.id.z() #0
6declare i32 @llvm.amdgcn.mbcnt.lo(i32, i32) #0
7declare i32 @llvm.amdgcn.mbcnt.hi(i32, i32) #0
8
9; CHECK: DIVERGENT:  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
10define amdgpu_kernel void @workitem_id_x() #1 {
11  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
12  store volatile i32 %id.x, ptr addrspace(1) undef
13  ret void
14}
15
16; CHECK: DIVERGENT:  %id.y = call i32 @llvm.amdgcn.workitem.id.y()
17define amdgpu_kernel void @workitem_id_y() #1 {
18  %id.y = call i32 @llvm.amdgcn.workitem.id.y()
19  store volatile i32 %id.y, ptr addrspace(1) undef
20  ret void
21}
22
23; CHECK: DIVERGENT:  %id.z = call i32 @llvm.amdgcn.workitem.id.z()
24define amdgpu_kernel void @workitem_id_z() #1 {
25  %id.z = call i32 @llvm.amdgcn.workitem.id.z()
26  store volatile i32 %id.z, ptr addrspace(1) undef
27  ret void
28}
29
30; CHECK: DIVERGENT:  %mbcnt.lo = call i32 @llvm.amdgcn.mbcnt.lo(i32 0, i32 0)
31define amdgpu_kernel void @mbcnt_lo() #1 {
32  %mbcnt.lo = call i32 @llvm.amdgcn.mbcnt.lo(i32 0, i32 0)
33  store volatile i32 %mbcnt.lo, ptr addrspace(1) undef
34  ret void
35}
36
37; CHECK: DIVERGENT:  %mbcnt.hi = call i32 @llvm.amdgcn.mbcnt.hi(i32 0, i32 0)
38define amdgpu_kernel void @mbcnt_hi() #1 {
39  %mbcnt.hi = call i32 @llvm.amdgcn.mbcnt.hi(i32 0, i32 0)
40  store volatile i32 %mbcnt.hi, ptr addrspace(1) undef
41  ret void
42}
43
44; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_singlethreaded':
45; CHECK-NOT: DIVERGENT
46define amdgpu_kernel void @workitem_id_x_singlethreaded() #2 {
47  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
48  store volatile i32 %id.x, ptr addrspace(1) undef
49  ret void
50}
51
52; CHECK-LABEL: UniformityInfo for function 'workitem_id_y_singlethreaded':
53; CHECK-NOT: DIVERGENT
54define amdgpu_kernel void @workitem_id_y_singlethreaded() #2 {
55  %id.x = call i32 @llvm.amdgcn.workitem.id.y()
56  store volatile i32 %id.x, ptr addrspace(1) undef
57  ret void
58}
59
60; CHECK-LABEL: UniformityInfo for function 'workitem_id_z_singlethreaded':
61; CHECK-NOT: DIVERGENT
62define amdgpu_kernel void @workitem_id_z_singlethreaded() #2 {
63  %id.x = call i32 @llvm.amdgcn.workitem.id.y()
64  store volatile i32 %id.x, ptr addrspace(1) undef
65  ret void
66}
67
68; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_singlethreaded_md':
69; CHECK-NOT: DIVERGENT
70define amdgpu_kernel void @workitem_id_x_singlethreaded_md() !reqd_work_group_size !0 {
71  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
72  store volatile i32 %id.x, ptr addrspace(1) undef
73  ret void
74}
75
76; CHECK-LABEL: UniformityInfo for function 'workitem_id_y_singlethreaded_md':
77; CHECK-NOT: DIVERGENT
78define amdgpu_kernel void @workitem_id_y_singlethreaded_md() !reqd_work_group_size !0 {
79  %id.x = call i32 @llvm.amdgcn.workitem.id.y()
80  store volatile i32 %id.x, ptr addrspace(1) undef
81  ret void
82}
83
84; CHECK-LABEL: UniformityInfo for function 'workitem_id_z_singlethreaded_md':
85; CHECK-NOT: DIVERGENT
86define amdgpu_kernel void @workitem_id_z_singlethreaded_md() !reqd_work_group_size !0 {
87  %id.x = call i32 @llvm.amdgcn.workitem.id.y()
88  store volatile i32 %id.x, ptr addrspace(1) undef
89  ret void
90}
91
92; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_not_singlethreaded_dimx':
93; CHECK: DIVERGENT:  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
94define amdgpu_kernel void @workitem_id_x_not_singlethreaded_dimx() !reqd_work_group_size !1 {
95  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
96  store volatile i32 %id.x, ptr addrspace(1) undef
97  ret void
98}
99
100; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_not_singlethreaded_dimy':
101; CHECK: DIVERGENT:  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
102define amdgpu_kernel void @workitem_id_x_not_singlethreaded_dimy() !reqd_work_group_size !2 {
103  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
104  store volatile i32 %id.x, ptr addrspace(1) undef
105  ret void
106}
107
108; CHECK-LABEL: UniformityInfo for function 'workitem_id_x_not_singlethreaded_dimz':
109; CHECK: DIVERGENT:  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
110define amdgpu_kernel void @workitem_id_x_not_singlethreaded_dimz() !reqd_work_group_size !3 {
111  %id.x = call i32 @llvm.amdgcn.workitem.id.x()
112  store volatile i32 %id.x, ptr addrspace(1) undef
113  ret void
114}
115
116attributes #0 = { nounwind readnone }
117attributes #1 = { nounwind }
118attributes #2 = { "amdgpu-flat-work-group-size"="1,1" }
119
120!0 = !{i32 1, i32 1, i32 1}
121!1 = !{i32 2, i32 1, i32 1}
122!2 = !{i32 1, i32 2, i32 1}
123!3 = !{i32 1, i32 1, i32 2}
124