[libclc] [libclc] Add OpenCL atomic_*_explicit builtins (PR #168318)
Wenju He via cfe-commits
cfe-commits at lists.llvm.org
Sun Nov 16 22:03:21 PST 2025
https://github.com/wenju-he created https://github.com/llvm/llvm-project/pull/168318
Implement atomic_*_explicit (e.g. atomic_store_explicit) with memory_order plus optional memory_scope.
OpenCL memory_order maps 1:1 to Clang (e.g. OpenCL memory_order_relaxed == Clang __ATOMIC_RELAXED), so we pass it unchanged to clc_atomic_* function which forwards to Clang _scoped_atomic* builtins.
Other changes:
* Add __opencl_get_clang_memory_scope helper in opencl/utils.h (OpenCL scope -> Clang scope).
* Correct atomic_compare_exchange return type to bool.
* Fix atomic_compare_exchange to return true when value stored in the pointer equals expected value.
>From 5965c4bd306c1a227188ea6eeb9c3d247e9ab2f3 Mon Sep 17 00:00:00 2001
From: Wenju He <wenju.he at intel.com>
Date: Mon, 17 Nov 2025 06:52:38 +0100
Subject: [PATCH] [libclc] Add OpenCL atomic_*_explicit builtins
Implement atomic_*_explicit (e.g. atomic_store_explicit) with
memory_order plus optional memory_scope.
OpenCL memory_order maps 1:1 to Clang (e.g. OpenCL memory_order_relaxed
== Clang __ATOMIC_RELAXED), so we pass it unchanged to clc_atomic_*
function which forwards to Clang _scoped_atomic* builtins.
Other changes:
* Add __opencl_get_clang_memory_scope helper in opencl/utils.h
(OpenCL scope -> Clang scope).
* Correct atomic_compare_exchange return type to bool.
* Fix atomic_compare_exchange to return true when value stored in the
pointer equals expected value.
---
.../atomic/atomic_compare_exchange_strong.h | 3 +
.../atomic/atomic_compare_exchange_weak.h | 3 +
.../include/clc/opencl/atomic/atomic_decl.inc | 91 ++++++++++--
.../clc/opencl/atomic/atomic_exchange.h | 3 +
.../clc/opencl/atomic/atomic_fetch_add.h | 3 +
.../clc/opencl/atomic/atomic_fetch_and.h | 3 +
.../clc/opencl/atomic/atomic_fetch_max.h | 3 +
.../clc/opencl/atomic/atomic_fetch_min.h | 3 +
.../clc/opencl/atomic/atomic_fetch_or.h | 3 +
.../clc/opencl/atomic/atomic_fetch_sub.h | 3 +
.../clc/opencl/atomic/atomic_fetch_xor.h | 3 +
.../include/clc/opencl/atomic/atomic_load.h | 3 +
.../include/clc/opencl/atomic/atomic_store.h | 3 +
libclc/opencl/include/clc/opencl/types.h | 48 +++++++
libclc/opencl/include/clc/opencl/utils.h | 33 +++++
.../atomic/atomic_compare_exchange_strong.cl | 7 +-
.../atomic/atomic_compare_exchange_weak.cl | 7 +-
.../opencl/lib/generic/atomic/atomic_def.inc | 131 +++++++++++++++---
.../lib/generic/atomic/atomic_exchange.cl | 7 +-
.../lib/generic/atomic/atomic_fetch_add.cl | 7 +-
.../lib/generic/atomic/atomic_fetch_and.cl | 7 +-
.../lib/generic/atomic/atomic_fetch_max.cl | 7 +-
.../lib/generic/atomic/atomic_fetch_min.cl | 7 +-
.../lib/generic/atomic/atomic_fetch_or.cl | 7 +-
.../lib/generic/atomic/atomic_fetch_sub.cl | 7 +-
.../lib/generic/atomic/atomic_fetch_xor.cl | 7 +-
.../opencl/lib/generic/atomic/atomic_load.cl | 7 +-
.../opencl/lib/generic/atomic/atomic_store.cl | 7 +-
28 files changed, 325 insertions(+), 98 deletions(-)
create mode 100644 libclc/opencl/include/clc/opencl/types.h
create mode 100644 libclc/opencl/include/clc/opencl/utils.h
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_compare_exchange_strong.h b/libclc/opencl/include/clc/opencl/atomic/atomic_compare_exchange_strong.h
index 59bfa0e87dd8f..4870b13329e4f 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_compare_exchange_strong.h
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_compare_exchange_strong.h
@@ -9,6 +9,9 @@
#ifndef __CLC_OPENCL_ATOMIC_ATOMIC_COMPARE_EXCHANGE_STRONG_H__
#define __CLC_OPENCL_ATOMIC_ATOMIC_COMPARE_EXCHANGE_STRONG_H__
+#include <clc/opencl/opencl-base.h>
+#include <clc/opencl/types.h>
+
#define __CLC_FUNCTION atomic_compare_exchange_strong
#define __CLC_COMPARE_EXCHANGE
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_compare_exchange_weak.h b/libclc/opencl/include/clc/opencl/atomic/atomic_compare_exchange_weak.h
index 7106c3e061d65..103d4f5504d71 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_compare_exchange_weak.h
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_compare_exchange_weak.h
@@ -9,6 +9,9 @@
#ifndef __CLC_OPENCL_ATOMIC_ATOMIC_COMPARE_EXCHANGE_WEAK_H__
#define __CLC_OPENCL_ATOMIC_ATOMIC_COMPARE_EXCHANGE_WEAK_H__
+#include <clc/opencl/opencl-base.h>
+#include <clc/opencl/types.h>
+
#define __CLC_FUNCTION atomic_compare_exchange_weak
#define __CLC_COMPARE_EXCHANGE
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_decl.inc b/libclc/opencl/include/clc/opencl/atomic/atomic_decl.inc
index 38d250f0693f7..a36e68bca86a2 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_decl.inc
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_decl.inc
@@ -25,32 +25,105 @@
#define __CLC_ATOMIC_GENTYPE __CLC_XCONCAT(atomic_, __CLC_GENTYPE)
+#define __CLC_FUNCTION_EXPLICIT __CLC_XCONCAT(__CLC_FUNCTION, _explicit)
+
+#ifdef __CLC_NO_VALUE_ARG
+#define __CLC_DECL_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, memory_order Order, \
+ memory_scope Scope);
+#elif defined(__CLC_RETURN_VOID)
+#define __CLC_DECL_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DECL void __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value, \
+ memory_order Order, memory_scope Scope);
+#elif defined(__CLC_COMPARE_EXCHANGE)
+#define __CLC_DECL_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DECL bool __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, \
+ ADDRSPACE __CLC_GENTYPE *Expected, __CLC_GENTYPE Desired, \
+ memory_order Order, memory_scope Scope);
+#else
+#define __CLC_DECL_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value, \
+ memory_order Order, memory_scope Scope);
+#endif
+
+__CLC_DECL_ATOMIC(global)
+__CLC_DECL_ATOMIC(local)
+#if _CLC_GENERIC_AS_SUPPORTED
+__CLC_DECL_ATOMIC()
+#endif
+
+#undef __CLC_DECL_ATOMIC
+
+#if defined(__opencl_c_atomic_scope_device)
+
+#ifdef __CLC_NO_VALUE_ARG
+#define __CLC_DECL_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, memory_order Order);
+#elif defined(__CLC_RETURN_VOID)
+#define __CLC_DECL_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DECL void __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value, \
+ memory_order Order);
+#elif defined(__CLC_COMPARE_EXCHANGE)
+#define __CLC_DECL_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DECL bool __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, \
+ ADDRSPACE __CLC_GENTYPE *Expected, __CLC_GENTYPE Desired, \
+ memory_order Success, memory_order Failure);
+#else
+#define __CLC_DECL_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value, \
+ memory_order Order);
+#endif
+
+__CLC_DECL_ATOMIC(global)
+__CLC_DECL_ATOMIC(local)
+#if _CLC_GENERIC_AS_SUPPORTED
+__CLC_DECL_ATOMIC()
+#endif
+
+#undef __CLC_DECL_ATOMIC
+
+#endif // defined(__opencl_c_atomic_scope_device)
+
+#if defined(__opencl_c_atomic_order_seq_cst) && \
+ defined(__opencl_c_atomic_scope_device)
+
#ifdef __CLC_NO_VALUE_ARG
-#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
+#define __CLC_DECL_ATOMIC(ADDRSPACE) \
_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION( \
volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr);
#elif defined(__CLC_RETURN_VOID)
-#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
+#define __CLC_DECL_ATOMIC(ADDRSPACE) \
_CLC_OVERLOAD _CLC_DECL void __CLC_FUNCTION( \
volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value);
#elif defined(__CLC_COMPARE_EXCHANGE)
-#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
- _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION( \
+#define __CLC_DECL_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DECL bool __CLC_FUNCTION( \
volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, \
ADDRSPACE __CLC_GENTYPE *Expected, __CLC_GENTYPE Desired);
#else
-#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
+#define __CLC_DECL_ATOMIC(ADDRSPACE) \
_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION( \
volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value);
#endif
-__CLC_DEFINE_ATOMIC(global)
-__CLC_DEFINE_ATOMIC(local)
+__CLC_DECL_ATOMIC(global)
+__CLC_DECL_ATOMIC(local)
#if _CLC_GENERIC_AS_SUPPORTED
-__CLC_DEFINE_ATOMIC()
+__CLC_DECL_ATOMIC()
#endif
-#undef __CLC_DEFINE_ATOMIC
+#undef __CLC_DECL_ATOMIC
+
+#endif // defined(__opencl_c_atomic_order_seq_cst) &&
+ // defined(__opencl_c_atomic_scope_device)
#endif // __CLC_HAVE_FP_ATOMIC || __CLC_HAVE_INT_ATOMIC
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_exchange.h b/libclc/opencl/include/clc/opencl/atomic/atomic_exchange.h
index 9d949825b58c3..d47691b373eb0 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_exchange.h
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_exchange.h
@@ -9,6 +9,9 @@
#ifndef __CLC_OPENCL_ATOMIC_ATOMIC_EXCHANGE_H__
#define __CLC_OPENCL_ATOMIC_ATOMIC_EXCHANGE_H__
+#include <clc/opencl/opencl-base.h>
+#include <clc/opencl/types.h>
+
#define __CLC_FUNCTION atomic_exchange
#define __CLC_BODY <clc/opencl/atomic/atomic_decl.inc>
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_add.h b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_add.h
index bae5a7a7e19bb..9ec29e1a553da 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_add.h
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_add.h
@@ -9,6 +9,9 @@
#ifndef __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_ADD_H__
#define __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_ADD_H__
+#include <clc/opencl/opencl-base.h>
+#include <clc/opencl/types.h>
+
#define __CLC_FUNCTION atomic_fetch_add
#define __CLC_BODY <clc/opencl/atomic/atomic_decl.inc>
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_and.h b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_and.h
index 9f9d2225f910e..fb51102911228 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_and.h
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_and.h
@@ -9,6 +9,9 @@
#ifndef __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_AND_H__
#define __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_AND_H__
+#include <clc/opencl/opencl-base.h>
+#include <clc/opencl/types.h>
+
#define __CLC_FUNCTION atomic_fetch_and
#define __CLC_BODY <clc/opencl/atomic/atomic_decl.inc>
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_max.h b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_max.h
index bef102dc82f48..8902e000a1024 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_max.h
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_max.h
@@ -9,6 +9,9 @@
#ifndef __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_MAX_H__
#define __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_MAX_H__
+#include <clc/opencl/opencl-base.h>
+#include <clc/opencl/types.h>
+
#define __CLC_FUNCTION atomic_fetch_max
#define __CLC_BODY <clc/opencl/atomic/atomic_decl.inc>
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_min.h b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_min.h
index d7e346dc44368..0b79b5d9f9d18 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_min.h
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_min.h
@@ -9,6 +9,9 @@
#ifndef __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_MIN_H__
#define __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_MIN_H__
+#include <clc/opencl/opencl-base.h>
+#include <clc/opencl/types.h>
+
#define __CLC_FUNCTION atomic_fetch_min
#define __CLC_BODY <clc/opencl/atomic/atomic_decl.inc>
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_or.h b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_or.h
index aa00982e15a56..5928e15cc3f53 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_or.h
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_or.h
@@ -9,6 +9,9 @@
#ifndef __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_OR_H__
#define __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_OR_H__
+#include <clc/opencl/opencl-base.h>
+#include <clc/opencl/types.h>
+
#define __CLC_FUNCTION atomic_fetch_or
#define __CLC_BODY <clc/opencl/atomic/atomic_decl.inc>
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_sub.h b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_sub.h
index 3d04ed7ba34f8..76e519f933121 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_sub.h
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_sub.h
@@ -9,6 +9,9 @@
#ifndef __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_SUB_H__
#define __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_SUB_H__
+#include <clc/opencl/opencl-base.h>
+#include <clc/opencl/types.h>
+
#define __CLC_FUNCTION atomic_fetch_sub
#define __CLC_BODY <clc/opencl/atomic/atomic_decl.inc>
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_xor.h b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_xor.h
index 2cdff08069025..c0befd44eae20 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_xor.h
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_fetch_xor.h
@@ -9,6 +9,9 @@
#ifndef __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_XOR_H__
#define __CLC_OPENCL_ATOMIC_ATOMIC_FETCH_XOR_H__
+#include <clc/opencl/opencl-base.h>
+#include <clc/opencl/types.h>
+
#define __CLC_FUNCTION atomic_fetch_xor
#define __CLC_BODY <clc/opencl/atomic/atomic_decl.inc>
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_load.h b/libclc/opencl/include/clc/opencl/atomic/atomic_load.h
index 7db259b136ec8..1aaa26bdecc9e 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_load.h
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_load.h
@@ -9,6 +9,9 @@
#ifndef __CLC_OPENCL_ATOMIC_ATOMIC_LOAD_H__
#define __CLC_OPENCL_ATOMIC_ATOMIC_LOAD_H__
+#include <clc/opencl/opencl-base.h>
+#include <clc/opencl/types.h>
+
#define __CLC_FUNCTION atomic_load
#define __CLC_NO_VALUE_ARG
diff --git a/libclc/opencl/include/clc/opencl/atomic/atomic_store.h b/libclc/opencl/include/clc/opencl/atomic/atomic_store.h
index b3cdfc6ffaeae..f754314918f82 100644
--- a/libclc/opencl/include/clc/opencl/atomic/atomic_store.h
+++ b/libclc/opencl/include/clc/opencl/atomic/atomic_store.h
@@ -9,6 +9,9 @@
#ifndef __CLC_OPENCL_ATOMIC_ATOMIC_STORE_H__
#define __CLC_OPENCL_ATOMIC_ATOMIC_STORE_H__
+#include <clc/opencl/opencl-base.h>
+#include <clc/opencl/types.h>
+
#define __CLC_FUNCTION atomic_store
#define __CLC_RETURN_VOID
diff --git a/libclc/opencl/include/clc/opencl/types.h b/libclc/opencl/include/clc/opencl/types.h
new file mode 100644
index 0000000000000..b1be88f21bdaa
--- /dev/null
+++ b/libclc/opencl/include/clc/opencl/types.h
@@ -0,0 +1,48 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef __CLC_OPENCL_TYPES_H__
+#define __CLC_OPENCL_TYPES_H__
+
+// Copied from clang/lib/Headers/opencl-c-base.h
+
+typedef enum memory_scope {
+ memory_scope_work_item = __OPENCL_MEMORY_SCOPE_WORK_ITEM,
+ memory_scope_work_group = __OPENCL_MEMORY_SCOPE_WORK_GROUP,
+ memory_scope_device = __OPENCL_MEMORY_SCOPE_DEVICE,
+#if defined(__opencl_c_atomic_scope_all_devices)
+ memory_scope_all_svm_devices = __OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES,
+#if (__OPENCL_C_VERSION__ >= CL_VERSION_3_0 || __OPENCL_CPP_VERSION__ >= 202100)
+ memory_scope_all_devices = memory_scope_all_svm_devices,
+#endif // (__OPENCL_C_VERSION__ >= CL_VERSION_3_0 || __OPENCL_CPP_VERSION__ >=
+ // 202100)
+#endif // defined(__opencl_c_atomic_scope_all_devices)
+/**
+ * Subgroups have different requirements on forward progress, so just test
+ * all the relevant macros.
+ * CL 3.0 sub-groups "they are not guaranteed to make independent forward
+ * progress" KHR subgroups "Subgroups within a workgroup are independent, make
+ * forward progress with respect to each other"
+ */
+#if defined(cl_intel_subgroups) || defined(cl_khr_subgroups) || \
+ defined(__opencl_c_subgroups)
+ memory_scope_sub_group = __OPENCL_MEMORY_SCOPE_SUB_GROUP
+#endif
+} memory_scope;
+
+typedef enum memory_order {
+ memory_order_relaxed = __ATOMIC_RELAXED,
+ memory_order_acquire = __ATOMIC_ACQUIRE,
+ memory_order_release = __ATOMIC_RELEASE,
+ memory_order_acq_rel = __ATOMIC_ACQ_REL,
+#if defined(__opencl_c_atomic_order_seq_cst)
+ memory_order_seq_cst = __ATOMIC_SEQ_CST
+#endif
+} memory_order;
+
+#endif // __CLC_OPENCL_TYPES_H__
diff --git a/libclc/opencl/include/clc/opencl/utils.h b/libclc/opencl/include/clc/opencl/utils.h
new file mode 100644
index 0000000000000..c677f82ebb67d
--- /dev/null
+++ b/libclc/opencl/include/clc/opencl/utils.h
@@ -0,0 +1,33 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef __CLC_OPENCL_UTILS_H__
+#define __CLC_OPENCL_UTILS_H__
+
+#include <clc/internal/clc.h>
+#include <clc/opencl/types.h>
+
+static _CLC_INLINE int __opencl_get_clang_memory_scope(memory_scope scope) {
+ switch (scope) {
+ case __OPENCL_MEMORY_SCOPE_WORK_ITEM:
+ return __MEMORY_SCOPE_SINGLE;
+#if defined(cl_intel_subgroups) || defined(cl_khr_subgroups) || \
+ defined(__opencl_c_subgroups)
+ case __OPENCL_MEMORY_SCOPE_SUB_GROUP:
+ return __MEMORY_SCOPE_WVFRNT;
+#endif
+ case __OPENCL_MEMORY_SCOPE_WORK_GROUP:
+ return __MEMORY_SCOPE_WRKGRP;
+ case __OPENCL_MEMORY_SCOPE_DEVICE:
+ return __MEMORY_SCOPE_DEVICE;
+ default:
+ return __MEMORY_SCOPE_SYSTEM;
+ }
+}
+
+#endif // __CLC_OPENCL_UTILS_H__
diff --git a/libclc/opencl/lib/generic/atomic/atomic_compare_exchange_strong.cl b/libclc/opencl/lib/generic/atomic/atomic_compare_exchange_strong.cl
index 2c1f07d8ca485..c0ca3f8f7d332 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_compare_exchange_strong.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_compare_exchange_strong.cl
@@ -6,11 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#if defined(__opencl_c_atomic_order_seq_cst) && \
- defined(__opencl_c_atomic_scope_device)
-
#include <clc/atomic/clc_atomic_compare_exchange.h>
#include <clc/opencl/atomic/atomic_compare_exchange_strong.h>
+#include <clc/opencl/utils.h>
#define __CLC_FUNCTION atomic_compare_exchange_strong
#define __CLC_COMPARE_EXCHANGE
@@ -20,6 +18,3 @@
#define __CLC_BODY <atomic_def.inc>
#include <clc/math/gentype.inc>
-
-#endif // defined(__opencl_c_atomic_order_seq_cst) &&
- // defined(__opencl_c_atomic_scope_device)
diff --git a/libclc/opencl/lib/generic/atomic/atomic_compare_exchange_weak.cl b/libclc/opencl/lib/generic/atomic/atomic_compare_exchange_weak.cl
index 69bdf37250f70..39768fb345714 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_compare_exchange_weak.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_compare_exchange_weak.cl
@@ -6,11 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#if defined(__opencl_c_atomic_order_seq_cst) && \
- defined(__opencl_c_atomic_scope_device)
-
#include <clc/atomic/clc_atomic_compare_exchange.h>
#include <clc/opencl/atomic/atomic_compare_exchange_weak.h>
+#include <clc/opencl/utils.h>
#define __CLC_FUNCTION atomic_compare_exchange_weak
#define __CLC_COMPARE_EXCHANGE
@@ -20,6 +18,3 @@
#define __CLC_BODY <atomic_def.inc>
#include <clc/math/gentype.inc>
-
-#endif // defined(__opencl_c_atomic_order_seq_cst) &&
- // defined(__opencl_c_atomic_scope_device)
diff --git a/libclc/opencl/lib/generic/atomic/atomic_def.inc b/libclc/opencl/lib/generic/atomic/atomic_def.inc
index a4ccab5990888..99fb778a8b342 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_def.inc
+++ b/libclc/opencl/lib/generic/atomic/atomic_def.inc
@@ -12,7 +12,8 @@
defined(cl_khr_int64_extended_atomics))
#define __CLC_HAVE_64_ATOMIC
#endif
-#if defined(__CLC_FPSIZE) && (__CLC_FPSIZE < 64 || defined(__CLC_HAVE_64_ATOMIC)
+#if defined(__CLC_FPSIZE) && \
+ (__CLC_FPSIZE < 64 || defined(__CLC_HAVE_64_ATOMIC))
#define __CLC_HAVE_FP_ATOMIC
#endif
#if defined(__CLC_GENSIZE) && \
@@ -24,41 +25,134 @@
#define __CLC_ATOMIC_GENTYPE __CLC_XCONCAT(atomic_, __CLC_GENTYPE)
+#define __CLC_FUNCTION_EXPLICIT __CLC_XCONCAT(__CLC_FUNCTION, _explicit)
+
#ifdef __CLC_NO_VALUE_ARG
#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
- _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \
- volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr) { \
- return __CLC_IMPL_FUNCTION((volatile ADDRSPACE __CLC_GENTYPE *)Ptr, \
- __ATOMIC_SEQ_CST, __MEMORY_SCOPE_DEVICE); \
+ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, memory_order Order, \
+ memory_scope Scope) { \
+ return __CLC_IMPL_FUNCTION((volatile ADDRSPACE __CLC_GENTYPE *)Ptr, Order, \
+ __opencl_get_clang_memory_scope(Scope)); \
}
#elif defined(__CLC_RETURN_VOID)
#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
- _CLC_OVERLOAD _CLC_DEF void __CLC_FUNCTION( \
- volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value) { \
- __CLC_IMPL_FUNCTION((volatile ADDRSPACE __CLC_GENTYPE *)Ptr, Value, \
- __ATOMIC_SEQ_CST, __MEMORY_SCOPE_DEVICE); \
+ _CLC_OVERLOAD _CLC_DEF void __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value, \
+ memory_order Order, memory_scope Scope) { \
+ __CLC_IMPL_FUNCTION((volatile ADDRSPACE __CLC_GENTYPE *)Ptr, Value, Order, \
+ __opencl_get_clang_memory_scope(Scope)); \
}
#elif defined(__CLC_COMPARE_EXCHANGE)
#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
- _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \
+ _CLC_OVERLOAD _CLC_DEF bool __CLC_FUNCTION_EXPLICIT( \
volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, \
- ADDRSPACE __CLC_GENTYPE *Expected, __CLC_GENTYPE Desired) { \
+ ADDRSPACE __CLC_GENTYPE *Expected, __CLC_GENTYPE Desired, \
+ memory_order Success, memory_order Failure, memory_scope Scope) { \
__CLC_GENTYPE Comparator = *Expected; \
__CLC_GENTYPE RetValue = __clc_atomic_compare_exchange( \
- (volatile ADDRSPACE __CLC_GENTYPE *)Ptr, Comparator, Desired, \
- __ATOMIC_SEQ_CST, __ATOMIC_RELAXED, __MEMORY_SCOPE_DEVICE); \
+ (volatile ADDRSPACE __CLC_GENTYPE *)Ptr, Comparator, Desired, Success, \
+ Failure, __opencl_get_clang_memory_scope(Scope)); \
if (Comparator != RetValue) { \
*Expected = RetValue; \
- return true; \
+ return false; \
} \
- return false; \
+ return true; \
+ }
+#else
+#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value, \
+ memory_order Order, memory_scope Scope) { \
+ return __CLC_IMPL_FUNCTION((volatile ADDRSPACE __CLC_GENTYPE *)Ptr, Value, \
+ Order, __opencl_get_clang_memory_scope(Scope)); \
+ }
+#endif
+
+__CLC_DEFINE_ATOMIC(global)
+__CLC_DEFINE_ATOMIC(local)
+#if _CLC_GENERIC_AS_SUPPORTED
+__CLC_DEFINE_ATOMIC()
+#endif
+
+#undef __CLC_DEFINE_ATOMIC
+
+#if defined(__opencl_c_atomic_scope_device)
+
+#ifdef __CLC_NO_VALUE_ARG
+#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, memory_order Order) { \
+ return __CLC_FUNCTION_EXPLICIT(Ptr, Order, __OPENCL_MEMORY_SCOPE_DEVICE); \
+ }
+#elif defined(__CLC_RETURN_VOID)
+#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DEF void __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value, \
+ memory_order Order) { \
+ __CLC_FUNCTION_EXPLICIT(Ptr, Value, Order, __OPENCL_MEMORY_SCOPE_DEVICE); \
+ }
+#elif defined(__CLC_COMPARE_EXCHANGE)
+#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DEF bool __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, \
+ ADDRSPACE __CLC_GENTYPE *Expected, __CLC_GENTYPE Desired, \
+ memory_order Success, memory_order Failure) { \
+ return __CLC_FUNCTION_EXPLICIT(Ptr, Expected, Desired, Success, Failure, \
+ __OPENCL_MEMORY_SCOPE_DEVICE); \
+ }
+#else
+#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION_EXPLICIT( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value, \
+ memory_order Order) { \
+ return __CLC_FUNCTION_EXPLICIT(Ptr, Value, Order, \
+ __OPENCL_MEMORY_SCOPE_DEVICE); \
+ }
+#endif
+
+__CLC_DEFINE_ATOMIC(global)
+__CLC_DEFINE_ATOMIC(local)
+#if _CLC_GENERIC_AS_SUPPORTED
+__CLC_DEFINE_ATOMIC()
+#endif
+
+#undef __CLC_DEFINE_ATOMIC
+
+#endif // defined(__opencl_c_atomic_scope_device)
+
+#if defined(__opencl_c_atomic_order_seq_cst) && \
+ defined(__opencl_c_atomic_scope_device)
+
+#ifdef __CLC_NO_VALUE_ARG
+#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr) { \
+ return __CLC_FUNCTION_EXPLICIT(Ptr, __ATOMIC_SEQ_CST, \
+ __OPENCL_MEMORY_SCOPE_DEVICE); \
+ }
+#elif defined(__CLC_RETURN_VOID)
+#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DEF void __CLC_FUNCTION( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value) { \
+ __CLC_FUNCTION_EXPLICIT(Ptr, Value, __ATOMIC_SEQ_CST, \
+ __OPENCL_MEMORY_SCOPE_DEVICE); \
+ }
+#elif defined(__CLC_COMPARE_EXCHANGE)
+#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
+ _CLC_OVERLOAD _CLC_DEF bool __CLC_FUNCTION( \
+ volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, \
+ ADDRSPACE __CLC_GENTYPE *Expected, __CLC_GENTYPE Desired) { \
+ return __CLC_FUNCTION_EXPLICIT(Ptr, Expected, Desired, __ATOMIC_SEQ_CST, \
+ __ATOMIC_SEQ_CST, \
+ __OPENCL_MEMORY_SCOPE_DEVICE); \
}
#else
#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \
_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \
volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value) { \
- return __CLC_IMPL_FUNCTION((volatile ADDRSPACE __CLC_GENTYPE *)Ptr, Value, \
- __ATOMIC_SEQ_CST, __MEMORY_SCOPE_DEVICE); \
+ return __CLC_FUNCTION_EXPLICIT(Ptr, Value, __ATOMIC_SEQ_CST, \
+ __OPENCL_MEMORY_SCOPE_DEVICE); \
}
#endif
@@ -70,6 +164,9 @@ __CLC_DEFINE_ATOMIC()
#undef __CLC_DEFINE_ATOMIC
+#endif // defined(__opencl_c_atomic_order_seq_cst) &&
+ // defined(__opencl_c_atomic_scope_device)
+
#endif // __CLC_HAVE_FP_ATOMIC || __CLC_HAVE_INT_ATOMIC
#undef __CLC_HAVE_INT_ATOMIC
diff --git a/libclc/opencl/lib/generic/atomic/atomic_exchange.cl b/libclc/opencl/lib/generic/atomic/atomic_exchange.cl
index 5f7e2fa593e3f..f7568f6ace38c 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_exchange.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_exchange.cl
@@ -6,11 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#if defined(__opencl_c_atomic_order_seq_cst) && \
- defined(__opencl_c_atomic_scope_device)
-
#include <clc/atomic/clc_atomic_exchange.h>
#include <clc/opencl/atomic/atomic_exchange.h>
+#include <clc/opencl/utils.h>
#define __CLC_FUNCTION atomic_exchange
#define __CLC_IMPL_FUNCTION __clc_atomic_exchange
@@ -20,6 +18,3 @@
#define __CLC_BODY <atomic_def.inc>
#include <clc/math/gentype.inc>
-
-#endif // defined(__opencl_c_atomic_order_seq_cst) &&
- // defined(__opencl_c_atomic_scope_device)
diff --git a/libclc/opencl/lib/generic/atomic/atomic_fetch_add.cl b/libclc/opencl/lib/generic/atomic/atomic_fetch_add.cl
index 0362ff89d1d78..d27cc7120ccce 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_fetch_add.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_fetch_add.cl
@@ -6,11 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#if defined(__opencl_c_atomic_order_seq_cst) && \
- defined(__opencl_c_atomic_scope_device)
-
#include <clc/atomic/clc_atomic_fetch_add.h>
#include <clc/opencl/atomic/atomic_fetch_add.h>
+#include <clc/opencl/utils.h>
#define __CLC_FUNCTION atomic_fetch_add
#define __CLC_IMPL_FUNCTION __clc_atomic_fetch_add
@@ -20,6 +18,3 @@
#define __CLC_BODY <atomic_def.inc>
#include <clc/math/gentype.inc>
-
-#endif // defined(__opencl_c_atomic_order_seq_cst) &&
- // defined(__opencl_c_atomic_scope_device)
diff --git a/libclc/opencl/lib/generic/atomic/atomic_fetch_and.cl b/libclc/opencl/lib/generic/atomic/atomic_fetch_and.cl
index a1796f20c6e44..b8531722911cf 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_fetch_and.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_fetch_and.cl
@@ -6,17 +6,12 @@
//
//===----------------------------------------------------------------------===//
-#if defined(__opencl_c_atomic_order_seq_cst) && \
- defined(__opencl_c_atomic_scope_device)
-
#include <clc/atomic/clc_atomic_fetch_and.h>
#include <clc/opencl/atomic/atomic_fetch_and.h>
+#include <clc/opencl/utils.h>
#define __CLC_FUNCTION atomic_fetch_and
#define __CLC_IMPL_FUNCTION __clc_atomic_fetch_and
#define __CLC_BODY <atomic_def.inc>
#include <clc/integer/gentype.inc>
-
-#endif // defined(__opencl_c_atomic_order_seq_cst) &&
- // defined(__opencl_c_atomic_scope_device)
diff --git a/libclc/opencl/lib/generic/atomic/atomic_fetch_max.cl b/libclc/opencl/lib/generic/atomic/atomic_fetch_max.cl
index 03b5d1d8ae7bd..b644ca336437a 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_fetch_max.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_fetch_max.cl
@@ -6,11 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#if defined(__opencl_c_atomic_order_seq_cst) && \
- defined(__opencl_c_atomic_scope_device)
-
#include <clc/atomic/clc_atomic_fetch_max.h>
#include <clc/opencl/atomic/atomic_fetch_max.h>
+#include <clc/opencl/utils.h>
#define __CLC_FUNCTION atomic_fetch_max
#define __CLC_IMPL_FUNCTION __clc_atomic_fetch_max
@@ -20,6 +18,3 @@
#define __CLC_BODY <atomic_def.inc>
#include <clc/math/gentype.inc>
-
-#endif // defined(__opencl_c_atomic_order_seq_cst) &&
- // defined(__opencl_c_atomic_scope_device)
diff --git a/libclc/opencl/lib/generic/atomic/atomic_fetch_min.cl b/libclc/opencl/lib/generic/atomic/atomic_fetch_min.cl
index 60ffeff04cc6a..f24fcf329b6f2 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_fetch_min.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_fetch_min.cl
@@ -6,11 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#if defined(__opencl_c_atomic_order_seq_cst) && \
- defined(__opencl_c_atomic_scope_device)
-
#include <clc/atomic/clc_atomic_fetch_min.h>
#include <clc/opencl/atomic/atomic_fetch_min.h>
+#include <clc/opencl/utils.h>
#define __CLC_FUNCTION atomic_fetch_min
#define __CLC_IMPL_FUNCTION __clc_atomic_fetch_min
@@ -20,6 +18,3 @@
#define __CLC_BODY <atomic_def.inc>
#include <clc/math/gentype.inc>
-
-#endif // defined(__opencl_c_atomic_order_seq_cst) &&
- // defined(__opencl_c_atomic_scope_device)
diff --git a/libclc/opencl/lib/generic/atomic/atomic_fetch_or.cl b/libclc/opencl/lib/generic/atomic/atomic_fetch_or.cl
index 8f4100bb150e3..1f6fe4cac090a 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_fetch_or.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_fetch_or.cl
@@ -6,17 +6,12 @@
//
//===----------------------------------------------------------------------===//
-#if defined(__opencl_c_atomic_order_seq_cst) && \
- defined(__opencl_c_atomic_scope_device)
-
#include <clc/atomic/clc_atomic_fetch_or.h>
#include <clc/opencl/atomic/atomic_fetch_or.h>
+#include <clc/opencl/utils.h>
#define __CLC_FUNCTION atomic_fetch_or
#define __CLC_IMPL_FUNCTION __clc_atomic_fetch_or
#define __CLC_BODY <atomic_def.inc>
#include <clc/integer/gentype.inc>
-
-#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 ecb5b4315ee86..94323a2c0fcb6 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_fetch_sub.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_fetch_sub.cl
@@ -6,11 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#if defined(__opencl_c_atomic_order_seq_cst) && \
- defined(__opencl_c_atomic_scope_device)
-
#include <clc/atomic/clc_atomic_fetch_sub.h>
#include <clc/opencl/atomic/atomic_fetch_sub.h>
+#include <clc/opencl/utils.h>
#define __CLC_FUNCTION atomic_fetch_sub
#define __CLC_IMPL_FUNCTION __clc_atomic_fetch_sub
@@ -20,6 +18,3 @@
#define __CLC_BODY <atomic_def.inc>
#include <clc/math/gentype.inc>
-
-#endif // defined(__opencl_c_atomic_order_seq_cst) &&
- // defined(__opencl_c_atomic_scope_device)
diff --git a/libclc/opencl/lib/generic/atomic/atomic_fetch_xor.cl b/libclc/opencl/lib/generic/atomic/atomic_fetch_xor.cl
index c49a55820c8d4..13e1db1124f9a 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_fetch_xor.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_fetch_xor.cl
@@ -6,17 +6,12 @@
//
//===----------------------------------------------------------------------===//
-#if defined(__opencl_c_atomic_order_seq_cst) && \
- defined(__opencl_c_atomic_scope_device)
-
#include <clc/atomic/clc_atomic_fetch_xor.h>
#include <clc/opencl/atomic/atomic_fetch_xor.h>
+#include <clc/opencl/utils.h>
#define __CLC_FUNCTION atomic_fetch_xor
#define __CLC_IMPL_FUNCTION __clc_atomic_fetch_xor
#define __CLC_BODY <atomic_def.inc>
#include <clc/integer/gentype.inc>
-
-#endif // defined(__opencl_c_atomic_order_seq_cst) &&
- // defined(__opencl_c_atomic_scope_device)
diff --git a/libclc/opencl/lib/generic/atomic/atomic_load.cl b/libclc/opencl/lib/generic/atomic/atomic_load.cl
index e904330be0064..1b93ce84ea863 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_load.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_load.cl
@@ -6,11 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#if defined(__opencl_c_atomic_order_seq_cst) && \
- defined(__opencl_c_atomic_scope_device)
-
#include <clc/atomic/clc_atomic_load.h>
#include <clc/opencl/atomic/atomic_load.h>
+#include <clc/opencl/utils.h>
#define __CLC_FUNCTION atomic_load
#define __CLC_IMPL_FUNCTION __clc_atomic_load
@@ -21,6 +19,3 @@
#define __CLC_BODY <atomic_def.inc>
#include <clc/math/gentype.inc>
-
-#endif // defined(__opencl_c_atomic_order_seq_cst) &&
- // defined(__opencl_c_atomic_scope_device)
diff --git a/libclc/opencl/lib/generic/atomic/atomic_store.cl b/libclc/opencl/lib/generic/atomic/atomic_store.cl
index 584e29ef99a5f..fcaa4d3128f7d 100644
--- a/libclc/opencl/lib/generic/atomic/atomic_store.cl
+++ b/libclc/opencl/lib/generic/atomic/atomic_store.cl
@@ -6,11 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#if defined(__opencl_c_atomic_order_seq_cst) && \
- defined(__opencl_c_atomic_scope_device)
-
#include <clc/atomic/clc_atomic_store.h>
#include <clc/opencl/atomic/atomic_store.h>
+#include <clc/opencl/utils.h>
#define __CLC_FUNCTION atomic_store
#define __CLC_IMPL_FUNCTION __clc_atomic_store
@@ -21,6 +19,3 @@
#define __CLC_BODY <atomic_def.inc>
#include <clc/math/gentype.inc>
-
-#endif // defined(__opencl_c_atomic_order_seq_cst) &&
- // defined(__opencl_c_atomic_scope_device)
More information about the cfe-commits
mailing list