Author: Sven van Haastregt Date: 2021-03-18T12:17:12Z New Revision: c5c4a88a840037fd38cb35d5efd524d51dcc091b
URL: https://github.com/llvm/llvm-project/commit/c5c4a88a840037fd38cb35d5efd524d51dcc091b DIFF: https://github.com/llvm/llvm-project/commit/c5c4a88a840037fd38cb35d5efd524d51dcc091b.diff LOG: [OpenCL] Remove spurious atomic_fetch tablegen builtins The `int` and `long` versions of these builtins already provide the necessary overloads for `intptr_t` and `uintptr_t` arguments, as `ASTContext` defines `atomic_(u)intptr_t` in terms of the `int` or `long` types. Prior to this patch, calls to those builtins with particular argument types resulted in call-is-ambiguous errors. Differential Revision: https://reviews.llvm.org/D98520 Added: Modified: clang/lib/Sema/OpenCLBuiltins.td clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl Removed: ################################################################################ diff --git a/clang/lib/Sema/OpenCLBuiltins.td b/clang/lib/Sema/OpenCLBuiltins.td index d6d77dc90d30..1ff658e567b8 100644 --- a/clang/lib/Sema/OpenCLBuiltins.td +++ b/clang/lib/Sema/OpenCLBuiltins.td @@ -1100,7 +1100,6 @@ let MinVersion = CL20 in { foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt], [AtomicLong, Long, Long], [AtomicULong, ULong, ULong], - [AtomicIntPtr, IntPtr, PtrDiff], [AtomicUIntPtr, UIntPtr, PtrDiff]] in { foreach ModOp = ["add", "sub"] in { def : Builtin<"atomic_fetch_" # ModOp, @@ -1112,9 +1111,7 @@ let MinVersion = CL20 in { } } foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt], - [AtomicLong, Long, Long], [AtomicULong, ULong, ULong], - [AtomicIntPtr, IntPtr, IntPtr], - [AtomicUIntPtr, UIntPtr, UIntPtr]] in { + [AtomicLong, Long, Long], [AtomicULong, ULong, ULong]] in { foreach ModOp = ["or", "xor", "and", "min", "max"] in { def : Builtin<"atomic_fetch_" # ModOp, [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2]]>; diff --git a/clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl b/clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl index 825dd3a935d0..103d1d8b262b 100644 --- a/clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl +++ b/clang/test/SemaOpenCL/fdeclare-opencl-builtins.cl @@ -39,6 +39,9 @@ typedef unsigned int uint; typedef unsigned long ulong; typedef unsigned short ushort; typedef __SIZE_TYPE__ size_t; +typedef __PTRDIFF_TYPE__ ptr diff _t; +typedef __INTPTR_TYPE__ intptr_t; +typedef __UINTPTR_TYPE__ uintptr_t; typedef char char2 __attribute__((ext_vector_type(2))); typedef char char4 __attribute__((ext_vector_type(4))); typedef uchar uchar4 __attribute__((ext_vector_type(4))); @@ -98,6 +101,24 @@ void test_typedef_args(clk_event_t evt, volatile atomic_flag *flg, global unsign size_t ws[2] = {2, 8}; ndrange_t r = ndrange_2D(ws); } + +// Check that atomic_fetch_ functions can be called with (u)intptr_t arguments, +// despite OpenCLBuiltins.td not providing explicit overloads for those types. +void test_atomic_fetch(volatile __generic atomic_int *a_int, + volatile __generic atomic_intptr_t *a_intptr, + volatile __generic atomic_uintptr_t *a_uintptr) { + int i; + intptr_t ip; + uintptr_t uip; + ptr diff _t ptr diff ; + + i = atomic_fetch_add(a_int, i); + ip = atomic_fetch_add(a_intptr, ptr diff ); + uip = atomic_fetch_add(a_uintptr, ptr diff ); + + ip = atomic_fetch_or(a_intptr, ip); + uip = atomic_fetch_or(a_uintptr, uip); +} #endif kernel void basic_conversion() { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits