[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:03:46 PST 2026
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/185263
>From dde55bba6719d70c29739f97bff9616ef32867f1 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 | 34 +++++++++++++++++++
.../lib/generic/atomic/atomic_fetch_sub.cl | 34 +++++++++++++++++++
2 files changed, 68 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..c8d8914cfca4a 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_fetch_add.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_fetch_add.cl
@@ -17,3 +17,37 @@
#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);
+}
+
+_CLC_OVERLOAD _CLC_DEF uintptr_t
+atomic_fetch_add(volatile __private atomic_uintptr_t *p, ptrdiff_t v) {
+ return __opencl_atomic_fetch_add(p, v, memory_order_seq_cst,
+ memory_scope_device);
+}
+
+#ifdef _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..026496d0e488d 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_fetch_sub.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_fetch_sub.cl
@@ -17,3 +17,37 @@
#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);
+}
+
+_CLC_OVERLOAD _CLC_DEF uintptr_t
+atomic_fetch_sub(volatile __private atomic_uintptr_t *p, ptrdiff_t v) {
+ return __opencl_atomic_fetch_sub(p, v, memory_order_seq_cst,
+ memory_scope_device);
+}
+
+#ifdef _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