https://github.com/frasercrmck updated 
https://github.com/llvm/llvm-project/pull/137183

>From fcae18dd0b4af6f7517ba8eda368374fa693a5f9 Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fra...@codeplay.com>
Date: Thu, 24 Apr 2025 11:24:30 +0100
Subject: [PATCH 1/6] [libclc] Support the generic address space

This commit provides definitions of builtins with the generic address
space.

It is assumed that all current libclc targets can support the generic
address space.

One concept to consider is the difference between supporting the generic
address space from the user's perspective, and the requirement for
libclc as a compiler implementation detail to define separate generic
address space builtins. In practice a target (like NVPTX) might
notionally support the generic address space, but it's mapped to the
same LLVM target address space as the private address space. Therefore
libclc may not define both private and generic overloads of the same
builtin. We track these two concepts separately, and make the assumption
that if the generic address space does clash with another, it's with the
private one.
---
 libclc/CMakeLists.txt                         | 25 +++++++++++++++++++
 libclc/clc/include/clc/clcfunc.h              | 16 ++++++++++++
 .../clc/math/unary_decl_with_int_ptr.inc      |  4 +++
 .../include/clc/math/unary_decl_with_ptr.inc  |  5 ++++
 .../clc/math/unary_def_with_int_ptr.inc       |  7 ++++++
 .../include/clc/math/unary_def_with_ptr.inc   |  7 ++++++
 libclc/clc/lib/generic/math/clc_frexp.cl      |  7 ++++++
 libclc/clc/lib/generic/math/clc_modf.inc      |  4 +++
 libclc/clc/lib/generic/math/clc_sincos.inc    |  3 +++
 .../opencl/include/clc/opencl/math/remquo.h   |  7 ++++++
 .../opencl/include/clc/opencl/shared/vload.h  | 16 +++++++++++-
 .../opencl/include/clc/opencl/shared/vstore.h | 16 +++++++++++-
 .../opencl/lib/clspv/shared/vstore_half.inc   |  6 +++++
 libclc/opencl/lib/generic/math/remquo.inc     |  7 ++++++
 libclc/opencl/lib/generic/shared/vload.cl     | 11 +++++++-
 .../opencl/lib/generic/shared/vload_half.inc  |  6 +++++
 libclc/opencl/lib/generic/shared/vstore.cl    | 11 +++++++-
 .../opencl/lib/generic/shared/vstore_half.inc |  7 ++++++
 18 files changed, 161 insertions(+), 4 deletions(-)

diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index 70b11df3b3142..b8eddb92f3bf5 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -420,12 +420,37 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
       -D${CLC_TARGET_DEFINE}
       # All libclc builtin libraries see CLC headers
       -I${CMAKE_CURRENT_SOURCE_DIR}/clc/include
+      # Error on undefined macros
+      -Werror=undef
     )
 
     if( NOT "${cpu}" STREQUAL "" )
       list( APPEND build_flags -mcpu=${cpu} )
     endif()
 
+    # Generic address space support.
+    # Note: when declaring builtins, we must consider that even if a target
+    # formally/nominally supports the generic address space, in practice that
+    # target may map it to the same target address space as another address
+    # space (often the private one). In such cases we must be careful not to
+    # multiply-define a builtin in a single target address space, as it would
+    # result in a mangling clash.
+    # For this reason we must consider the target support of the generic
+    # address space separately from the *implementation* decision about whether
+    # to declare certain builtins in that address space.
+    # FIXME: Shouldn't clang automatically enable this extension based on the
+    # target?
+    list( APPEND build_flags "-Xclang" 
"-cl-ext=+__opencl_c_generic_address_space" )
+    # Note: we assume that if there is no distinct generic address space, it
+    # maps to the private address space.
+    set ( has_distinct_generic_addrspace TRUE )
+    if( ARCH STREQUAL nvptx OR ARCH STREQUAL nvptx64 )
+      set ( has_distinct_generic_addrspace FALSE )
+    endif()
+    if( has_distinct_generic_addrspace )
+      list( APPEND build_flags -D__CLC_DISTINCT_GENERIC_ADDRSPACE__ )
+    endif()
+
     set( clc_build_flags ${build_flags} -DCLC_INTERNAL )
 
     add_libclc_builtin_set(
diff --git a/libclc/clc/include/clc/clcfunc.h b/libclc/clc/include/clc/clcfunc.h
index 7c5b31e77a024..e333fe863f990 100644
--- a/libclc/clc/include/clc/clcfunc.h
+++ b/libclc/clc/include/clc/clcfunc.h
@@ -23,4 +23,20 @@
 #define _CLC_DEF __attribute__((always_inline))
 #endif
 
+#if __OPENCL_C_VERSION__ == CL_VERSION_2_0 ||                                  
\
+    (__OPENCL_C_VERSION__ >= CL_VERSION_3_0 &&                                 
\
+     defined(__opencl_c_generic_address_space))
+#define _CLC_GENERIC_AS_SUPPORTED 1
+// Note that we hard-code the assumption that a non-distinct address space 
means
+// that the target maps the generic address space to the private address space.
+#ifdef __CLC_DISTINCT_GENERIC_ADDRSPACE__
+#define _CLC_DISTINCT_GENERIC_AS_SUPPORTED 1
+#else
+#define _CLC_DISTINCT_GENERIC_AS_SUPPORTED 0
+#endif
+#else
+#define _CLC_GENERIC_AS_SUPPORTED 0
+#define _CLC_DISTINCT_GENERIC_AS_SUPPORTED 0
+#endif
+
 #endif // __CLC_CLCFUNC_H_
diff --git a/libclc/clc/include/clc/math/unary_decl_with_int_ptr.inc 
b/libclc/clc/include/clc/math/unary_decl_with_int_ptr.inc
index a492c99f6ba4c..11884d5604b55 100644
--- a/libclc/clc/include/clc/math/unary_decl_with_int_ptr.inc
+++ b/libclc/clc/include/clc/math/unary_decl_with_int_ptr.inc
@@ -12,3 +12,7 @@ _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE 
__CLC_FUNCTION(__CLC_GENTYPE x,
                                                      local __CLC_INTN *iptr);
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE x,
                                                      private __CLC_INTN *iptr);
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE x,
+                                                     generic __CLC_INTN *iptr);
+#endif
diff --git a/libclc/clc/include/clc/math/unary_decl_with_ptr.inc 
b/libclc/clc/include/clc/math/unary_decl_with_ptr.inc
index 7372b94393ec3..308cecdb2541f 100644
--- a/libclc/clc/include/clc/math/unary_decl_with_ptr.inc
+++ b/libclc/clc/include/clc/math/unary_decl_with_ptr.inc
@@ -12,3 +12,8 @@ _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE 
__CLC_FUNCTION(__CLC_GENTYPE x,
                                                      local __CLC_GENTYPE *ptr);
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE
 __CLC_FUNCTION(__CLC_GENTYPE x, private __CLC_GENTYPE *ptr);
