[libclc] libclc: Add uintptr_t overloads of atomic_fetch_add and sub (PR #185263)

Matt Arsenault via cfe-commits cfe-commits at lists.llvm.org
Sun Mar 8 01:11:22 PST 2026


https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/185263

>From 5b95a85b67d22a639cf29f606b128b9c5fb36f46 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Sun, 8 Mar 2026 09:33:49 +0100
Subject: [PATCH] libclc: Add uintptr_t overloads of atomic_fetch_add and sub

This is a special case because the pointee type is unsigned, but the
input value is signed. Directly use the opencl builtins, because these
work correctly without any ugly casting required, and it's not worth
putting a wrapper in clc.
---
 .../lib/generic/atomic/atomic_fetch_add.cl    | 28 +++++++++++++++++++
 .../lib/generic/atomic/atomic_fetch_sub.cl    | 28 +++++++++++++++++++
 2 files changed, 56 insertions(+)

diff --git a/libclc/opencl/lib/generic/atomic/atomic_fetch_add.cl b/libclc/opencl/lib/generic/atomic/atomic_fetch_add.cl
index 428ac19830f7f..8e431ace788e0 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_fetch_add.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_fetch_add.cl
@@ -17,3 +17,31 @@
 
 #define __CLC_BODY <atomic_def.inc>
 #include <clc/math/gentype.inc>
+
+#if defined(__opencl_c_atomic_order_seq_cst) &&                                \
+    defined(__opencl_c_atomic_scope_device)
+
+_CLC_OVERLOAD _CLC_DEF uintptr_t
+atomic_fetch_add(volatile __local atomic_uintptr_t *p, ptrdiff_t v) {
+  return __opencl_atomic_fetch_add(p, v, memory_order_seq_cst,
+                                   memory_scope_device);
+}
+
+_CLC_OVERLOAD _CLC_DEF uintptr_t
+atomic_fetch_add(volatile __global atomic_uintptr_t *p, ptrdiff_t v) {
+  return __opencl_atomic_fetch_add(p, v, memory_order_seq_cst,
+                                   memory_scope_device);
+}
+
+#if _CLC_GENERIC_AS_SUPPORTED
+
+_CLC_OVERLOAD _CLC_DEF uintptr_t atomic_fetch_add(volatile atomic_uintptr_t *p,
+                                                  ptrdiff_t v) {
+  return __opencl_atomic_fetch_add(p, v, memory_order_seq_cst,
+                                   memory_scope_device);
+}
+
+#endif // _CLC_GENERIC_AS_SUPPORTED
+
+#endif // defined(__opencl_c_atomic_order_seq_cst) &&
+       // defined(__opencl_c_atomic_scope_device)
diff --git a/libclc/opencl/lib/generic/atomic/atomic_fetch_sub.cl b/libclc/opencl/lib/generic/atomic/atomic_fetch_sub.cl
index 474aca6658014..e7bd865de7a58 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_fetch_sub.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_fetch_sub.cl
@@ -17,3 +17,31 @@
 
 #define __CLC_BODY <atomic_def.inc>
 #include <clc/math/gentype.inc>
+
+#if defined(__opencl_c_atomic_order_seq_cst) &&                                \
+    defined(__opencl_c_atomic_scope_device)
+
+_CLC_OVERLOAD _CLC_DEF uintptr_t
+atomic_fetch_sub(volatile __local atomic_uintptr_t *p, ptrdiff_t v) {
+  return __opencl_atomic_fetch_sub(p, v, memory_order_seq_cst,
+                                   memory_scope_device);
+}
+
+_CLC_OVERLOAD _CLC_DEF uintptr_t
+atomic_fetch_sub(volatile __global atomic_uintptr_t *p, ptrdiff_t v) {
+  return __opencl_atomic_fetch_sub(p, v, memory_order_seq_cst,
+                                   memory_scope_device);
+}
+
+#if _CLC_GENERIC_AS_SUPPORTED
+
+_CLC_OVERLOAD _CLC_DEF uintptr_t atomic_fetch_sub(volatile atomic_uintptr_t *p,
+                                                  ptrdiff_t v) {
+  return __opencl_atomic_fetch_sub(p, v, memory_order_seq_cst,
+                                   memory_scope_device);
+}
+
+#endif // _CLC_GENERIC_AS_SUPPORTED
+
+#endif // defined(__opencl_c_atomic_order_seq_cst) &&
+       // defined(__opencl_c_atomic_scope_device)



More information about the cfe-commits mailing list