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