+
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE
+__CLC_FUNCTION(__CLC_GENTYPE x, generic __CLC_GENTYPE *ptr);
+#endif
diff --git a/libclc/clc/include/clc/math/unary_def_with_int_ptr.inc 
b/libclc/clc/include/clc/math/unary_def_with_int_ptr.inc
index 2a1b235d97767..464c6ffc7c8ca 100644
--- a/libclc/clc/include/clc/math/unary_def_with_int_ptr.inc
+++ b/libclc/clc/include/clc/math/unary_def_with_int_ptr.inc
@@ -26,3 +26,10 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE FUNCTION(__CLC_GENTYPE 
x,
                                               local __CLC_INTN *iptr) {
   return __CLC_FUNCTION(FUNCTION)(x, iptr);
 }
+
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE FUNCTION(__CLC_GENTYPE x,
+                                              generic __CLC_INTN *iptr) {
+  return __CLC_FUNCTION(FUNCTION)(x, iptr);
+}
+#endif
diff --git a/libclc/clc/include/clc/math/unary_def_with_ptr.inc 
b/libclc/clc/include/clc/math/unary_def_with_ptr.inc
index 4479b9df0de08..fecec80dde834 100644
--- a/libclc/clc/include/clc/math/unary_def_with_ptr.inc
+++ b/libclc/clc/include/clc/math/unary_def_with_ptr.inc
@@ -26,3 +26,10 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE FUNCTION(__CLC_GENTYPE 
x,
                                               local __CLC_GENTYPE *ptr) {
   return __CLC_FUNCTION(FUNCTION)(x, ptr);
 }
+
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE FUNCTION(__CLC_GENTYPE x,
+                                              generic __CLC_GENTYPE *ptr) {
+  return __CLC_FUNCTION(FUNCTION)(x, ptr);
+}
+#endif
diff --git a/libclc/clc/lib/generic/math/clc_frexp.cl 
b/libclc/clc/lib/generic/math/clc_frexp.cl
index 7a7b3f654ced6..4a975918daf51 100644
--- a/libclc/clc/lib/generic/math/clc_frexp.cl
+++ b/libclc/clc/lib/generic/math/clc_frexp.cl
@@ -28,3 +28,10 @@
 #define __CLC_ADDRESS_SPACE local
 #include <clc/math/gentype.inc>
 #undef __CLC_ADDRESS_SPACE
