diff --git a/clang/lib/Sema/OpenCLBuiltins.td b/clang/lib/Sema/OpenCLBuiltins.td index 1a58747c40176e..0e10722eee342a 100644 --- a/clang/lib/Sema/OpenCLBuiltins.td +++ b/clang/lib/Sema/OpenCLBuiltins.td @@ -58,6 +58,7 @@ def FuncExtKhrSubgroupBallot : FunctionExtension<"cl_khr_subgroup_ba def FuncExtKhrSubgroupNonUniformArithmetic: FunctionExtension<"cl_khr_subgroup_non_uniform_arithmetic">; def FuncExtKhrSubgroupShuffle : FunctionExtension<"cl_khr_subgroup_shuffle">; def FuncExtKhrSubgroupShuffleRelative : FunctionExtension<"cl_khr_subgroup_shuffle_relative">; +def FuncExtKhrSubgroupClusteredReduce : FunctionExtension<"cl_khr_subgroup_clustered_reduce">; def FuncExtKhrGlobalInt32BaseAtomics : FunctionExtension<"cl_khr_global_int32_base_atomics">; def FuncExtKhrGlobalInt32ExtendedAtomics : FunctionExtension<"cl_khr_global_int32_extended_atomics">; def FuncExtKhrLocalInt32BaseAtomics : FunctionExtension<"cl_khr_local_int32_base_atomics">; @@ -1551,7 +1552,17 @@ let Extension = FuncExtKhrSubgroupShuffleRelative in { } // Section 38.10.1 - cl_khr_subgroup_clustered_reduce -// TODO +let Extension = FuncExtKhrSubgroupClusteredReduce in { + foreach op = ["add", "min", "max", "mul"] in { + def : Builtin<"sub_group_clustered_reduce_" # op, [AGenType1, AGenType1, UInt]>; + } + foreach op = ["and", "or", "xor"] in { + def : Builtin<"sub_group_clustered_reduce_" # op, [AIGenType1, AIGenType1, UInt]>; + } + foreach op = ["and", "or", "xor"] in { + def : Builtin<"sub_group_clustered_reduce_logical_" # op, [Int, Int, UInt]>; + } +} //-------------------------------------------------------------------- // Arm extensions. diff --git a/clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl b/clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl index 93dd6fcc0a0d38..6b9be37eadaf7c 100644 --- a/clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl +++ b/clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl @@ -38,6 +38,7 @@ typedef long long2 __attribute__((ext_vector_type(2))); #if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200) #define cl_khr_subgroup_ballot 1 #define cl_khr_subgroup_non_uniform_arithmetic 1 +#define cl_khr_subgroup_clustered_reduce 1 #endif #endif @@ -144,10 +145,12 @@ kernel void basic_subgroup(global uint *out) { kernel void extended_subgroup(global uint4 *out, global int *scalar) { out[0] = get_sub_group_eq_mask(); scalar[0] = sub_group_non_uniform_scan_inclusive_or(3); + scalar[1] = sub_group_clustered_reduce_logical_xor(2, 4); #if __OPENCL_C_VERSION__ < CL_VERSION_2_0 && !defined(__OPENCL_CPP_VERSION__) - // expected-error@-3{{implicit declaration of function 'get_sub_group_eq_mask' is invalid in OpenCL}} - // expected-error@-4{{implicit conversion changes signedness}} - // expected-error@-4{{implicit declaration of function 'sub_group_non_uniform_scan_inclusive_or' is invalid in OpenCL}} + // expected-error@-4{{implicit declaration of function 'get_sub_group_eq_mask' is invalid in OpenCL}} + // expected-error@-5{{implicit conversion changes signedness}} + // expected-error@-5{{implicit declaration of function 'sub_group_non_uniform_scan_inclusive_or' is invalid in OpenCL}} + // expected-error@-5{{implicit declaration of function 'sub_group_clustered_reduce_logical_xor' is invalid in OpenCL}} #endif }