[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / SPIRV / transcoding / group_ops.ll
blob6aa9faa6c893e998c80d2cab000d7452850df6ca
1 ; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
3 ; CHECK-SPIRV-DAG: %[[#int:]] = OpTypeInt 32 0
4 ; CHECK-SPIRV-DAG: %[[#float:]] = OpTypeFloat 32
5 ; CHECK-SPIRV-DAG: %[[#ScopeWorkgroup:]] = OpConstant %[[#int]] 2
6 ; CHECK-SPIRV-DAG: %[[#ScopeSubgroup:]] = OpConstant %[[#int]] 3
8 ; CHECK-SPIRV: OpFunction
9 ; CHECK-SPIRV: %[[#]] = OpGroupFMax %[[#float]] %[[#ScopeWorkgroup]] Reduce
10 ; CHECK-SPIRV: OpFunctionEnd
12 ;; kernel void testWorkGroupFMax(float a, global float *res) {
13 ;;   res[0] = work_group_reduce_max(a);
14 ;; }
16 define dso_local spir_kernel void @testWorkGroupFMax(float noundef %a, float addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
17 entry:
18   %call = call spir_func float @_Z21work_group_reduce_maxf(float noundef %a)
19   store float %call, float addrspace(1)* %res, align 4
20   ret void
23 declare spir_func float @_Z21work_group_reduce_maxf(float noundef) local_unnamed_addr
25 ; CHECK-SPIRV: OpFunction
26 ; CHECK-SPIRV: %[[#]] = OpGroupFMin %[[#float]] %[[#ScopeWorkgroup]] Reduce
27 ; CHECK-SPIRV: OpFunctionEnd
29 ;; kernel void testWorkGroupFMin(float a, global float *res) {
30 ;;   res[0] = work_group_reduce_min(a);
31 ;; }
33 define dso_local spir_kernel void @testWorkGroupFMin(float noundef %a, float addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
34 entry:
35   %call = call spir_func float @_Z21work_group_reduce_minf(float noundef %a)
36   store float %call, float addrspace(1)* %res, align 4
37   ret void
40 declare spir_func float @_Z21work_group_reduce_minf(float noundef) local_unnamed_addr
42 ; CHECK-SPIRV: OpFunction
43 ; CHECK-SPIRV: %[[#]] = OpGroupFAdd %[[#float]] %[[#ScopeWorkgroup]] Reduce
44 ; CHECK-SPIRV: OpFunctionEnd
46 ;; kernel void testWorkGroupFAdd(float a, global float *res) {
47 ;;   res[0] = work_group_reduce_add(a);
48 ;; }
50 define dso_local spir_kernel void @testWorkGroupFAdd(float noundef %a, float addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
51 entry:
52   %call = call spir_func float @_Z21work_group_reduce_addf(float noundef %a)
53   store float %call, float addrspace(1)* %res, align 4
54   ret void
57 declare spir_func float @_Z21work_group_reduce_addf(float noundef) local_unnamed_addr
59 ; CHECK-SPIRV: OpFunction
60 ; CHECK-SPIRV: %[[#]] = OpGroupFMax %[[#float]] %[[#ScopeWorkgroup]] InclusiveScan
61 ; CHECK-SPIRV: OpFunctionEnd
63 ;; kernel void testWorkGroupScanInclusiveFMax(float a, global float *res) {
64 ;;   res[0] = work_group_scan_inclusive_max(a);
65 ;; }
67 define dso_local spir_kernel void @testWorkGroupScanInclusiveFMax(float noundef %a, float addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
68 entry:
69   %call = call spir_func float @_Z29work_group_scan_inclusive_maxf(float noundef %a)
70   store float %call, float addrspace(1)* %res, align 4
71   ret void
74 declare spir_func float @_Z29work_group_scan_inclusive_maxf(float noundef) local_unnamed_addr
76 ; CHECK-SPIRV: OpFunction
77 ; CHECK-SPIRV: %[[#]] = OpGroupFMax %[[#float]] %[[#ScopeWorkgroup]] ExclusiveScan
78 ; CHECK-SPIRV: OpFunctionEnd
80 ;; kernel void testWorkGroupScanExclusiveFMax(float a, global float *res) {
81 ;;   res[0] = work_group_scan_exclusive_max(a);
82 ;; }
84 define dso_local spir_kernel void @testWorkGroupScanExclusiveFMax(float noundef %a, float addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
85 entry:
86   %call = call spir_func float @_Z29work_group_scan_exclusive_maxf(float noundef %a)
87   store float %call, float addrspace(1)* %res, align 4
88   ret void
91 declare spir_func float @_Z29work_group_scan_exclusive_maxf(float noundef) local_unnamed_addr
93 ; CHECK-SPIRV: OpFunction
94 ; CHECK-SPIRV: %[[#]] = OpGroupSMax %[[#int]] %[[#ScopeWorkgroup]] Reduce
95 ; CHECK-SPIRV: OpFunctionEnd
97 ;; kernel void testWorkGroupSMax(int a, global int *res) {
98 ;;   res[0] = work_group_reduce_max(a);
99 ;; }
101 define dso_local spir_kernel void @testWorkGroupSMax(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
102 entry:
103   %call = call spir_func i32 @_Z21work_group_reduce_maxi(i32 noundef %a)
104   store i32 %call, i32 addrspace(1)* %res, align 4
105   ret void
108 declare spir_func i32 @_Z21work_group_reduce_maxi(i32 noundef) local_unnamed_addr
110 ; CHECK-SPIRV: OpFunction
111 ; CHECK-SPIRV: %[[#]] = OpGroupSMin %[[#int]] %[[#ScopeWorkgroup]] Reduce
112 ; CHECK-SPIRV: OpFunctionEnd
114 ;; kernel void testWorkGroupSMin(int a, global int *res) {
115 ;;   res[0] = work_group_reduce_min(a);
116 ;; }
118 define dso_local spir_kernel void @testWorkGroupSMin(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
119 entry:
120   %call = call spir_func i32 @_Z21work_group_reduce_mini(i32 noundef %a)
121   store i32 %call, i32 addrspace(1)* %res, align 4
122   ret void
125 declare spir_func i32 @_Z21work_group_reduce_mini(i32 noundef) local_unnamed_addr
127 ; CHECK-SPIRV: OpFunction
128 ; CHECK-SPIRV: %[[#]] = OpGroupIAdd %[[#int]] %[[#ScopeWorkgroup]] Reduce
129 ; CHECK-SPIRV: OpFunctionEnd
131 ;; kernel void testWorkGroupIAddSigned(int a, global int *res) {
132 ;;   res[0] = work_group_reduce_add(a);
133 ;; }
135 define dso_local spir_kernel void @testWorkGroupIAddSigned(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
136 entry:
137   %call = call spir_func i32 @_Z21work_group_reduce_addi(i32 noundef %a)
138   store i32 %call, i32 addrspace(1)* %res, align 4
139   ret void
142 declare spir_func i32 @_Z21work_group_reduce_addi(i32 noundef) local_unnamed_addr
144 ; CHECK-SPIRV: OpFunction
145 ; CHECK-SPIRV: %[[#]] = OpGroupIAdd %[[#int]] %[[#ScopeWorkgroup]] Reduce
146 ; CHECK-SPIRV: OpFunctionEnd
148 ;; kernel void testWorkGroupIAddUnsigned(uint a, global uint *res) {
149 ;;   res[0] = work_group_reduce_add(a);
150 ;; }
152 define dso_local spir_kernel void @testWorkGroupIAddUnsigned(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
153 entry:
154   %call = call spir_func i32 @_Z21work_group_reduce_addj(i32 noundef %a)
155   store i32 %call, i32 addrspace(1)* %res, align 4
156   ret void
159 declare spir_func i32 @_Z21work_group_reduce_addj(i32 noundef) local_unnamed_addr
161 ; CHECK-SPIRV: OpFunction
162 ; CHECK-SPIRV: %[[#]] = OpGroupUMax %[[#int]] %[[#ScopeWorkgroup]] Reduce
163 ; CHECK-SPIRV: OpFunctionEnd
165 ;; kernel void testWorkGroupUMax(uint a, global uint *res) {
166 ;;   res[0] = work_group_reduce_max(a);
167 ;; }
169 define dso_local spir_kernel void @testWorkGroupUMax(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
170 entry:
171   %call = call spir_func i32 @_Z21work_group_reduce_maxj(i32 noundef %a)
172   store i32 %call, i32 addrspace(1)* %res, align 4
173   ret void
176 declare spir_func i32 @_Z21work_group_reduce_maxj(i32 noundef) local_unnamed_addr
178 ; CHECK-SPIRV: OpFunction
179 ; CHECK-SPIRV: %[[#]] = OpGroupUMax %[[#int]] %[[#ScopeSubgroup]] Reduce
180 ; CHECK-SPIRV: OpFunctionEnd
182 ;; #pragma OPENCL EXTENSION cl_khr_subgroups: enable
183 ;; kernel void testSubGroupUMax(uint a, global uint *res) {
184 ;;   res[0] = sub_group_reduce_max(a);
185 ;; }
186 ;; #pragma OPENCL EXTENSION cl_khr_subgroups: disable
188 define dso_local spir_kernel void @testSubGroupUMax(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
189 entry:
190   %call = call spir_func i32 @_Z20sub_group_reduce_maxj(i32 noundef %a)
191   store i32 %call, i32 addrspace(1)* %res, align 4
192   ret void
195 declare spir_func i32 @_Z20sub_group_reduce_maxj(i32 noundef) local_unnamed_addr
197 ; CHECK-SPIRV: OpFunction
198 ; CHECK-SPIRV: %[[#]] = OpGroupUMax %[[#int]] %[[#ScopeWorkgroup]] InclusiveScan
199 ; CHECK-SPIRV: OpFunctionEnd
201 ;; kernel void testWorkGroupScanInclusiveUMax(uint a, global uint *res) {
202 ;;   res[0] = work_group_scan_inclusive_max(a);
203 ;; }
205 define dso_local spir_kernel void @testWorkGroupScanInclusiveUMax(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
206 entry:
207   %call = call spir_func i32 @_Z29work_group_scan_inclusive_maxj(i32 noundef %a)
208   store i32 %call, i32 addrspace(1)* %res, align 4
209   ret void
212 declare spir_func i32 @_Z29work_group_scan_inclusive_maxj(i32 noundef) local_unnamed_addr
214 ; CHECK-SPIRV: OpFunction
215 ; CHECK-SPIRV: %[[#]] = OpGroupUMax %[[#int]] %[[#ScopeWorkgroup]] ExclusiveScan
216 ; CHECK-SPIRV: OpFunctionEnd
218 ;; kernel void testWorkGroupScanExclusiveUMax(uint a, global uint *res) {
219 ;;   res[0] = work_group_scan_exclusive_max(a);
220 ;; }
222 define dso_local spir_kernel void @testWorkGroupScanExclusiveUMax(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
223 entry:
224   %call = call spir_func i32 @_Z29work_group_scan_exclusive_maxj(i32 noundef %a)
225   store i32 %call, i32 addrspace(1)* %res, align 4
226   ret void
229 declare spir_func i32 @_Z29work_group_scan_exclusive_maxj(i32 noundef) local_unnamed_addr
231 ; CHECK-SPIRV: OpFunction
232 ; CHECK-SPIRV: %[[#]] = OpGroupUMin %[[#int]] %[[#ScopeWorkgroup]] Reduce
233 ; CHECK-SPIRV: OpFunctionEnd
235 ;; kernel void testWorkGroupUMin(uint a, global uint *res) {
236 ;;   res[0] = work_group_reduce_min(a);
237 ;; }
239 define dso_local spir_kernel void @testWorkGroupUMin(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
240 entry:
241   %call = call spir_func i32 @_Z21work_group_reduce_minj(i32 noundef %a)
242   store i32 %call, i32 addrspace(1)* %res, align 4
243   ret void
246 declare spir_func i32 @_Z21work_group_reduce_minj(i32 noundef) local_unnamed_addr
248 ; CHECK-SPIRV: OpFunction
249 ; CHECK-SPIRV: %[[#]] = OpGroupBroadcast %[[#int]] %[[#ScopeWorkgroup]]
250 ; CHECK-SPIRV: OpFunctionEnd
252 ;; kernel void testWorkGroupBroadcast(uint a, global size_t *id, global int *res) {
253 ;;   res[0] = work_group_broadcast(a, *id);
254 ;; }
256 define dso_local spir_kernel void @testWorkGroupBroadcast(i32 noundef %a, i32 addrspace(1)* nocapture noundef readonly %id, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
257 entry:
258   %0 = load i32, i32 addrspace(1)* %id, align 4
259   %call = call spir_func i32 @_Z20work_group_broadcastjj(i32 noundef %a, i32 noundef %0)
260   store i32 %call, i32 addrspace(1)* %res, align 4
261   ret void
264 declare spir_func i32 @_Z20work_group_broadcastjj(i32 noundef, i32 noundef) local_unnamed_addr