+
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#define __CLC_BODY <clc_frexp.inc>
+#define __CLC_ADDRESS_SPACE generic
+#include <clc/math/gentype.inc>
+#undef __CLC_ADDRESS_SPACE
+#endif
diff --git a/libclc/clc/lib/generic/math/clc_modf.inc 
b/libclc/clc/lib/generic/math/clc_modf.inc
index 9e9b1cfb6d743..962d859ce9f68 100644
--- a/libclc/clc/lib/generic/math/clc_modf.inc
+++ b/libclc/clc/lib/generic/math/clc_modf.inc
@@ -23,4 +23,8 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_modf(__CLC_GENTYPE 
x,
 CLC_MODF_DEF(local);
 CLC_MODF_DEF(global);
 
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+CLC_MODF_DEF(generic);
+#endif
+
 #undef CLC_MODF_DEF
diff --git a/libclc/clc/lib/generic/math/clc_sincos.inc 
b/libclc/clc/lib/generic/math/clc_sincos.inc
index 1e21b7549e448..da5059bfe771c 100644
--- a/libclc/clc/lib/generic/math/clc_sincos.inc
+++ b/libclc/clc/lib/generic/math/clc_sincos.inc
@@ -15,5 +15,8 @@
 __CLC_DECLARE_SINCOS(global, __CLC_GENTYPE)
 __CLC_DECLARE_SINCOS(local, __CLC_GENTYPE)
 __CLC_DECLARE_SINCOS(private, __CLC_GENTYPE)
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+__CLC_DECLARE_SINCOS(generic, __CLC_GENTYPE)
+#endif
 
 #undef __CLC_DECLARE_SINCOS
diff --git a/libclc/opencl/include/clc/opencl/math/remquo.h 
b/libclc/opencl/include/clc/opencl/math/remquo.h
index cea45079d38c7..74643f8acf106 100644
--- a/libclc/opencl/include/clc/opencl/math/remquo.h
+++ b/libclc/opencl/include/clc/opencl/math/remquo.h
@@ -11,4 +11,11 @@
 #define __CLC_BODY <clc/math/remquo_decl.inc>
 #include <clc/math/gentype.inc>
 
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#define __CLC_BODY <clc/math/remquo_decl.inc>
+#define __CLC_ADDRESS_SPACE generic
+#include <clc/math/gentype.inc>
+#undef __CLC_ADDRESS_SPACE
+#endif
+
 #undef __CLC_FUNCTION
diff --git a/libclc/opencl/include/clc/opencl/shared/vload.h 
b/libclc/opencl/include/clc/opencl/shared/vload.h
index a343d652933fd..7c63f91546155 100644
--- a/libclc/opencl/include/clc/opencl/shared/vload.h
+++ b/libclc/opencl/include/clc/opencl/shared/vload.h
@@ -17,11 +17,19 @@
   _CLC_VLOAD_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE##8, 8, ADDR_SPACE)               
\
   _CLC_VLOAD_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE##16, 16, ADDR_SPACE)
 
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#define _CLC_VECTOR_VLOAD_GENERIC_DECL _CLC_VECTOR_VLOAD_DECL
+#else
+// The generic address space isn't available, so make the macro do nothing
+#define _CLC_VECTOR_VLOAD_GENERIC_DECL(X, Y, Z, W)
+#endif
+
 #define _CLC_VECTOR_VLOAD_PRIM3(SUFFIX, MEM_TYPE, PRIM_TYPE)                   
\
   _CLC_VECTOR_VLOAD_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE, __private)               
\
   _CLC_VECTOR_VLOAD_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE, __local)                 
\
   _CLC_VECTOR_VLOAD_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE, __constant)              
\
-  _CLC_VECTOR_VLOAD_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE, __global)
+  _CLC_VECTOR_VLOAD_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE, __global)                
\
+  _CLC_VECTOR_VLOAD_GENERIC_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE, __generic)
 
 #define _CLC_VECTOR_VLOAD_PRIM1(PRIM_TYPE)                                     
\
   _CLC_VECTOR_VLOAD_PRIM3(, PRIM_TYPE, PRIM_TYPE)
@@ -61,7 +69,13 @@ _CLC_VLOAD_DECL(a_half, half, float, , __global)
 _CLC_VLOAD_DECL(a_half, half, float, , __local)
 _CLC_VLOAD_DECL(a_half, half, float, , __private)
 
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+_CLC_VLOAD_DECL(_half, half, float, , __generic)
+_CLC_VLOAD_DECL(a_half, half, float, , __generic)
+#endif
+
 #undef _CLC_VLOAD_DECL
 #undef _CLC_VECTOR_VLOAD_DECL
 #undef _CLC_VECTOR_VLOAD_PRIM3
 #undef _CLC_VECTOR_VLOAD_PRIM1
+#undef _CLC_VECTOR_VLOAD_GENERIC_DECL
diff --git a/libclc/opencl/include/clc/opencl/shared/vstore.h 
b/libclc/opencl/include/clc/opencl/shared/vstore.h
index 6e98f0368c5c1..070b298e74a1a 100644
--- a/libclc/opencl/include/clc/opencl/shared/vstore.h
+++ b/libclc/opencl/include/clc/opencl/shared/vstore.h
@@ -17,10 +17,20 @@
   _CLC_VSTORE_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE##8, 8, ADDR_SPACE, RND)         
\
   _CLC_VSTORE_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE##16, 16, ADDR_SPACE, RND)
 
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#define _CLC_VSTORE_GENERIC_DECL _CLC_VSTORE_DECL
+#define _CLC_VECTOR_VSTORE_GENERIC_DECL _CLC_VECTOR_VSTORE_DECL
+#else
+// The generic address space isn't available, so make the macros do nothing
+#define _CLC_VSTORE_GENERIC_DECL(X, Y, Z, W, V, U)
+#define _CLC_VECTOR_VSTORE_GENERIC_DECL(X, Y, Z, W, V)
+#endif
+
 #define _CLC_VECTOR_VSTORE_PRIM3(SUFFIX, MEM_TYPE, PRIM_TYPE, RND)             
