[clang] [Clang] Fix wait_for_event argument address space with -fdeclare-opencl-builtins (PR #134598)
Juan Manuel Martinez CaamaƱo via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 7 01:23:18 PDT 2025
https://github.com/jmmartinez created https://github.com/llvm/llvm-project/pull/134598
The pointer argument for `wait_for_event(int, event_t*)` should take the default address space: generic if available, otherwise private.
Before this patch it would always be generic with `-fdeclare-opencl-builtins`. This was inconsistent with the behavior when opencl-c.h is included.
>From b56d76eea6aec2c44549f166229c6cc26565be67 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juan=20Manuel=20Martinez=20Caama=C3=B1o?= <juamarti at amd.com>
Date: Wed, 2 Apr 2025 16:23:53 +0200
Subject: [PATCH] [Clang] Fix wait_for_event argument address space with
-fdeclare-opencl-builtins
The pointer argument of the wait_for_event builtin should take the
default address space: generic if available, otherwise private.
---
clang/lib/Sema/OpenCLBuiltins.td | 18 +++++++++++++++---
.../CodeGenOpenCL/fdeclare-opencl-builtins.cl | 9 +++++++++
2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/clang/lib/Sema/OpenCLBuiltins.td b/clang/lib/Sema/OpenCLBuiltins.td
index 4da61429fcce7..528b700a275e0 100644
--- a/clang/lib/Sema/OpenCLBuiltins.td
+++ b/clang/lib/Sema/OpenCLBuiltins.td
@@ -958,13 +958,25 @@ foreach name = ["async_work_group_strided_copy"] in {
def : Builtin<name, [Event, PointerType<AGenTypeN, LocalAS>, PointerType<ConstType<AGenTypeN>, GlobalAS>, Size, Size, Event]>;
def : Builtin<name, [Event, PointerType<AGenTypeN, GlobalAS>, PointerType<ConstType<AGenTypeN>, LocalAS>, Size, Size, Event]>;
}
-foreach name = ["wait_group_events"] in {
- def : Builtin<name, [Void, Int, PointerType<Event, GenericAS>]>;
-}
foreach name = ["prefetch"] in {
def : Builtin<name, [Void, PointerType<ConstType<AGenTypeN>, GlobalAS>, Size]>;
}
+// The wait_group_events is declared with an argument of type event_t*.
+// The address-space of the pointer parameter is different if the generic address space is available.
+multiclass BuiltinWithDefaultPointerArg<AddressSpace AS> {
+ foreach name = ["wait_group_events"] in {
+ def : Builtin<name, [Void, Int, PointerType<Event, AS>]>;
+ }
+}
+
+let Extension = FuncExtOpenCLCNamedAddressSpaceBuiltins in {
+ defm : BuiltinWithDefaultPointerArg<PrivateAS>;
+}
+let Extension = FuncExtOpenCLCGenericAddressSpace in {
+ defm : BuiltinWithDefaultPointerArg<GenericAS>;
+}
+
//--------------------------------------------------------------------
// OpenCL v2.0 s6.13.11 - Atomics Functions.
// Functions that use memory_order and cl_mem_fence_flags enums are not
diff --git a/clang/test/CodeGenOpenCL/fdeclare-opencl-builtins.cl b/clang/test/CodeGenOpenCL/fdeclare-opencl-builtins.cl
index ac3bff9dbde27..8bd1db5d06819 100644
--- a/clang/test/CodeGenOpenCL/fdeclare-opencl-builtins.cl
+++ b/clang/test/CodeGenOpenCL/fdeclare-opencl-builtins.cl
@@ -48,6 +48,15 @@ void test_generic_optionality(float a, float *b) {
float res = fract(a, b);
}
+// Test that the correct builtin is called depending on the generic address
+// space feature availability. If not available, the __private version is called
+// CHECK-LABEL: @test_wait_group_events
+// CHECK-GAS: call spir_func void @_Z17wait_group_eventsiPU3AS49ocl_event
+// CHECK-NOGAS: call spir_func void @_Z17wait_group_eventsiP9ocl_event
+void test_wait_group_events(int i, event_t *e) {
+ wait_group_events(i, e);
+}
+
// CHECK: attributes [[ATTR_CONST]] =
// CHECK-SAME: memory(none)
// CHECK: attributes [[ATTR_PURE]] =
More information about the cfe-commits
mailing list