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

>From 3519e1c571375802d77937e765d551607ed5bdde 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/2] [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/clspv/lib/shared/vstore_half.inc       |  6 +++++
 libclc/generic/include/clc/math/fract.inc     | 13 +++++++---
 libclc/generic/include/clc/math/frexp.inc     |  4 +++
 libclc/generic/include/clc/math/remquo.h      |  7 ++++++
 libclc/generic/include/clc/math/sincos.inc    |  4 +++
 libclc/generic/include/clc/shared/vload.h     | 16 +++++++++++-
 libclc/generic/include/clc/shared/vstore.h    | 16 +++++++++++-
 libclc/generic/lib/math/fract.inc             |  4 +++
 libclc/generic/lib/math/remquo.cl             |  7 ++++++
 libclc/generic/lib/math/sincos.inc            |  3 +++
 libclc/generic/lib/shared/vload.cl            | 11 +++++++-
 libclc/generic/lib/shared/vload_half.inc      |  6 +++++
 libclc/generic/lib/shared/vstore.cl           | 11 +++++++-
 libclc/generic/lib/shared/vstore_half.inc     |  7 ++++++
 22 files changed, 183 insertions(+), 7 deletions(-)

diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index 50ddfc3930cd3..d1f09114d6e54 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/clspv/lib/shared/vstore_half.inc 
b/libclc/clspv/lib/shared/vstore_half.inc
index 884c6873372a6..f2c02748246a8 100644
--- a/libclc/clspv/lib/shared/vstore_half.inc
+++ b/libclc/clspv/lib/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/generic/include/clc/math/fract.inc 
b/libclc/generic/include/clc/math/fract.inc
index 72e65d4409041..076971cc56674 100644
--- a/libclc/generic/include/clc/math/fract.inc
+++ b/libclc/generic/include/clc/math/fract.inc
@@ -6,6 +6,13 @@
 //
 
//===----------------------------------------------------------------------===//
 
-_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x, global 
__CLC_GENTYPE *iptr);
-_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x, local 
__CLC_GENTYPE *iptr);
-_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x, private 
__CLC_GENTYPE *iptr);
+_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x,
+                                            global __CLC_GENTYPE *iptr);
+_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x,
+                                            local __CLC_GENTYPE *iptr);
+_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x,
+                                            private __CLC_GENTYPE *iptr);
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x,
+                                            generic __CLC_GENTYPE *iptr);
+#endif
diff --git a/libclc/generic/include/clc/math/frexp.inc 
b/libclc/generic/include/clc/math/frexp.inc
index 63fe3cb90403b..0cc0ae22c9104 100644
--- a/libclc/generic/include/clc/math/frexp.inc
+++ b/libclc/generic/include/clc/math/frexp.inc
@@ -9,3 +9,7 @@
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE frexp(__CLC_GENTYPE x, global __CLC_INTN 
*iptr);
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE frexp(__CLC_GENTYPE x, local __CLC_INTN 
*iptr);
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE frexp(__CLC_GENTYPE x, private 
__CLC_INTN *iptr);
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE frexp(__CLC_GENTYPE x,
+                                            generic __CLC_INTN *iptr);
+#endif
diff --git a/libclc/generic/include/clc/math/remquo.h 
b/libclc/generic/include/clc/math/remquo.h
index e332b32886c2e..75b7d5ac3d53a 100644
--- a/libclc/generic/include/clc/math/remquo.h
+++ b/libclc/generic/include/clc/math/remquo.h
@@ -23,4 +23,11 @@
 #include <clc/math/gentype.inc>
 #undef __CLC_ADDRESS_SPACE
 
+#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/generic/include/clc/math/sincos.inc 
b/libclc/generic/include/clc/math/sincos.inc
index d6ec2fe94704e..82171b44c3ce3 100644
--- a/libclc/generic/include/clc/math/sincos.inc
+++ b/libclc/generic/include/clc/math/sincos.inc
@@ -12,3 +12,7 @@ _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE sincos(__CLC_GENTYPE x,
                                              local __CLC_GENTYPE *cosval);
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE sincos(__CLC_GENTYPE x,
                                              private __CLC_GENTYPE *cosval);
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE sincos(__CLC_GENTYPE x,
+                                             generic __CLC_GENTYPE *cosval);
+#endif
diff --git a/libclc/generic/include/clc/shared/vload.h 
b/libclc/generic/include/clc/shared/vload.h
index a343d652933fd..7c63f91546155 100644
--- a/libclc/generic/include/clc/shared/vload.h
+++ b/libclc/generic/include/clc/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/generic/include/clc/shared/vstore.h 
b/libclc/generic/include/clc/shared/vstore.h
index 6e98f0368c5c1..070b298e74a1a 100644
--- a/libclc/generic/include/clc/shared/vstore.h
+++ b/libclc/generic/include/clc/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/generic/lib/math/fract.inc 
b/libclc/generic/lib/math/fract.inc
index e6f43b8334a58..d27bdd4791ef6 100644
--- a/libclc/generic/lib/math/fract.inc
+++ b/libclc/generic/lib/math/fract.inc
@@ -36,6 +36,10 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE fract(__CLC_GENTYPE x, 
private __CLC_GENTYP
 
 FRACT_DEF(local);
 FRACT_DEF(global);
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+FRACT_DEF(generic);
+#else
+#endif
 
 #undef MIN_CONSTANT
 #undef ZERO
diff --git a/libclc/generic/lib/math/remquo.cl 
b/libclc/generic/lib/math/remquo.cl
index d0c4b16ed7c39..f7d363606a4c6 100644
--- a/libclc/generic/lib/math/remquo.cl
+++ b/libclc/generic/lib/math/remquo.cl
@@ -23,3 +23,10 @@
 #define __CLC_ADDRESS_SPACE private
 #include <clc/math/gentype.inc>
 #undef __CLC_ADDRESS_SPACE
+
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#define __CLC_BODY <remquo.inc>
+#define __CLC_ADDRESS_SPACE generic
+#include <clc/math/gentype.inc>
+#undef __CLC_ADDRESS_SPACE
+#endif
diff --git a/libclc/generic/lib/math/sincos.inc 
b/libclc/generic/lib/math/sincos.inc
index b1d4f88c3d427..e15f899a75cce 100644
--- a/libclc/generic/lib/math/sincos.inc
+++ b/libclc/generic/lib/math/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/generic/lib/shared/vload.cl 
b/libclc/generic/lib/shared/vload.cl
index 05737aaa88b71..d804e1069ad6d 100644
--- a/libclc/generic/lib/shared/vload.cl
+++ b/libclc/generic/lib/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)                                                      
\
@@ -130,3 +138,4 @@ VLOAD_ADDR_SPACES(half)
 #undef VLOAD_TYPES
 #undef VLOAD_ADDR_SPACES
 #undef VLOAD_VECTORIZE