\
   _CLC_VECTOR_VSTORE_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE, __private, RND)         
\
   _CLC_VECTOR_VSTORE_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE, __local, RND)           
\
-  _CLC_VECTOR_VSTORE_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE, __global, RND)
+  _CLC_VECTOR_VSTORE_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE, __global, RND)          
\
+  _CLC_VECTOR_VSTORE_GENERIC_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE, __generic, RND)
 
 #define _CLC_VECTOR_VSTORE_PRIM1(PRIM_TYPE)                                    
\
   _CLC_VECTOR_VSTORE_PRIM3(, PRIM_TYPE, PRIM_TYPE, )
@@ -29,10 +39,12 @@
   _CLC_VSTORE_DECL(_half, half, PRIM_TYPE, , __private, RND)                   
\
   _CLC_VSTORE_DECL(_half, half, PRIM_TYPE, , __local, RND)                     
\
   _CLC_VSTORE_DECL(_half, half, PRIM_TYPE, , __global, RND)                    
\
+  _CLC_VSTORE_GENERIC_DECL(_half, half, PRIM_TYPE, , __generic, RND)           
\
   _CLC_VECTOR_VSTORE_PRIM3(_half, half, PRIM_TYPE, RND)                        
\
   _CLC_VSTORE_DECL(a_half, half, PRIM_TYPE, , __private, RND)                  
\
   _CLC_VSTORE_DECL(a_half, half, PRIM_TYPE, , __local, RND)                    
\
   _CLC_VSTORE_DECL(a_half, half, PRIM_TYPE, , __global, RND)                   
\
+  _CLC_VSTORE_GENERIC_DECL(a_half, half, PRIM_TYPE, , __generic, RND)          
\
   _CLC_VECTOR_VSTORE_PRIM3(a_half, half, PRIM_TYPE, RND)
 
 _CLC_VECTOR_VSTORE_PRIM1(char)
@@ -65,6 +77,8 @@ _CLC_VECTOR_VSTORE_PRIM1(half)
 #endif
 
 #undef _CLC_VSTORE_DECL
+#undef _CLC_VSTORE_GENERIC_DECL
 #undef _CLC_VECTOR_VSTORE_DECL
 #undef _CLC_VECTOR_VSTORE_PRIM3
 #undef _CLC_VECTOR_VSTORE_PRIM1
+#undef _CLC_VECTOR_VSTORE_GENERIC_DECL
diff --git a/libclc/opencl/lib/clspv/shared/vstore_half.inc 
b/libclc/opencl/lib/clspv/shared/vstore_half.inc
index 884c6873372a6..f2c02748246a8 100644
--- a/libclc/opencl/lib/clspv/shared/vstore_half.inc
+++ b/libclc/opencl/lib/clspv/shared/vstore_half.inc
@@ -13,11 +13,17 @@
 FUNC(__CLC_VECSIZE, __CLC_VECSIZE, __CLC_GENTYPE, __private);
 FUNC(__CLC_VECSIZE, __CLC_VECSIZE, __CLC_GENTYPE, __local);
 FUNC(__CLC_VECSIZE, __CLC_VECSIZE, __CLC_GENTYPE, __global);
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+FUNC(__CLC_VECSIZE, __CLC_VECSIZE, __CLC_GENTYPE, __generic);
+#endif
 
 #undef __CLC_OFFSET
 #else
 FUNC(, 1, __CLC_GENTYPE, __private);
 FUNC(, 1, __CLC_GENTYPE, __local);
 FUNC(, 1, __CLC_GENTYPE, __global);
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+FUNC(, 1, __CLC_GENTYPE, __generic);
+#endif
 #endif
 #endif
diff --git a/libclc/opencl/lib/generic/math/remquo.inc 
b/libclc/opencl/lib/generic/math/remquo.inc
index 055d30ff32f11..a139c1dfa843c 100644
--- a/libclc/opencl/lib/generic/math/remquo.inc
+++ b/libclc/opencl/lib/generic/math/remquo.inc
@@ -20,3 +20,10 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE remquo(__CLC_GENTYPE x, 
__CLC_GENTYPE y,
                                             local __CLC_INTN *q) {
   return __clc_remquo(x, y, q);
 }
+
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE remquo(__CLC_GENTYPE x, __CLC_GENTYPE y,
+                                            generic __CLC_INTN *q) {
+  return __clc_remquo(x, y, q);
+}
+#endif
diff --git a/libclc/opencl/lib/generic/shared/vload.cl 
b/libclc/opencl/lib/generic/shared/vload.cl
index 41f3629443e75..4bfb5a012ce1a 100644
--- a/libclc/opencl/lib/generic/shared/vload.cl
+++ b/libclc/opencl/lib/generic/shared/vload.cl
@@ -51,11 +51,19 @@
                   *)(&x[16 * offset]));                                        
\
   }
 
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#define VLOAD_VECTORIZE_GENERIC VLOAD_VECTORIZE
+#else
+// The generic address space isn't available, so make the macro do nothing
+#define VLOAD_VECTORIZE_GENERIC(X, Y)
+#endif
+
 #define VLOAD_ADDR_SPACES(__CLC_SCALAR_GENTYPE)                                
