[clang] c5c4a88 - [OpenCL] Remove spurious atomic_fetch tablegen builtins
Sven van Haastregt via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 18 05:17:34 PDT 2021
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() {
More information about the cfe-commits
mailing list