xref: /llvm-project/llvm/test/CodeGen/SPIRV/transcoding/group_ops.ll (revision 2fc7a72733762d685a07f846b44dc17a0585098e)
1f9c98068SVyacheslav Levytskyy; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
24baea8b3SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
34baea8b3SVyacheslav Levytskyy
4f9c98068SVyacheslav Levytskyy; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
50a443f13SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
613453c98SAndrey Tretyakov
713453c98SAndrey Tretyakov; CHECK-SPIRV-DAG: %[[#int:]] = OpTypeInt 32 0
8*2fc7a727SVyacheslav Levytskyy; CHECK-SPIRV-DAG: %[[#intv2:]] = OpTypeVector %[[#int]] 2
9*2fc7a727SVyacheslav Levytskyy; CHECK-SPIRV-DAG: %[[#intv3:]] = OpTypeVector %[[#int]] 3
1013453c98SAndrey Tretyakov; CHECK-SPIRV-DAG: %[[#float:]] = OpTypeFloat 32
114baea8b3SVyacheslav Levytskyy; CHECK-SPIRV-DAG: %[[#ScopeCrossWorkgroup:]] = OpConstant %[[#int]] 0
1213453c98SAndrey Tretyakov; CHECK-SPIRV-DAG: %[[#ScopeWorkgroup:]] = OpConstant %[[#int]] 2
1313453c98SAndrey Tretyakov; CHECK-SPIRV-DAG: %[[#ScopeSubgroup:]] = OpConstant %[[#int]] 3
1413453c98SAndrey Tretyakov
1513453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
1613453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupFMax %[[#float]] %[[#ScopeWorkgroup]] Reduce
1713453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
1813453c98SAndrey Tretyakov
1913453c98SAndrey Tretyakov;; kernel void testWorkGroupFMax(float a, global float *res) {
2013453c98SAndrey Tretyakov;;   res[0] = work_group_reduce_max(a);
2113453c98SAndrey Tretyakov;; }
2213453c98SAndrey Tretyakov
2313453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupFMax(float noundef %a, float addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
2413453c98SAndrey Tretyakoventry:
2513453c98SAndrey Tretyakov  %call = call spir_func float @_Z21work_group_reduce_maxf(float noundef %a)
2613453c98SAndrey Tretyakov  store float %call, float addrspace(1)* %res, align 4
2713453c98SAndrey Tretyakov  ret void
2813453c98SAndrey Tretyakov}
2913453c98SAndrey Tretyakov
3013453c98SAndrey Tretyakovdeclare spir_func float @_Z21work_group_reduce_maxf(float noundef) local_unnamed_addr
3113453c98SAndrey Tretyakov
3213453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
3313453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupFMin %[[#float]] %[[#ScopeWorkgroup]] Reduce
3413453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
3513453c98SAndrey Tretyakov
3613453c98SAndrey Tretyakov;; kernel void testWorkGroupFMin(float a, global float *res) {
3713453c98SAndrey Tretyakov;;   res[0] = work_group_reduce_min(a);
3813453c98SAndrey Tretyakov;; }
3913453c98SAndrey Tretyakov
4013453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupFMin(float noundef %a, float addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
4113453c98SAndrey Tretyakoventry:
4213453c98SAndrey Tretyakov  %call = call spir_func float @_Z21work_group_reduce_minf(float noundef %a)
4313453c98SAndrey Tretyakov  store float %call, float addrspace(1)* %res, align 4
4413453c98SAndrey Tretyakov  ret void
4513453c98SAndrey Tretyakov}
4613453c98SAndrey Tretyakov
4713453c98SAndrey Tretyakovdeclare spir_func float @_Z21work_group_reduce_minf(float noundef) local_unnamed_addr
4813453c98SAndrey Tretyakov
4913453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
5013453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupFAdd %[[#float]] %[[#ScopeWorkgroup]] Reduce
5113453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
5213453c98SAndrey Tretyakov
5313453c98SAndrey Tretyakov;; kernel void testWorkGroupFAdd(float a, global float *res) {
5413453c98SAndrey Tretyakov;;   res[0] = work_group_reduce_add(a);
5513453c98SAndrey Tretyakov;; }
5613453c98SAndrey Tretyakov
5713453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupFAdd(float noundef %a, float addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
5813453c98SAndrey Tretyakoventry:
5913453c98SAndrey Tretyakov  %call = call spir_func float @_Z21work_group_reduce_addf(float noundef %a)
6013453c98SAndrey Tretyakov  store float %call, float addrspace(1)* %res, align 4
6113453c98SAndrey Tretyakov  ret void
6213453c98SAndrey Tretyakov}
6313453c98SAndrey Tretyakov
6413453c98SAndrey Tretyakovdeclare spir_func float @_Z21work_group_reduce_addf(float noundef) local_unnamed_addr
6513453c98SAndrey Tretyakov
6613453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
6713453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupFMax %[[#float]] %[[#ScopeWorkgroup]] InclusiveScan
6813453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
6913453c98SAndrey Tretyakov
7013453c98SAndrey Tretyakov;; kernel void testWorkGroupScanInclusiveFMax(float a, global float *res) {
7113453c98SAndrey Tretyakov;;   res[0] = work_group_scan_inclusive_max(a);
7213453c98SAndrey Tretyakov;; }
7313453c98SAndrey Tretyakov
7413453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupScanInclusiveFMax(float noundef %a, float addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
7513453c98SAndrey Tretyakoventry:
7613453c98SAndrey Tretyakov  %call = call spir_func float @_Z29work_group_scan_inclusive_maxf(float noundef %a)
7713453c98SAndrey Tretyakov  store float %call, float addrspace(1)* %res, align 4
7813453c98SAndrey Tretyakov  ret void
7913453c98SAndrey Tretyakov}
8013453c98SAndrey Tretyakov
8113453c98SAndrey Tretyakovdeclare spir_func float @_Z29work_group_scan_inclusive_maxf(float noundef) local_unnamed_addr
8213453c98SAndrey Tretyakov
8313453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
8413453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupFMax %[[#float]] %[[#ScopeWorkgroup]] ExclusiveScan
8513453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
8613453c98SAndrey Tretyakov
8713453c98SAndrey Tretyakov;; kernel void testWorkGroupScanExclusiveFMax(float a, global float *res) {
8813453c98SAndrey Tretyakov;;   res[0] = work_group_scan_exclusive_max(a);
8913453c98SAndrey Tretyakov;; }
9013453c98SAndrey Tretyakov
9113453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupScanExclusiveFMax(float noundef %a, float addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
9213453c98SAndrey Tretyakoventry:
9313453c98SAndrey Tretyakov  %call = call spir_func float @_Z29work_group_scan_exclusive_maxf(float noundef %a)
9413453c98SAndrey Tretyakov  store float %call, float addrspace(1)* %res, align 4
9513453c98SAndrey Tretyakov  ret void
9613453c98SAndrey Tretyakov}
9713453c98SAndrey Tretyakov
9813453c98SAndrey Tretyakovdeclare spir_func float @_Z29work_group_scan_exclusive_maxf(float noundef) local_unnamed_addr
9913453c98SAndrey Tretyakov
10013453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
10113453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupSMax %[[#int]] %[[#ScopeWorkgroup]] Reduce
10213453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
10313453c98SAndrey Tretyakov
10413453c98SAndrey Tretyakov;; kernel void testWorkGroupSMax(int a, global int *res) {
10513453c98SAndrey Tretyakov;;   res[0] = work_group_reduce_max(a);
10613453c98SAndrey Tretyakov;; }
10713453c98SAndrey Tretyakov
10813453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupSMax(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
10913453c98SAndrey Tretyakoventry:
11013453c98SAndrey Tretyakov  %call = call spir_func i32 @_Z21work_group_reduce_maxi(i32 noundef %a)
11113453c98SAndrey Tretyakov  store i32 %call, i32 addrspace(1)* %res, align 4
11213453c98SAndrey Tretyakov  ret void
11313453c98SAndrey Tretyakov}
11413453c98SAndrey Tretyakov
11513453c98SAndrey Tretyakovdeclare spir_func i32 @_Z21work_group_reduce_maxi(i32 noundef) local_unnamed_addr
11613453c98SAndrey Tretyakov
11713453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
11813453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupSMin %[[#int]] %[[#ScopeWorkgroup]] Reduce
11913453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
12013453c98SAndrey Tretyakov
12113453c98SAndrey Tretyakov;; kernel void testWorkGroupSMin(int a, global int *res) {
12213453c98SAndrey Tretyakov;;   res[0] = work_group_reduce_min(a);
12313453c98SAndrey Tretyakov;; }
12413453c98SAndrey Tretyakov
12513453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupSMin(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
12613453c98SAndrey Tretyakoventry:
12713453c98SAndrey Tretyakov  %call = call spir_func i32 @_Z21work_group_reduce_mini(i32 noundef %a)
12813453c98SAndrey Tretyakov  store i32 %call, i32 addrspace(1)* %res, align 4
12913453c98SAndrey Tretyakov  ret void
13013453c98SAndrey Tretyakov}
13113453c98SAndrey Tretyakov
13213453c98SAndrey Tretyakovdeclare spir_func i32 @_Z21work_group_reduce_mini(i32 noundef) local_unnamed_addr
13313453c98SAndrey Tretyakov
13413453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
13513453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupIAdd %[[#int]] %[[#ScopeWorkgroup]] Reduce
13613453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
13713453c98SAndrey Tretyakov
13813453c98SAndrey Tretyakov;; kernel void testWorkGroupIAddSigned(int a, global int *res) {
13913453c98SAndrey Tretyakov;;   res[0] = work_group_reduce_add(a);
14013453c98SAndrey Tretyakov;; }
14113453c98SAndrey Tretyakov
14213453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupIAddSigned(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
14313453c98SAndrey Tretyakoventry:
14413453c98SAndrey Tretyakov  %call = call spir_func i32 @_Z21work_group_reduce_addi(i32 noundef %a)
14513453c98SAndrey Tretyakov  store i32 %call, i32 addrspace(1)* %res, align 4
14613453c98SAndrey Tretyakov  ret void
14713453c98SAndrey Tretyakov}
14813453c98SAndrey Tretyakov
14913453c98SAndrey Tretyakovdeclare spir_func i32 @_Z21work_group_reduce_addi(i32 noundef) local_unnamed_addr
15013453c98SAndrey Tretyakov
15113453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
15213453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupIAdd %[[#int]] %[[#ScopeWorkgroup]] Reduce
15313453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
15413453c98SAndrey Tretyakov
15513453c98SAndrey Tretyakov;; kernel void testWorkGroupIAddUnsigned(uint a, global uint *res) {
15613453c98SAndrey Tretyakov;;   res[0] = work_group_reduce_add(a);
15713453c98SAndrey Tretyakov;; }
15813453c98SAndrey Tretyakov
15913453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupIAddUnsigned(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
16013453c98SAndrey Tretyakoventry:
16113453c98SAndrey Tretyakov  %call = call spir_func i32 @_Z21work_group_reduce_addj(i32 noundef %a)
16213453c98SAndrey Tretyakov  store i32 %call, i32 addrspace(1)* %res, align 4
16313453c98SAndrey Tretyakov  ret void
16413453c98SAndrey Tretyakov}
16513453c98SAndrey Tretyakov
16613453c98SAndrey Tretyakovdeclare spir_func i32 @_Z21work_group_reduce_addj(i32 noundef) local_unnamed_addr
16713453c98SAndrey Tretyakov
16813453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
16913453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupUMax %[[#int]] %[[#ScopeWorkgroup]] Reduce
17013453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
17113453c98SAndrey Tretyakov
17213453c98SAndrey Tretyakov;; kernel void testWorkGroupUMax(uint a, global uint *res) {
17313453c98SAndrey Tretyakov;;   res[0] = work_group_reduce_max(a);
17413453c98SAndrey Tretyakov;; }
17513453c98SAndrey Tretyakov
17613453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupUMax(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
17713453c98SAndrey Tretyakoventry:
17813453c98SAndrey Tretyakov  %call = call spir_func i32 @_Z21work_group_reduce_maxj(i32 noundef %a)
17913453c98SAndrey Tretyakov  store i32 %call, i32 addrspace(1)* %res, align 4
18013453c98SAndrey Tretyakov  ret void
18113453c98SAndrey Tretyakov}
18213453c98SAndrey Tretyakov
18313453c98SAndrey Tretyakovdeclare spir_func i32 @_Z21work_group_reduce_maxj(i32 noundef) local_unnamed_addr
18413453c98SAndrey Tretyakov
18513453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
18613453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupUMax %[[#int]] %[[#ScopeSubgroup]] Reduce
18713453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
18813453c98SAndrey Tretyakov
18913453c98SAndrey Tretyakov;; #pragma OPENCL EXTENSION cl_khr_subgroups: enable
19013453c98SAndrey Tretyakov;; kernel void testSubGroupUMax(uint a, global uint *res) {
19113453c98SAndrey Tretyakov;;   res[0] = sub_group_reduce_max(a);
19213453c98SAndrey Tretyakov;; }
19313453c98SAndrey Tretyakov;; #pragma OPENCL EXTENSION cl_khr_subgroups: disable
19413453c98SAndrey Tretyakov
19513453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testSubGroupUMax(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
19613453c98SAndrey Tretyakoventry:
19713453c98SAndrey Tretyakov  %call = call spir_func i32 @_Z20sub_group_reduce_maxj(i32 noundef %a)
19813453c98SAndrey Tretyakov  store i32 %call, i32 addrspace(1)* %res, align 4
19913453c98SAndrey Tretyakov  ret void
20013453c98SAndrey Tretyakov}
20113453c98SAndrey Tretyakov
20213453c98SAndrey Tretyakovdeclare spir_func i32 @_Z20sub_group_reduce_maxj(i32 noundef) local_unnamed_addr
20313453c98SAndrey Tretyakov
20413453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
20513453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupUMax %[[#int]] %[[#ScopeWorkgroup]] InclusiveScan
20613453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
20713453c98SAndrey Tretyakov
20813453c98SAndrey Tretyakov;; kernel void testWorkGroupScanInclusiveUMax(uint a, global uint *res) {
20913453c98SAndrey Tretyakov;;   res[0] = work_group_scan_inclusive_max(a);
21013453c98SAndrey Tretyakov;; }
21113453c98SAndrey Tretyakov
21213453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupScanInclusiveUMax(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
21313453c98SAndrey Tretyakoventry:
21413453c98SAndrey Tretyakov  %call = call spir_func i32 @_Z29work_group_scan_inclusive_maxj(i32 noundef %a)
21513453c98SAndrey Tretyakov  store i32 %call, i32 addrspace(1)* %res, align 4
21613453c98SAndrey Tretyakov  ret void
21713453c98SAndrey Tretyakov}
21813453c98SAndrey Tretyakov
21913453c98SAndrey Tretyakovdeclare spir_func i32 @_Z29work_group_scan_inclusive_maxj(i32 noundef) local_unnamed_addr
22013453c98SAndrey Tretyakov
22113453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
22213453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupUMax %[[#int]] %[[#ScopeWorkgroup]] ExclusiveScan
22313453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
22413453c98SAndrey Tretyakov
22513453c98SAndrey Tretyakov;; kernel void testWorkGroupScanExclusiveUMax(uint a, global uint *res) {
22613453c98SAndrey Tretyakov;;   res[0] = work_group_scan_exclusive_max(a);
22713453c98SAndrey Tretyakov;; }
22813453c98SAndrey Tretyakov
22913453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupScanExclusiveUMax(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
23013453c98SAndrey Tretyakoventry:
23113453c98SAndrey Tretyakov  %call = call spir_func i32 @_Z29work_group_scan_exclusive_maxj(i32 noundef %a)
23213453c98SAndrey Tretyakov  store i32 %call, i32 addrspace(1)* %res, align 4
23313453c98SAndrey Tretyakov  ret void
23413453c98SAndrey Tretyakov}
23513453c98SAndrey Tretyakov
23613453c98SAndrey Tretyakovdeclare spir_func i32 @_Z29work_group_scan_exclusive_maxj(i32 noundef) local_unnamed_addr
23713453c98SAndrey Tretyakov
23813453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
23913453c98SAndrey Tretyakov; CHECK-SPIRV: %[[#]] = OpGroupUMin %[[#int]] %[[#ScopeWorkgroup]] Reduce
24013453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
24113453c98SAndrey Tretyakov
24213453c98SAndrey Tretyakov;; kernel void testWorkGroupUMin(uint a, global uint *res) {
24313453c98SAndrey Tretyakov;;   res[0] = work_group_reduce_min(a);
24413453c98SAndrey Tretyakov;; }
24513453c98SAndrey Tretyakov
24613453c98SAndrey Tretyakovdefine dso_local spir_kernel void @testWorkGroupUMin(i32 noundef %a, i32 addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr {
24713453c98SAndrey Tretyakoventry:
24813453c98SAndrey Tretyakov  %call = call spir_func i32 @_Z21work_group_reduce_minj(i32 noundef %a)
24913453c98SAndrey Tretyakov  store i32 %call, i32 addrspace(1)* %res, align 4
25013453c98SAndrey Tretyakov  ret void
25113453c98SAndrey Tretyakov}
25213453c98SAndrey Tretyakov
25313453c98SAndrey Tretyakovdeclare spir_func i32 @_Z21work_group_reduce_minj(i32 noundef) local_unnamed_addr
25413453c98SAndrey Tretyakov
25513453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunction
2564baea8b3SVyacheslav Levytskyy; CHECK-SPIRV: %[[#]] = OpGroupBroadcast %[[#int]] %[[#ScopeWorkgroup]] %[[#BroadcastValue:]] %[[#BroadcastLocalId:]]
257*2fc7a727SVyacheslav Levytskyy; CHECK-SPIRV: %[[#BroadcastVec2:]] = OpCompositeConstruct %[[#intv2]] %[[#BroadcastLocalId]] %[[#BroadcastLocalId]]
258*2fc7a727SVyacheslav Levytskyy; CHECK-SPIRV: %[[#]] = OpGroupBroadcast %[[#int]] %[[#ScopeWorkgroup]] %[[#BroadcastValue]] %[[#BroadcastVec2]]
259*2fc7a727SVyacheslav Levytskyy; CHECK-SPIRV: %[[#BroadcastVec3:]] = OpCompositeConstruct %[[#intv3]] %[[#BroadcastLocalId]] %[[#BroadcastLocalId]] %[[#BroadcastLocalId]]
260*2fc7a727SVyacheslav Levytskyy; CHECK-SPIRV: %[[#]] = OpGroupBroadcast %[[#int]] %[[#ScopeWorkgroup]] %[[#BroadcastValue]] %[[#BroadcastVec3]]
2614baea8b3SVyacheslav Levytskyy; CHECK-SPIRV: %[[#]] = OpGroupBroadcast %[[#int]] %[[#ScopeCrossWorkgroup]] %[[#BroadcastValue]] %[[#BroadcastLocalId]]
26213453c98SAndrey Tretyakov; CHECK-SPIRV: OpFunctionEnd
26313453c98SAndrey Tretyakov
26413453c98SAndrey Tretyakov;; kernel void testWorkGroupBroadcast(uint a, global size_t *id, global int *res) {
26513453c98SAndrey Tretyakov;;   res[0] = work_group_broadcast(a, *id);
26613453c98SAndrey Tretyakov;; }
26713453c98SAndrey Tretyakov
26813453c98SAndrey Tretyakovdefine 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 {
26913453c98SAndrey Tretyakoventry:
27013453c98SAndrey Tretyakov  %0 = load i32, i32 addrspace(1)* %id, align 4
27113453c98SAndrey Tretyakov  %call = call spir_func i32 @_Z20work_group_broadcastjj(i32 noundef %a, i32 noundef %0)
272*2fc7a727SVyacheslav Levytskyy  %call_v2 = call spir_func i32 @_Z20work_group_broadcastjj(i32 noundef %a, i32 noundef %0, i32 noundef %0)
273*2fc7a727SVyacheslav Levytskyy  %call_v3 = call spir_func i32 @_Z20work_group_broadcastjj(i32 noundef %a, i32 noundef %0, i32 noundef %0, i32 noundef %0)
27413453c98SAndrey Tretyakov  store i32 %call, i32 addrspace(1)* %res, align 4
2754baea8b3SVyacheslav Levytskyy  %call1 = call spir_func i32 @__spirv_GroupBroadcast(i32 0, i32 noundef %a, i32 noundef %0)
27613453c98SAndrey Tretyakov  ret void
27713453c98SAndrey Tretyakov}
27813453c98SAndrey Tretyakov
27913453c98SAndrey Tretyakovdeclare spir_func i32 @_Z20work_group_broadcastjj(i32 noundef, i32 noundef) local_unnamed_addr
280*2fc7a727SVyacheslav Levytskyydeclare spir_func i32 @_Z20work_group_broadcastjjj(i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr
281*2fc7a727SVyacheslav Levytskyydeclare spir_func i32 @_Z20work_group_broadcastjjjj(i32 noundef, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr
2824baea8b3SVyacheslav Levytskyydeclare spir_func i32 @__spirv_GroupBroadcast(i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr
2834baea8b3SVyacheslav Levytskyy
2844baea8b3SVyacheslav Levytskyy; CHECK-SPIRV: OpFunction
2854baea8b3SVyacheslav Levytskyy; CHECK-SPIRV: %[[#]] = OpGroupFAdd %[[#float]] %[[#ScopeCrossWorkgroup]] Reduce %[[#FValue:]]
2864baea8b3SVyacheslav Levytskyy; CHECK-SPIRV: %[[#]] = OpGroupFMin %[[#float]] %[[#ScopeWorkgroup]] InclusiveScan %[[#FValue]]
2874baea8b3SVyacheslav Levytskyy; CHECK-SPIRV: %[[#]] = OpGroupFMax %[[#float]] %[[#ScopeSubgroup]] ExclusiveScan %[[#FValue]]
2884baea8b3SVyacheslav Levytskyy; CHECK-SPIRV: %[[#]] = OpGroupIAdd %[[#int]] %[[#ScopeCrossWorkgroup]] Reduce %[[#IValue:]]
2894baea8b3SVyacheslav Levytskyy; CHECK-SPIRV: %[[#]] = OpGroupUMin %[[#int]] %[[#ScopeWorkgroup]] InclusiveScan %[[#IValue]]
2904baea8b3SVyacheslav Levytskyy; CHECK-SPIRV: %[[#]] = OpGroupSMin %[[#int]] %[[#ScopeSubgroup]] ExclusiveScan %[[#IValue]]
2914baea8b3SVyacheslav Levytskyy; CHECK-SPIRV: %[[#]] = OpGroupUMax %[[#int]] %[[#ScopeCrossWorkgroup]] Reduce %[[#IValue]]
2924baea8b3SVyacheslav Levytskyy; CHECK-SPIRV: %[[#]] = OpGroupSMax %[[#int]] %[[#ScopeWorkgroup]] InclusiveScan %[[#IValue]]
2934baea8b3SVyacheslav Levytskyy; CHECK-SPIRV: OpFunctionEnd
2944baea8b3SVyacheslav Levytskyy
2954baea8b3SVyacheslav Levytskyydefine spir_kernel void @foo(float %a, i32 %b) {
2964baea8b3SVyacheslav Levytskyyentry:
2974baea8b3SVyacheslav Levytskyy  %f1 = call spir_func float @__spirv_GroupFAdd(i32 0, i32 0, float %a)
2984baea8b3SVyacheslav Levytskyy  %f2 = call spir_func float @__spirv_GroupFMin(i32 2, i32 1, float %a)
2994baea8b3SVyacheslav Levytskyy  %f3 = call spir_func float @__spirv_GroupFMax(i32 3, i32 2, float %a)
3004baea8b3SVyacheslav Levytskyy  %i1 = call spir_func i32 @__spirv_GroupIAdd(i32 0, i32 0, i32 %b)
3014baea8b3SVyacheslav Levytskyy  %i2 = call spir_func i32 @__spirv_GroupUMin(i32 2, i32 1, i32 %b)
3024baea8b3SVyacheslav Levytskyy  %i3 = call spir_func i32 @__spirv_GroupSMin(i32 3, i32 2, i32 %b)
3034baea8b3SVyacheslav Levytskyy  %i4 = call spir_func i32 @__spirv_GroupUMax(i32 0, i32 0, i32 %b)
3044baea8b3SVyacheslav Levytskyy  %i5 = call spir_func i32 @__spirv_GroupSMax(i32 2, i32 1, i32 %b)
3054baea8b3SVyacheslav Levytskyy  ret void
3064baea8b3SVyacheslav Levytskyy}
3074baea8b3SVyacheslav Levytskyy
3084baea8b3SVyacheslav Levytskyydeclare spir_func float @__spirv_GroupFAdd(i32, i32, float)
3094baea8b3SVyacheslav Levytskyydeclare spir_func float @__spirv_GroupFMin(i32, i32, float)
3104baea8b3SVyacheslav Levytskyydeclare spir_func float @__spirv_GroupFMax(i32, i32, float)
3114baea8b3SVyacheslav Levytskyydeclare spir_func i32 @__spirv_GroupIAdd(i32, i32, i32)
3124baea8b3SVyacheslav Levytskyydeclare spir_func i32 @__spirv_GroupUMin(i32, i32, i32)
3134baea8b3SVyacheslav Levytskyydeclare spir_func i32 @__spirv_GroupSMin(i32, i32, i32)
3144baea8b3SVyacheslav Levytskyydeclare spir_func i32 @__spirv_GroupUMax(i32, i32, i32)
3154baea8b3SVyacheslav Levytskyydeclare spir_func i32 @__spirv_GroupSMax(i32, i32, i32)
316