\
   VLOAD_VECTORIZE(__CLC_SCALAR_GENTYPE, __private)                             
\
   VLOAD_VECTORIZE(__CLC_SCALAR_GENTYPE, __local)                               
\
   VLOAD_VECTORIZE(__CLC_SCALAR_GENTYPE, __constant)                            
\
-  VLOAD_VECTORIZE(__CLC_SCALAR_GENTYPE, __global)
+  VLOAD_VECTORIZE(__CLC_SCALAR_GENTYPE, __global)                              
\
+  VLOAD_VECTORIZE_GENERIC(__CLC_SCALAR_GENTYPE, __generic)
 
 #define VLOAD_TYPES()                                                          
\
   VLOAD_ADDR_SPACES(char)                                                      
\
@@ -129,3 +137,4 @@ VLOAD_ADDR_SPACES(half)
 #undef VLOAD_TYPES
 #undef VLOAD_ADDR_SPACES
 #undef VLOAD_VECTORIZE
+#undef VLOAD_VECTORIZE_GENERIC
diff --git a/libclc/opencl/lib/generic/shared/vload_half.inc 
b/libclc/opencl/lib/generic/shared/vload_half.inc
index 26716b9960018..aaf067d75daac 100644
--- a/libclc/opencl/lib/generic/shared/vload_half.inc
+++ b/libclc/opencl/lib/generic/shared/vload_half.inc
@@ -20,6 +20,9 @@ FUNC(__CLC_VECSIZE, __CLC_VECSIZE, __CLC_OFFSET, 
__CLC_GENTYPE, __private);
 FUNC(__CLC_VECSIZE, __CLC_VECSIZE, __CLC_OFFSET, __CLC_GENTYPE, __local);
 FUNC(__CLC_VECSIZE, __CLC_VECSIZE, __CLC_OFFSET, __CLC_GENTYPE, __global);
 FUNC(__CLC_VECSIZE, __CLC_VECSIZE, __CLC_OFFSET, __CLC_GENTYPE, __constant);
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+FUNC(__CLC_VECSIZE, __CLC_VECSIZE, __CLC_OFFSET, __CLC_GENTYPE, __generic);
+#endif
 
 #undef __CLC_OFFSET
 #else
@@ -27,5 +30,8 @@ FUNC(, 1, 1, __CLC_GENTYPE, __private);
 FUNC(, 1, 1, __CLC_GENTYPE, __local);
 FUNC(, 1, 1, __CLC_GENTYPE, __global);
 FUNC(, 1, 1, __CLC_GENTYPE, __constant);
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+FUNC(, 1, 1, __CLC_GENTYPE, __generic);
+#endif
 #endif
 #endif
diff --git a/libclc/opencl/lib/generic/shared/vstore.cl 
b/libclc/opencl/lib/generic/shared/vstore.cl
index 78d5865aa1d17..fe4890defe846 100644
--- a/libclc/opencl/lib/generic/shared/vstore.cl
+++ b/libclc/opencl/lib/generic/shared/vstore.cl
@@ -50,10 +50,18 @@
            *)(&mem[16 * offset])) = vec;                                       
\
   }
 
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#define VSTORE_VECTORIZE_GENERIC VSTORE_VECTORIZE
+#else
+// The generic address space isn't available, so make the macro do nothing
+#define VSTORE_VECTORIZE_GENERIC(X, Y)
+#endif
+
 #define VSTORE_ADDR_SPACES(__CLC_SCALAR___CLC_GENTYPE)                         
\
   VSTORE_VECTORIZE(__CLC_SCALAR___CLC_GENTYPE, __private)                      
\
   VSTORE_VECTORIZE(__CLC_SCALAR___CLC_GENTYPE, __local)                        
\
-  VSTORE_VECTORIZE(__CLC_SCALAR___CLC_GENTYPE, __global)
+  VSTORE_VECTORIZE(__CLC_SCALAR___CLC_GENTYPE, __global)                       
\
+  VSTORE_VECTORIZE_GENERIC(__CLC_SCALAR___CLC_GENTYPE, __generic)
 
 VSTORE_ADDR_SPACES(char)
 VSTORE_ADDR_SPACES(uchar)
