diff --git a/clang/lib/Headers/opencl-c.h b/clang/lib/Headers/opencl-c.h index 705a3231b57733..562e0551ffdc68 100644 --- a/clang/lib/Headers/opencl-c.h +++ b/clang/lib/Headers/opencl-c.h @@ -13640,6 +13640,118 @@ uintptr_t __ovld atomic_fetch_sub_explicit(volatile __local atomic_uintptr_t *ob // The functionality added by cl_ext_float_atomics extension #if defined(cl_ext_float_atomics) +#if defined(__opencl_c_ext_fp16_global_atomic_load_store) +void __ovld atomic_store(volatile __global atomic_half *object, half operand); +void __ovld atomic_store_explicit(volatile __global atomic_half *object, + half operand, memory_order order); +void __ovld atomic_store_explicit(volatile __global atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_load(volatile __global atomic_half *object); +half __ovld atomic_load_explicit(volatile __global atomic_half *object, + memory_order order); +half __ovld atomic_load_explicit(volatile __global atomic_half *object, + memory_order order, memory_scope scope); +half __ovld atomic_exchange(volatile __global atomic_half *object, + half operand); +half __ovld atomic_exchange_explicit(volatile __global atomic_half *object, + half operand, memory_order order); +half __ovld atomic_exchange_explicit(volatile __global atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_global_atomic_load_store) + +#if defined(__opencl_c_ext_fp16_local_atomic_load_store) +void __ovld atomic_store(volatile __local atomic_half *object, half operand); +void __ovld atomic_store_explicit(volatile __local atomic_half *object, + half operand, memory_order order); +void __ovld atomic_store_explicit(volatile __local atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_load(volatile __local atomic_half *object); +half __ovld atomic_load_explicit(volatile __local atomic_half *object, + memory_order order); +half __ovld atomic_load_explicit(volatile __local atomic_half *object, + memory_order order, memory_scope scope); +half __ovld atomic_exchange(volatile __local atomic_half *object, half operand); +half __ovld atomic_exchange_explicit(volatile __local atomic_half *object, + half operand, memory_order order); +half __ovld atomic_exchange_explicit(volatile __local atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_local_atomic_load_store) + +#if defined(__opencl_c_ext_fp16_global_atomic_load_store) && \ + defined(__opencl_c_ext_fp16_local_atomic_load_store) +void __ovld atomic_store(volatile atomic_half *object, half operand); +void __ovld atomic_store_explicit(volatile atomic_half *object, half operand, + memory_order order); +void __ovld atomic_store_explicit(volatile atomic_half *object, half operand, + memory_order order, memory_scope scope); +half __ovld atomic_load(volatile atomic_half *object); +half __ovld atomic_load_explicit(volatile atomic_half *object, + memory_order order); +half __ovld atomic_load_explicit(volatile atomic_half *object, + memory_order order, memory_scope scope); +half __ovld atomic_exchange(volatile atomic_half *object, half operand); +half __ovld atomic_exchange_explicit(volatile atomic_half *object, half operand, + memory_order order); +half __ovld atomic_exchange_explicit(volatile atomic_half *object, half operand, + memory_order order, memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_global_atomic_load_store) && + // defined(__opencl_c_ext_fp16_local_atomic_load_store) + +#if defined(__opencl_c_ext_fp16_global_atomic_min_max) +half __ovld atomic_fetch_min(volatile __global atomic_half *object, + half operand); +half __ovld atomic_fetch_max(volatile __global atomic_half *object, + half operand); +half __ovld atomic_fetch_min_explicit(volatile __global atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_max_explicit(volatile __global atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_min_explicit(volatile __global atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_fetch_max_explicit(volatile __global atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_global_atomic_min_max) + +#if defined(__opencl_c_ext_fp16_local_atomic_min_max) +half __ovld atomic_fetch_min(volatile __local atomic_half *object, + half operand); +half __ovld atomic_fetch_max(volatile __local atomic_half *object, + half operand); +half __ovld atomic_fetch_min_explicit(volatile __local atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_max_explicit(volatile __local atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_min_explicit(volatile __local atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_fetch_max_explicit(volatile __local atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_local_atomic_min_max) + +#if defined(__opencl_c_ext_fp16_global_atomic_min_max) && \ + defined(__opencl_c_ext_fp16_local_atomic_min_max) +half __ovld atomic_fetch_min(volatile atomic_half *object, half operand); +half __ovld atomic_fetch_max(volatile atomic_half *object, half operand); +half __ovld atomic_fetch_min_explicit(volatile atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_max_explicit(volatile atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_min_explicit(volatile atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_fetch_max_explicit(volatile atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_global_atomic_min_max) && \ + defined(__opencl_c_ext_fp16_local_atomic_min_max) + #if defined(__opencl_c_ext_fp32_global_atomic_min_max) float __ovld atomic_fetch_min(volatile __global atomic_float *object, float operand); @@ -13742,6 +13854,57 @@ double __ovld atomic_fetch_max_explicit(volatile atomic_double *object, #endif // defined(__opencl_c_ext_fp64_global_atomic_min_max) && \ defined(__opencl_c_ext_fp64_local_atomic_min_max) +#if defined(__opencl_c_ext_fp16_global_atomic_add) +half __ovld atomic_fetch_add(volatile __global atomic_half *object, + half operand); +half __ovld atomic_fetch_sub(volatile __global atomic_half *object, + half operand); +half __ovld atomic_fetch_add_explicit(volatile __global atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_sub_explicit(volatile __global atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_add_explicit(volatile __global atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_fetch_sub_explicit(volatile __global atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_global_atomic_add) + +#if defined(__opencl_c_ext_fp16_local_atomic_add) +half __ovld atomic_fetch_add(volatile __local atomic_half *object, + half operand); +half __ovld atomic_fetch_sub(volatile __local atomic_half *object, + half operand); +half __ovld atomic_fetch_add_explicit(volatile __local atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_sub_explicit(volatile __local atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_add_explicit(volatile __local atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_fetch_sub_explicit(volatile __local atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_local_atomic_add) + +#if defined(__opencl_c_ext_fp16_global_atomic_add) && \ + defined(__opencl_c_ext_fp16_local_atomic_add) +half __ovld atomic_fetch_add(volatile atomic_half *object, half operand); +half __ovld atomic_fetch_sub(volatile atomic_half *object, half operand); +half __ovld atomic_fetch_add_explicit(volatile atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_sub_explicit(volatile atomic_half *object, + half operand, memory_order order); +half __ovld atomic_fetch_add_explicit(volatile atomic_half *object, + half operand, memory_order order, + memory_scope scope); +half __ovld atomic_fetch_sub_explicit(volatile atomic_half *object, + half operand, memory_order order, + memory_scope scope); +#endif // defined(__opencl_c_ext_fp16_global_atomic_add) && \ + defined(__opencl_c_ext_fp16_local_atomic_add) + #if defined(__opencl_c_ext_fp32_global_atomic_add) float __ovld atomic_fetch_add(volatile __global atomic_float *object, float operand); diff --git a/clang/lib/Sema/OpenCLBuiltins.td b/clang/lib/Sema/OpenCLBuiltins.td index 2501e50b8968aa..8cf7ec58eff56d 100644 --- a/clang/lib/Sema/OpenCLBuiltins.td +++ b/clang/lib/Sema/OpenCLBuiltins.td @@ -85,16 +85,25 @@ def FuncExtKhrGlMsaaSharing : FunctionExtension<"cl_khr_gl_msaa_sha def FuncExtOpenCLCPipes : FunctionExtension<"__opencl_c_pipes">; def FuncExtOpenCLCWGCollectiveFunctions : FunctionExtension<"__opencl_c_work_group_collective_functions">; +def FuncExtFloatAtomicsFp16GlobalLoadStore : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_global_atomic_load_store">; +def FuncExtFloatAtomicsFp16LocalLoadStore : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_local_atomic_load_store">; +def FuncExtFloatAtomicsFp16GenericLoadStore : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_global_atomic_load_store __opencl_c_ext_fp16_local_atomic_load_store">; +def FuncExtFloatAtomicsFp16GlobalAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_global_atomic_add">; def FuncExtFloatAtomicsFp32GlobalAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp32_global_atomic_add">; def FuncExtFloatAtomicsFp64GlobalAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp64_global_atomic_add">; +def FuncExtFloatAtomicsFp16LocalAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_local_atomic_add">; def FuncExtFloatAtomicsFp32LocalAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp32_local_atomic_add">; def FuncExtFloatAtomicsFp64LocalAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp64_local_atomic_add">; +def FuncExtFloatAtomicsFp16GenericAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_local_atomic_add __opencl_c_ext_fp16_global_atomic_add">; def FuncExtFloatAtomicsFp32GenericAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp32_local_atomic_add __opencl_c_ext_fp32_global_atomic_add">; def FuncExtFloatAtomicsFp64GenericAdd : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp64_local_atomic_add __opencl_c_ext_fp64_global_atomic_add">; +def FuncExtFloatAtomicsFp16GlobalMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_global_atomic_min_max">; def FuncExtFloatAtomicsFp32GlobalMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp32_global_atomic_min_max">; def FuncExtFloatAtomicsFp64GlobalMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp64_global_atomic_min_max">; +def FuncExtFloatAtomicsFp16LocalMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_local_atomic_min_max">; def FuncExtFloatAtomicsFp32LocalMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp32_local_atomic_min_max">; def FuncExtFloatAtomicsFp64LocalMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp64_local_atomic_min_max">; +def FuncExtFloatAtomicsFp16GenericMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp16_local_atomic_min_max __opencl_c_ext_fp16_global_atomic_min_max">; def FuncExtFloatAtomicsFp32GenericMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp32_local_atomic_min_max __opencl_c_ext_fp32_global_atomic_min_max">; def FuncExtFloatAtomicsFp64GenericMinMax : FunctionExtension<"cl_ext_float_atomics __opencl_c_ext_fp64_local_atomic_min_max __opencl_c_ext_fp64_global_atomic_min_max">; @@ -362,6 +371,7 @@ def AtomicLong : Type<"atomic_long", QualType<"Context.getAtomicType( def AtomicULong : Type<"atomic_ulong", QualType<"Context.getAtomicType(Context.UnsignedLongTy)">>; def AtomicFloat : Type<"atomic_float", QualType<"Context.getAtomicType(Context.FloatTy)">>; def AtomicDouble : Type<"atomic_double", QualType<"Context.getAtomicType(Context.DoubleTy)">>; +def AtomicHalf : Type<"atomic_half", QualType<"Context.getAtomicType(Context.HalfTy)">>; def AtomicIntPtr : Type<"atomic_intptr_t", QualType<"Context.getAtomicType(Context.getIntPtrType())">>; def AtomicUIntPtr : Type<"atomic_uintptr_t", QualType<"Context.getAtomicType(Context.getUIntPtrType())">>; def AtomicSize : Type<"atomic_size_t", QualType<"Context.getAtomicType(Context.getSizeType())">>; @@ -1106,7 +1116,75 @@ let MinVersion = CL20 in { // The functionality added by cl_ext_float_atomics extension let MinVersion = CL20 in { + let Extension = FuncExtFloatAtomicsFp16GlobalLoadStore in { + def : Builtin<"atomic_store", + [Void, PointerType, GlobalAS>, AtomicHalf]>; + def : Builtin<"atomic_store_explicit", + [Void, PointerType, GlobalAS>, AtomicHalf, MemoryOrder]>; + def : Builtin<"atomic_store_explicit", + [Void, PointerType, GlobalAS>, AtomicHalf, MemoryOrder, MemoryScope]>; + def : Builtin<"atomic_load", + [Half, PointerType, GlobalAS>]>; + def : Builtin<"atomic_load_explicit", + [Half, PointerType, GlobalAS>, MemoryOrder]>; + def : Builtin<"atomic_load_explicit", + [Half, PointerType, GlobalAS>, MemoryOrder, MemoryScope]>; + def : Builtin<"atomic_exchange", + [Half, PointerType, GlobalAS>, Half]>; + def : Builtin<"atomic_exchange_explicit", + [Half, PointerType, GlobalAS>, Half, MemoryOrder]>; + def : Builtin<"atomic_exchange_explicit", + [Half, PointerType, GlobalAS>, Half, MemoryOrder, MemoryScope]>; + } + let Extension = FuncExtFloatAtomicsFp16LocalLoadStore in { + def : Builtin<"atomic_store", + [Void, PointerType, LocalAS>, AtomicHalf]>; + def : Builtin<"atomic_store_explicit", + [Void, PointerType, LocalAS>, AtomicHalf, MemoryOrder]>; + def : Builtin<"atomic_store_explicit", + [Void, PointerType, LocalAS>, AtomicHalf, MemoryOrder, MemoryScope]>; + def : Builtin<"atomic_load", + [Half, PointerType, LocalAS>]>; + def : Builtin<"atomic_load_explicit", + [Half, PointerType, LocalAS>, MemoryOrder]>; + def : Builtin<"atomic_load_explicit", + [Half, PointerType, LocalAS>, MemoryOrder, MemoryScope]>; + def : Builtin<"atomic_exchange", + [Half, PointerType, LocalAS>, Half]>; + def : Builtin<"atomic_exchange_explicit", + [Half, PointerType, LocalAS>, Half, MemoryOrder]>; + def : Builtin<"atomic_exchange_explicit", + [Half, PointerType, LocalAS>, Half, MemoryOrder, MemoryScope]>; + } + let Extension = FuncExtFloatAtomicsFp16GenericLoadStore in { + def : Builtin<"atomic_store", + [Void, PointerType, GenericAS>, AtomicHalf]>; + def : Builtin<"atomic_store_explicit", + [Void, PointerType, GenericAS>, AtomicHalf, MemoryOrder]>; + def : Builtin<"atomic_store_explicit", + [Void, PointerType, GenericAS>, AtomicHalf, MemoryOrder, MemoryScope]>; + def : Builtin<"atomic_load", + [Half, PointerType, GenericAS>]>; + def : Builtin<"atomic_load_explicit", + [Half, PointerType, GenericAS>, MemoryOrder]>; + def : Builtin<"atomic_load_explicit", + [Half, PointerType, GenericAS>, MemoryOrder, MemoryScope]>; + def : Builtin<"atomic_exchange", + [Half, PointerType, GenericAS>, Half]>; + def : Builtin<"atomic_exchange_explicit", + [Half, PointerType, GenericAS>, Half, MemoryOrder]>; + def : Builtin<"atomic_exchange_explicit", + [Half, PointerType, GenericAS>, Half, MemoryOrder, MemoryScope]>; + } foreach ModOp = ["add", "sub"] in { + let Extension = FuncExtFloatAtomicsFp16GlobalAdd in { + def : Builtin<"atomic_fetch_" # ModOp, + [Half, PointerType, GlobalAS>, Half]>; + def : Builtin<"atomic_fetch_" # ModOp # "_explicit", + [Half, PointerType, GlobalAS>, Half, MemoryOrder]>; + def : Builtin<"atomic_fetch_" # ModOp # "_explicit", + [Half, PointerType, GlobalAS>, Half, MemoryOrder, MemoryScope]>; + } let Extension = FuncExtFloatAtomicsFp32GlobalAdd in { def : Builtin<"atomic_fetch_" # ModOp, [Float, PointerType, GlobalAS>, Float]>; @@ -1123,6 +1201,14 @@ let MinVersion = CL20 in { def : Builtin<"atomic_fetch_" # ModOp # "_explicit", [Double, PointerType, GlobalAS>, Double, MemoryOrder, MemoryScope]>; } + let Extension = FuncExtFloatAtomicsFp16LocalAdd in { + def : Builtin<"atomic_fetch_" # ModOp, + [Half, PointerType, LocalAS>, Half]>; + def : Builtin<"atomic_fetch_" # ModOp # "_explicit", + [Half, PointerType, LocalAS>, Half, MemoryOrder]>; + def : Builtin<"atomic_fetch_" # ModOp # "_explicit", + [Half, PointerType, LocalAS>, Half, MemoryOrder, MemoryScope]>; + } let Extension = FuncExtFloatAtomicsFp32LocalAdd in { def : Builtin<"atomic_fetch_" # ModOp, [Float, PointerType, LocalAS>, Float]>; @@ -1139,6 +1225,14 @@ let MinVersion = CL20 in { def : Builtin<"atomic_fetch_" # ModOp # "_explicit", [Double, PointerType, LocalAS>, Double, MemoryOrder, MemoryScope]>; } + let Extension = FuncExtFloatAtomicsFp16GenericAdd in { + def : Builtin<"atomic_fetch_" # ModOp, + [Half, PointerType, GenericAS>, Half]>; + def : Builtin<"atomic_fetch_" # ModOp # "_explicit", + [Half, PointerType, GenericAS>, Half, MemoryOrder]>; + def : Builtin<"atomic_fetch_" # ModOp # "_explicit", + [Half, PointerType, GenericAS>, Half, MemoryOrder, MemoryScope]>; + } let Extension = FuncExtFloatAtomicsFp32GenericAdd in { def : Builtin<"atomic_fetch_" # ModOp, [Float, PointerType, GenericAS>, Float]>; @@ -1157,6 +1251,14 @@ let MinVersion = CL20 in { } } foreach ModOp = ["min", "max"] in { + let Extension = FuncExtFloatAtomicsFp16GlobalMinMax in { + def : Builtin<"atomic_fetch_" # ModOp, + [Half, PointerType, GlobalAS>, Half]>; + def : Builtin<"atomic_fetch_" # ModOp # "_explicit", + [Half, PointerType, GlobalAS>, Half, MemoryOrder]>; + def : Builtin<"atomic_fetch_" # ModOp # "_explicit", + [Half, PointerType, GlobalAS>, Half, MemoryOrder, MemoryScope]>; + } let Extension = FuncExtFloatAtomicsFp32GlobalMinMax in { def : Builtin<"atomic_fetch_" # ModOp, [Float, PointerType, GlobalAS>, Float]>; @@ -1173,6 +1275,14 @@ let MinVersion = CL20 in { def : Builtin<"atomic_fetch_" # ModOp # "_explicit", [Double, PointerType, GlobalAS>, Double, MemoryOrder, MemoryScope]>; } + let Extension = FuncExtFloatAtomicsFp16LocalMinMax in { + def : Builtin<"atomic_fetch_" # ModOp, + [Half, PointerType, LocalAS>, Half]>; + def : Builtin<"atomic_fetch_" # ModOp # "_explicit", + [Half, PointerType, LocalAS>, Half, MemoryOrder]>; + def : Builtin<"atomic_fetch_" # ModOp # "_explicit", + [Half, PointerType, LocalAS>, Half, MemoryOrder, MemoryScope]>; + } let Extension = FuncExtFloatAtomicsFp32LocalMinMax in { def : Builtin<"atomic_fetch_" # ModOp, [Float, PointerType, LocalAS>, Float]>; @@ -1189,6 +1299,14 @@ let MinVersion = CL20 in { def : Builtin<"atomic_fetch_" # ModOp # "_explicit", [Double, PointerType, LocalAS>, Double, MemoryOrder, MemoryScope]>; } + let Extension = FuncExtFloatAtomicsFp16GenericMinMax in { + def : Builtin<"atomic_fetch_" # ModOp, + [Half, PointerType, GenericAS>, Half]>; + def : Builtin<"atomic_fetch_" # ModOp # "_explicit", + [Half, PointerType, GenericAS>, Half, MemoryOrder]>; + def : Builtin<"atomic_fetch_" # ModOp # "_explicit", + [Half, PointerType, GenericAS>, Half, MemoryOrder, MemoryScope]>; + } let Extension = FuncExtFloatAtomicsFp32GenericMinMax in { def : Builtin<"atomic_fetch_" # ModOp, [Float, PointerType, GenericAS>, Float]>; diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 6430671a853157..88833f233adc1f 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -367,6 +367,11 @@ void Sema::Initialize() { AddPointerSizeDependentTypes(); } + if (getOpenCLOptions().isSupported("cl_khr_fp16", getLangOpts())) { + auto AtomicHalfT = Context.getAtomicType(Context.HalfTy); + addImplicitTypedef("atomic_half", AtomicHalfT); + } + std::vector Atomic64BitTypes; if (getOpenCLOptions().isSupported("cl_khr_int64_base_atomics", getLangOpts()) && diff --git a/clang/test/SemaOpenCL/atomic-ops.cl b/clang/test/SemaOpenCL/atomic-ops.cl index 728c07540a4bd7..8a56fa73297d82 100644 --- a/clang/test/SemaOpenCL/atomic-ops.cl +++ b/clang/test/SemaOpenCL/atomic-ops.cl @@ -19,7 +19,7 @@ int8 i64; atomic_int gn; void f(atomic_int *i, const atomic_int *ci, - atomic_intptr_t *p, atomic_float *f, atomic_double *d, atomic_half *h, // expected-error {{unknown type name 'atomic_half'}} + atomic_intptr_t *p, atomic_float *f, atomic_double *d, atomic_half *h, int *I, const int *CI, intptr_t *P, float *D, struct S *s1, struct S *s2, global atomic_int *i_g, local atomic_int *i_l, private atomic_int *i_p,