+#undef VLOAD_VECTORIZE_GENERIC
diff --git a/libclc/generic/lib/shared/vload_half.inc 
b/libclc/generic/lib/shared/vload_half.inc
index 26716b9960018..aaf067d75daac 100644
--- a/libclc/generic/lib/shared/vload_half.inc
+++ b/libclc/generic/lib/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/generic/lib/shared/vstore.cl 
b/libclc/generic/lib/shared/vstore.cl
index 0c0513f08a778..bc5494d54ba1d 100644
--- a/libclc/generic/lib/shared/vstore.cl
+++ b/libclc/generic/lib/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)
@@ -249,3 +257,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/generic/lib/shared/vstore_half.inc 
b/libclc/generic/lib/shared/vstore_half.inc
index 78f137f76e832..02d645357f853 100644
--- a/libclc/generic/lib/shared/vstore_half.inc
+++ b/libclc/generic/lib/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 b437f11386e431fe98792ae3bbce589e8cf820d7 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/2] 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/generic/include/clc/math/fract.inc               | 2 +-
 libclc/generic/include/clc/math/frexp.inc               | 2 +-
 libclc/generic/include/clc/math/remquo.h                | 2 +-
 libclc/generic/include/clc/math/sincos.inc              | 2 +-
 libclc/generic/include/clc/shared/vload.h               | 4 ++--
 libclc/generic/include/clc/shared/vstore.h              | 2 +-
 8 files changed, 9 insertions(+), 9 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/generic/include/clc/math/fract.inc 
b/libclc/generic/include/clc/math/fract.inc
index 076971cc56674..d88fce13682a3 100644
--- a/libclc/generic/include/clc/math/fract.inc
+++ b/libclc/generic/include/clc/math/fract.inc
@@ -12,7 +12,7 @@ _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x,
                                             local __CLC_GENTYPE *iptr);
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x,
                                             private __CLC_GENTYPE *iptr);
-#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#if _CLC_GENERIC_AS_SUPPORTED
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE fract(__CLC_GENTYPE x,
                                             generic __CLC_GENTYPE *iptr);
 #endif
diff --git a/libclc/generic/include/clc/math/frexp.inc 
b/libclc/generic/include/clc/math/frexp.inc
index 0cc0ae22c9104..2fc333c66c694 100644
--- a/libclc/generic/include/clc/math/frexp.inc
+++ b/libclc/generic/include/clc/math/frexp.inc
@@ -9,7 +9,7 @@
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE frexp(__CLC_GENTYPE x, global __CLC_INTN 
*iptr);
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE frexp(__CLC_GENTYPE x, local __CLC_INTN 
*iptr);
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE frexp(__CLC_GENTYPE x, private 
__CLC_INTN *iptr);
-#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#if _CLC_GENERIC_AS_SUPPORTED
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE frexp(__CLC_GENTYPE x,
                                             generic __CLC_INTN *iptr);
 #endif
diff --git a/libclc/generic/include/clc/math/remquo.h 
b/libclc/generic/include/clc/math/remquo.h
index 75b7d5ac3d53a..ac87045a0eec2 100644
--- a/libclc/generic/include/clc/math/remquo.h
+++ b/libclc/generic/include/clc/math/remquo.h
@@ -23,7 +23,7 @@
 #include <clc/math/gentype.inc>
 #undef __CLC_ADDRESS_SPACE
 
-#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/generic/include/clc/math/sincos.inc 
b/libclc/generic/include/clc/math/sincos.inc
index 82171b44c3ce3..66d81bc0499fe 100644
--- a/libclc/generic/include/clc/math/sincos.inc
+++ b/libclc/generic/include/clc/math/sincos.inc
@@ -12,7 +12,7 @@ _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE sincos(__CLC_GENTYPE x,
                                              local __CLC_GENTYPE *cosval);
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE sincos(__CLC_GENTYPE x,
                                              private __CLC_GENTYPE *cosval);
-#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#if _CLC_GENERIC_AS_SUPPORTED
 _CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE sincos(__CLC_GENTYPE x,
                                              generic __CLC_GENTYPE *cosval);
 #endif
diff --git a/libclc/generic/include/clc/shared/vload.h 
b/libclc/generic/include/clc/shared/vload.h
index 7c63f91546155..7b4092c0a1c32 100644
--- a/libclc/generic/include/clc/shared/vload.h
+++ b/libclc/generic/include/clc/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/generic/include/clc/shared/vstore.h 
b/libclc/generic/include/clc/shared/vstore.h
index 070b298e74a1a..c1b78b734138f 100644
--- a/libclc/generic/include/clc/shared/vstore.h
+++ b/libclc/generic/include/clc/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

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

Reply via email to