@@ -248,3 +256,4 @@ _CLC_DEF _CLC_OVERLOAD double __clc_rte(double x) {
 #undef DECLARE_HELPER
 #undef VSTORE_ADDR_SPACES
 #undef VSTORE_VECTORIZE
+#undef VSTORE_VECTORIZE_GENERIC
diff --git a/libclc/opencl/lib/generic/shared/vstore_half.inc 
b/libclc/opencl/lib/generic/shared/vstore_half.inc
index 78f137f76e832..02d645357f853 100644
--- a/libclc/opencl/lib/generic/shared/vstore_half.inc
+++ b/libclc/opencl/lib/generic/shared/vstore_half.inc
@@ -31,12 +31,19 @@ FUNC(__CLC_VECSIZE, __CLC_VECSIZE, __CLC_OFFSET, 
__CLC_GENTYPE, __local,
      STORE_HALF_BUILTIN);
 FUNC(__CLC_VECSIZE, __CLC_VECSIZE, __CLC_OFFSET, __CLC_GENTYPE, __global,
      STORE_HALF_BUILTIN);
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+FUNC(__CLC_VECSIZE, __CLC_VECSIZE, __CLC_OFFSET, __CLC_GENTYPE, __generic,
+     STORE_HALF_BUILTIN);
+#endif
 
 #undef __CLC_OFFSET
 #else
 FUNC(, 1, 1, __CLC_GENTYPE, __private, STORE_HALF_BUILTIN);
 FUNC(, 1, 1, __CLC_GENTYPE, __local, STORE_HALF_BUILTIN);
 FUNC(, 1, 1, __CLC_GENTYPE, __global, STORE_HALF_BUILTIN);
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+FUNC(, 1, 1, __CLC_GENTYPE, __generic, STORE_HALF_BUILTIN);
+#endif
 #endif
 
 #undef STORE_HALF_BUILTIN

>From 6b518a8c6a6c194640fc635cc7b093d11210d91f Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fra...@codeplay.com>
Date: Mon, 28 Apr 2025 16:12:02 +0100
Subject: [PATCH 2/6] Update decl guards

---
 libclc/clc/include/clc/math/unary_decl_with_int_ptr.inc | 2 +-
 libclc/clc/include/clc/math/unary_decl_with_ptr.inc     | 2 +-
 libclc/opencl/include/clc/opencl/math/remquo.h          | 2 +-
 libclc/opencl/include/clc/opencl/shared/vload.h         | 4 ++--
 libclc/opencl/include/clc/opencl/shared/vstore.h        | 2 +-
 5 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/libclc/clc/include/clc/math/unary_decl_with_int_ptr.inc 
b/libclc/clc/include/clc/math/unary_decl_with_int_ptr.inc
index 11884d5604b55..8bfe17c3c6817 100644
--- a/libclc/clc/include/clc/math/unary_decl_with_int_ptr.inc
+++ b/libclc/clc/include/clc/math/unary_decl_with_int_ptr.inc
@@ -12,7 +12,7 @@ _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE 
__CLC_FUNCTION(__CLC_GENTYPE x,
                                                      local __CLC_INTN *iptr);
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE x,
                                                      private __CLC_INTN *iptr);
-#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#if _CLC_GENERIC_AS_SUPPORTED
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE x,
                                                      generic __CLC_INTN *iptr);
 #endif
