From beb75c7086c7ce0374efcdd4466250c04030e1a3 Mon Sep 17 00:00:00 2001 From: Wenju He Date: Wed, 16 Jul 2025 02:27:44 +0200 Subject: [PATCH] [SPIR] Set MaxAtomicInlineWidth minimum size to 32 for spir32 and 64 for spir64 Set MaxAtomicInlineWidth the same way as SPIR-V targets in 3cfd0c0d3697. This PR fixes build warning in scoped atomic built-in in #146814: `warning: large atomic operation may incur significant performance penalty` --- clang/lib/Basic/Targets/SPIR.h | 6 ++++++ clang/test/CodeGenOpenCL/scoped-atomic.cl | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 clang/test/CodeGenOpenCL/scoped-atomic.cl diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h index 1abf798d93129..c13b286cd7916 100644 --- a/clang/lib/Basic/Targets/SPIR.h +++ b/clang/lib/Basic/Targets/SPIR.h @@ -264,6 +264,9 @@ class LLVM_LIBRARY_VISIBILITY SPIR32TargetInfo : public SPIRTargetInfo { PointerWidth = PointerAlign = 32; SizeType = TargetInfo::UnsignedInt; PtrDiffType = IntPtrType = TargetInfo::SignedInt; + // SPIR32 has support for atomic ops if atomic extension is enabled. + // Take the maximum because it's possible the Host supports wider types. + MaxAtomicInlineWidth = std::max(MaxAtomicInlineWidth, 32); resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-" "v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"); } @@ -281,6 +284,9 @@ class LLVM_LIBRARY_VISIBILITY SPIR64TargetInfo : public SPIRTargetInfo { PointerWidth = PointerAlign = 64; SizeType = TargetInfo::UnsignedLong; PtrDiffType = IntPtrType = TargetInfo::SignedLong; + // SPIR64 has support for atomic ops if atomic extension is enabled. + // Take the maximum because it's possible the Host supports wider types. + MaxAtomicInlineWidth = std::max(MaxAtomicInlineWidth, 64); resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-" "v96:128-v192:256-v256:256-v512:512-v1024:1024-G1"); } diff --git a/clang/test/CodeGenOpenCL/scoped-atomic.cl b/clang/test/CodeGenOpenCL/scoped-atomic.cl new file mode 100644 index 0000000000000..ec7e936684a3a --- /dev/null +++ b/clang/test/CodeGenOpenCL/scoped-atomic.cl @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -triple spir-unknown-unknown -verify +// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -o - -triple spir64-unknown-unknown -verify + +// expected-no-diagnostics + +int fi1a(int *i) { + int v; + __scoped_atomic_load(i, &v, __ATOMIC_RELAXED, __MEMORY_SCOPE_DEVICE); + return v; +} + +#ifdef __SPIR64__ +long fl1a(long *i) { + long v; + __scoped_atomic_load(i, &v, __ATOMIC_RELAXED, __MEMORY_SCOPE_DEVICE); + return v; +} +#endif