diff --git a/clang/lib/Sema/OpenCLBuiltins.td b/clang/lib/Sema/OpenCLBuiltins.td --- a/clang/lib/Sema/OpenCLBuiltins.td +++ b/clang/lib/Sema/OpenCLBuiltins.td @@ -53,6 +53,7 @@ // FunctionExtension definitions. def FuncExtNone : FunctionExtension<"">; def FuncExtKhrSubgroups : FunctionExtension<"cl_khr_subgroups">; +def FuncExtKhrSubgroupExtendedTypes : FunctionExtension<"cl_khr_subgroup_extended_types">; def FuncExtKhrSubgroupNonUniformVote : FunctionExtension<"cl_khr_subgroup_non_uniform_vote">; def FuncExtKhrSubgroupBallot : FunctionExtension<"cl_khr_subgroup_ballot">; def FuncExtKhrSubgroupNonUniformArithmetic: FunctionExtension<"cl_khr_subgroup_non_uniform_arithmetic">; @@ -367,6 +368,9 @@ def FGenTypeN : GenericType<"FGenTypeN", TLFloat, VecAndScalar>; // (u)int, (u)long, and all floats def IntLongFloatGenType1 : GenericType<"IntLongFloatGenType1", TLIntLongFloats, Vec1>; +// (u)char and (u)short +def CharShortGenType1 : GenericType<"CharShortGenType1", + TypeList<[Char, UChar, Short, UShort]>, Vec1>; // GenType definitions for every single base type (e.g. fp32 only). // Names are like: GenTypeFloatVecAndScalar. @@ -1496,7 +1500,19 @@ // OpenCL Extension v3.0 s38 - Extended Subgroup Functions // Section 38.4.1 - cl_khr_subgroup_extended_types -// TODO +let Extension = FuncExtKhrSubgroupExtendedTypes in { + // For sub_group_broadcast, add scalar char, uchar, short, and ushort support, + def : Builtin<"sub_group_broadcast", [CharShortGenType1, CharShortGenType1, UInt], Attr.Convergent>; + // gentype may additionally be one of the supported built-in vector data types. + def : Builtin<"sub_group_broadcast", [AGenTypeNNoScalar, AGenTypeNNoScalar, UInt], Attr.Convergent>; + + foreach name = ["sub_group_reduce_", "sub_group_scan_exclusive_", + "sub_group_scan_inclusive_"] in { + foreach op = ["add", "min", "max"] in { + def : Builtin; + } + } +} // Section 38.5.1 - cl_khr_subgroup_non_uniform_vote let Extension = FuncExtKhrSubgroupNonUniformVote in { diff --git a/clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl b/clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl --- a/clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl +++ b/clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl @@ -36,6 +36,7 @@ // Enable extensions that are enabled in opencl-c-base.h. #if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200) +#define cl_khr_subgroup_extended_types 1 #define cl_khr_subgroup_ballot 1 #define cl_khr_subgroup_non_uniform_arithmetic 1 #define cl_khr_subgroup_clustered_reduce 1 @@ -142,15 +143,18 @@ #endif } -kernel void extended_subgroup(global uint4 *out, global int *scalar) { +kernel void extended_subgroup(global uint4 *out, global int *scalar, global char2 *c2) { 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); + *c2 = sub_group_broadcast(*c2, 2); #if __OPENCL_C_VERSION__ < CL_VERSION_2_0 && !defined(__OPENCL_CPP_VERSION__) - // 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}} + // expected-error@-5{{implicit declaration of function 'get_sub_group_eq_mask' is invalid in OpenCL}} + // expected-error@-6{{implicit conversion changes signedness}} + // expected-error@-6{{implicit declaration of function 'sub_group_non_uniform_scan_inclusive_or' is invalid in OpenCL}} + // expected-error@-6{{implicit declaration of function 'sub_group_clustered_reduce_logical_xor' is invalid in OpenCL}} + // expected-error@-6{{implicit declaration of function 'sub_group_broadcast' is invalid in OpenCL}} + // expected-error@-7{{implicit conversion loses integer precision}} #endif }