diff --git a/libclc/clc/include/clc/math/unary_decl_with_ptr.inc 
b/libclc/clc/include/clc/math/unary_decl_with_ptr.inc
index 308cecdb2541f..63a20e3d21c5d 100644
--- a/libclc/clc/include/clc/math/unary_decl_with_ptr.inc
+++ b/libclc/clc/include/clc/math/unary_decl_with_ptr.inc
@@ -13,7 +13,7 @@ _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE 
__CLC_FUNCTION(__CLC_GENTYPE x,
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE
 __CLC_FUNCTION(__CLC_GENTYPE x, private __CLC_GENTYPE *ptr);
 
-#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#if _CLC_GENERIC_AS_SUPPORTED
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE
 __CLC_FUNCTION(__CLC_GENTYPE x, generic __CLC_GENTYPE *ptr);
 #endif
diff --git a/libclc/opencl/include/clc/opencl/math/remquo.h 
b/libclc/opencl/include/clc/opencl/math/remquo.h
index 74643f8acf106..007d380c7cfc8 100644
--- a/libclc/opencl/include/clc/opencl/math/remquo.h
+++ b/libclc/opencl/include/clc/opencl/math/remquo.h
@@ -11,7 +11,7 @@
 #define __CLC_BODY <clc/math/remquo_decl.inc>
 #include <clc/math/gentype.inc>
 
-#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#if _CLC_GENERIC_AS_SUPPORTED
 #define __CLC_BODY <clc/math/remquo_decl.inc>
 #define __CLC_ADDRESS_SPACE generic
 #include <clc/math/gentype.inc>
diff --git a/libclc/opencl/include/clc/opencl/shared/vload.h 
b/libclc/opencl/include/clc/opencl/shared/vload.h
index 7c63f91546155..7b4092c0a1c32 100644
--- a/libclc/opencl/include/clc/opencl/shared/vload.h
+++ b/libclc/opencl/include/clc/opencl/shared/vload.h
@@ -17,7 +17,7 @@
   _CLC_VLOAD_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE##8, 8, ADDR_SPACE)               
\
   _CLC_VLOAD_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE##16, 16, ADDR_SPACE)
 
-#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#if _CLC_GENERIC_AS_SUPPORTED
 #define _CLC_VECTOR_VLOAD_GENERIC_DECL _CLC_VECTOR_VLOAD_DECL
 #else
 // The generic address space isn't available, so make the macro do nothing
@@ -69,7 +69,7 @@ _CLC_VLOAD_DECL(a_half, half, float, , __global)
 _CLC_VLOAD_DECL(a_half, half, float, , __local)
 _CLC_VLOAD_DECL(a_half, half, float, , __private)
 
-#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#if _CLC_GENERIC_AS_SUPPORTED
 _CLC_VLOAD_DECL(_half, half, float, , __generic)
 _CLC_VLOAD_DECL(a_half, half, float, , __generic)
 #endif
diff --git a/libclc/opencl/include/clc/opencl/shared/vstore.h 
b/libclc/opencl/include/clc/opencl/shared/vstore.h
index 070b298e74a1a..c1b78b734138f 100644
--- a/libclc/opencl/include/clc/opencl/shared/vstore.h
+++ b/libclc/opencl/include/clc/opencl/shared/vstore.h
@@ -17,7 +17,7 @@
   _CLC_VSTORE_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE##8, 8, ADDR_SPACE, RND)         
\
   _CLC_VSTORE_DECL(SUFFIX, MEM_TYPE, PRIM_TYPE##16, 16, ADDR_SPACE, RND)
 
-#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#if _CLC_GENERIC_AS_SUPPORTED
 #define _CLC_VSTORE_GENERIC_DECL _CLC_VSTORE_DECL
 #define _CLC_VECTOR_VSTORE_GENERIC_DECL _CLC_VECTOR_VSTORE_DECL
 #else

>From 54fc5a07fb3776af8feebdf2221629cb19b19649 Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fra...@codeplay.com>
Date: Wed, 21 May 2025 10:48:38 +0100
Subject: [PATCH 3/6] clean up cmake

---
 libclc/CMakeLists.txt | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index b8eddb92f3bf5..aa654c8a31eef 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -438,9 +438,6 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
     # For this reason we must consider the target support of the generic
     # address space separately from the *implementation* decision about whether
     # to declare certain builtins in that address space.
-    # FIXME: Shouldn't clang automatically enable this extension based on the
-    # target?
-    list( APPEND build_flags "-Xclang" 
"-cl-ext=+__opencl_c_generic_address_space" )
     # Note: we assume that if there is no distinct generic address space, it
     # maps to the private address space.
     set ( has_distinct_generic_addrspace TRUE )

>From 70f8478b17800a6b8b0192f4be9b1673e90cb4de Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fra...@codeplay.com>
Date: Wed, 21 May 2025 11:24:04 +0100
Subject: [PATCH 4/6] wop reduce macros

---
 libclc/clc/include/clc/clcfunc.h | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/libclc/clc/include/clc/clcfunc.h b/libclc/clc/include/clc/clcfunc.h
index e333fe863f990..5b30464355078 100644
--- a/libclc/clc/include/clc/clcfunc.h
+++ b/libclc/clc/include/clc/clcfunc.h
@@ -27,16 +27,8 @@
     (__OPENCL_C_VERSION__ >= CL_VERSION_3_0 &&                                 
\
      defined(__opencl_c_generic_address_space))
 #define _CLC_GENERIC_AS_SUPPORTED 1
-// Note that we hard-code the assumption that a non-distinct address space 
means
-// that the target maps the generic address space to the private address space.
-#ifdef __CLC_DISTINCT_GENERIC_ADDRSPACE__
-#define _CLC_DISTINCT_GENERIC_AS_SUPPORTED 1
-#else
-#define _CLC_DISTINCT_GENERIC_AS_SUPPORTED 0
-#endif
 #else
 #define _CLC_GENERIC_AS_SUPPORTED 0
-#define _CLC_DISTINCT_GENERIC_AS_SUPPORTED 0
 #endif
 
 #endif // __CLC_CLCFUNC_H_

>From b34b14003066d20a7d3de803c5bd1deece873f12 Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fra...@codeplay.com>
Date: Wed, 21 May 2025 11:39:52 +0100
Subject: [PATCH 5/6] update macro usage

---
 libclc/CMakeLists.txt                       | 16 +++++++++++-----
 libclc/clc/include/clc/clcfunc.h            |  6 ++++++
 libclc/clc/include/clc/math/remquo_decl.inc |  5 +++++
 libclc/clc/lib/generic/math/clc_fract.inc   |  3 +++
 libclc/clc/lib/generic/math/clc_frexp.cl    |  1 +
 libclc/clc/lib/generic/math/clc_remquo.cl   |  6 ++++++
 6 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index aa654c8a31eef..0d9a21c6d63a9 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -440,13 +440,19 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
     # to declare certain builtins in that address space.
     # Note: we assume that if there is no distinct generic address space, it
     # maps to the private address space.
-    set ( has_distinct_generic_addrspace TRUE )
-    if( ARCH STREQUAL nvptx OR ARCH STREQUAL nvptx64 )
-      set ( has_distinct_generic_addrspace FALSE )
+    set ( private_addrspace_val 0 )
+    set ( generic_addrspace_val 0 )
+    if( ARCH STREQUAL amdgcn OR ARCH STREQUAL r600 OR ARCH STREQUAL 
amdgcn-amdhsa )
+      set ( private_addrspace_val 5 )
     endif()
-    if( has_distinct_generic_addrspace )
-      list( APPEND build_flags -D__CLC_DISTINCT_GENERIC_ADDRSPACE__ )
+    if( ARCH STREQUAL spirv OR ARCH STREQUAL spirv64
+        OR ARCH STREQUAL clspv OR ARCH STREQUAL clspv64 )
+      set ( generic_addrspace_val 4 )
     endif()
+    list( APPEND build_flags
+      -D__CLC_PRIVATE_ADDRSPACE_VAL=${private_addrspace_val}
+      -D__CLC_GENERIC_ADDRSPACE_VAL=${generic_addrspace_val}
+    )
 
     set( clc_build_flags ${build_flags} -DCLC_INTERNAL )
 
diff --git a/libclc/clc/include/clc/clcfunc.h b/libclc/clc/include/clc/clcfunc.h
index 5b30464355078..10b9cdd099900 100644
--- a/libclc/clc/include/clc/clcfunc.h
+++ b/libclc/clc/include/clc/clcfunc.h
@@ -27,8 +27,14 @@
     (__OPENCL_C_VERSION__ >= CL_VERSION_3_0 &&                                 
\
      defined(__opencl_c_generic_address_space))
 #define _CLC_GENERIC_AS_SUPPORTED 1
+#if __CLC_PRIVATE_ADDRSPACE_VAL != __CLC_GENERIC_ADDRSPACE_VAL
+#define _CLC_DISTINCT_GENERIC_AS_SUPPORTED 1
+#else
+#define _CLC_DISTINCT_GENERIC_AS_SUPPORTED 0
+#endif
 #else
 #define _CLC_GENERIC_AS_SUPPORTED 0
+#define _CLC_DISTINCT_GENERIC_AS_SUPPORTED 0
 #endif
 
 #endif // __CLC_CLCFUNC_H_
diff --git a/libclc/clc/include/clc/math/remquo_decl.inc 
b/libclc/clc/include/clc/math/remquo_decl.inc
index 7f2af2915b9f8..cba28a7244eb4 100644
--- a/libclc/clc/include/clc/math/remquo_decl.inc
+++ b/libclc/clc/include/clc/math/remquo_decl.inc
@@ -17,3 +17,8 @@ _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE 
__CLC_FUNCTION(__CLC_GENTYPE x,
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE x,
                                                      __CLC_GENTYPE y,
                                                      local __CLC_INTN *q);
+#if _CLC_GENERIC_AS_SUPPORTED
+_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE x,
+                                                     __CLC_GENTYPE y,
+                                                     generic __CLC_INTN *q);
+#endif
diff --git a/libclc/clc/lib/generic/math/clc_fract.inc 
b/libclc/clc/lib/generic/math/clc_fract.inc
index 31d32399e3f03..f0466e339b341 100644
--- a/libclc/clc/lib/generic/math/clc_fract.inc
+++ b/libclc/clc/lib/generic/math/clc_fract.inc
@@ -34,5 +34,8 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE 
__clc_fract(__CLC_GENTYPE x,
 
 FRACT_DEF(local);
 FRACT_DEF(global);
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+FRACT_DEF(generic);
+#endif
 
 #undef MIN_CONSTANT
diff --git a/libclc/clc/lib/generic/math/clc_frexp.cl 
b/libclc/clc/lib/generic/math/clc_frexp.cl
index 4a975918daf51..041caec5a5b3b 100644
--- a/libclc/clc/lib/generic/math/clc_frexp.cl
+++ b/libclc/clc/lib/generic/math/clc_frexp.cl
@@ -6,6 +6,7 @@
 //
 
//===----------------------------------------------------------------------===//
 
+#include <clc/clcfunc.h>
 #include <clc/clc_convert.h>
 #include <clc/internal/clc.h>
 #include <clc/math/math.h>
diff --git a/libclc/clc/lib/generic/math/clc_remquo.cl 
b/libclc/clc/lib/generic/math/clc_remquo.cl
index 2f3b6f0339e17..1505d1c3fb62f 100644
--- a/libclc/clc/lib/generic/math/clc_remquo.cl
+++ b/libclc/clc/lib/generic/math/clc_remquo.cl
@@ -29,3 +29,9 @@
 #define __CLC_ADDRESS_SPACE local
 #include <clc_remquo.inc>
 #undef __CLC_ADDRESS_SPACE
+
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#define __CLC_ADDRESS_SPACE generic
+#include <clc_remquo.inc>
+#undef __CLC_ADDRESS_SPACE
+#endif

>From 3ad27e2c43f888558c910bac24abd446e33a634f Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fra...@codeplay.com>
Date: Wed, 21 May 2025 11:53:28 +0100
Subject: [PATCH 6/6] fix formatting

---
 libclc/clc/lib/generic/math/clc_frexp.cl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libclc/clc/lib/generic/math/clc_frexp.cl 
b/libclc/clc/lib/generic/math/clc_frexp.cl
index 041caec5a5b3b..7ff292ebb75c1 100644
--- a/libclc/clc/lib/generic/math/clc_frexp.cl
+++ b/libclc/clc/lib/generic/math/clc_frexp.cl
@@ -6,8 +6,8 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#include <clc/clcfunc.h>
 #include <clc/clc_convert.h>
+#include <clc/clcfunc.h>
 #include <clc/internal/clc.h>
 #include <clc/math/math.h>
 #include <clc/relational/clc_isinf.h>

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to