From fa417d78b18f5a12e2be727efd2928cf775fe3ac Mon Sep 17 00:00:00 2001 From: Wenju He Date: Thu, 13 Nov 2025 08:03:49 +0800 Subject: [PATCH] [libclc] Fix floating-point __clc_atomic_store/exchange cast mismatch (#167625) When pointer element type is casted to integer type, the stored value should be casted to integer type to avoid type mistmatch. LLVM IR change in function _Z18__clc_atomic_storePU3AS1Vffii: > %5 = bitcast float %1 to i32 (New) < %5 = fptosi float %1 to i32 (Old) --- .../clc/lib/generic/atomic/clc_atomic_def.inc | 25 +++++++++++-------- .../lib/generic/atomic/clc_atomic_exchange.cl | 6 +++-- .../clc/lib/generic/atomic/clc_atomic_load.cl | 4 +-- .../lib/generic/atomic/clc_atomic_store.cl | 6 +++-- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/libclc/clc/lib/generic/atomic/clc_atomic_def.inc b/libclc/clc/lib/generic/atomic/clc_atomic_def.inc index 14a09b1f09f5..75561430b33a 100644 --- a/libclc/clc/lib/generic/atomic/clc_atomic_def.inc +++ b/libclc/clc/lib/generic/atomic/clc_atomic_def.inc @@ -21,47 +21,50 @@ #ifdef __CLC_HAS_ATOMIC -#ifndef __CLC_PTR_CASTTYPE -#define __CLC_PTR_CASTTYPE __CLC_GENTYPE +#ifndef __CLC_CASTTYPE +#define __CLC_CASTTYPE __CLC_GENTYPE #endif #ifndef __CLC_AS_RETTYPE #define __CLC_AS_RETTYPE(x) x #endif +#ifndef __CLC_AS_CASTTYPE +#define __CLC_AS_CASTTYPE(x) x +#endif + #ifdef __CLC_NO_VALUE_ARG #define __CLC_DEFINE_ATOMIC(ADDRSPACE) \ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \ volatile ADDRSPACE __CLC_GENTYPE *Ptr, int MemoryOrder, \ int MemoryScope) { \ return __CLC_AS_RETTYPE(__CLC_IMPL_FUNCTION( \ - (ADDRSPACE __CLC_PTR_CASTTYPE *)Ptr, MemoryOrder, MemoryScope)); \ + (ADDRSPACE __CLC_CASTTYPE *)Ptr, MemoryOrder, MemoryScope)); \ } #elif defined(__CLC_INC_DEC) #define __CLC_DEFINE_ATOMIC(ADDRSPACE) \ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \ volatile ADDRSPACE __CLC_GENTYPE *Ptr, int MemoryOrder, \ int MemoryScope) { \ - return __CLC_AS_RETTYPE( \ - __CLC_IMPL_FUNCTION((ADDRSPACE __CLC_PTR_CASTTYPE *)Ptr, \ - (__CLC_GENTYPE)1, MemoryOrder, MemoryScope)); \ + return __CLC_IMPL_FUNCTION(Ptr, (__CLC_GENTYPE)1, MemoryOrder, \ + MemoryScope); \ } #elif defined(__CLC_RETURN_VOID) #define __CLC_DEFINE_ATOMIC(ADDRSPACE) \ _CLC_OVERLOAD _CLC_DEF void __CLC_FUNCTION( \ volatile ADDRSPACE __CLC_GENTYPE *Ptr, __CLC_GENTYPE Value, \ int MemoryOrder, int MemoryScope) { \ - __CLC_IMPL_FUNCTION((ADDRSPACE __CLC_PTR_CASTTYPE *)Ptr, Value, \ - MemoryOrder, MemoryScope); \ + __CLC_IMPL_FUNCTION((ADDRSPACE __CLC_CASTTYPE *)Ptr, \ + __CLC_AS_CASTTYPE(Value), MemoryOrder, MemoryScope); \ } #else #define __CLC_DEFINE_ATOMIC(ADDRSPACE) \ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \ volatile ADDRSPACE __CLC_GENTYPE *Ptr, __CLC_GENTYPE Value, \ int MemoryOrder, int MemoryScope) { \ - return __CLC_AS_RETTYPE( \ - __CLC_IMPL_FUNCTION((ADDRSPACE __CLC_PTR_CASTTYPE *)Ptr, Value, \ - MemoryOrder, MemoryScope)); \ + return __CLC_AS_RETTYPE(__CLC_IMPL_FUNCTION( \ + (ADDRSPACE __CLC_CASTTYPE *)Ptr, __CLC_AS_CASTTYPE(Value), \ + MemoryOrder, MemoryScope)); \ } #endif diff --git a/libclc/clc/lib/generic/atomic/clc_atomic_exchange.cl b/libclc/clc/lib/generic/atomic/clc_atomic_exchange.cl index ee80256d3dbb..b2c26758103c 100644 --- a/libclc/clc/lib/generic/atomic/clc_atomic_exchange.cl +++ b/libclc/clc/lib/generic/atomic/clc_atomic_exchange.cl @@ -14,10 +14,12 @@ #define __CLC_BODY #include -#undef __CLC_PTR_CASTTYPE +#undef __CLC_CASTTYPE #undef __CLC_AS_RETTYPE -#define __CLC_PTR_CASTTYPE __CLC_BIT_INTN +#undef __CLC_AS_CASTTYPE +#define __CLC_CASTTYPE __CLC_BIT_INTN #define __CLC_AS_RETTYPE(x) __CLC_AS_GENTYPE(x) +#define __CLC_AS_CASTTYPE __CLC_AS_S_GENTYPE #define __CLC_BODY #include diff --git a/libclc/clc/lib/generic/atomic/clc_atomic_load.cl b/libclc/clc/lib/generic/atomic/clc_atomic_load.cl index f7fe2510569e..af808553a711 100644 --- a/libclc/clc/lib/generic/atomic/clc_atomic_load.cl +++ b/libclc/clc/lib/generic/atomic/clc_atomic_load.cl @@ -15,9 +15,9 @@ #define __CLC_BODY #include -#undef __CLC_PTR_CASTTYPE +#undef __CLC_CASTTYPE #undef __CLC_AS_RETTYPE -#define __CLC_PTR_CASTTYPE __CLC_BIT_INTN +#define __CLC_CASTTYPE __CLC_BIT_INTN #define __CLC_AS_RETTYPE(x) __CLC_AS_GENTYPE(x) #define __CLC_BODY diff --git a/libclc/clc/lib/generic/atomic/clc_atomic_store.cl b/libclc/clc/lib/generic/atomic/clc_atomic_store.cl index a93d21e8430c..66ae2ba98556 100644 --- a/libclc/clc/lib/generic/atomic/clc_atomic_store.cl +++ b/libclc/clc/lib/generic/atomic/clc_atomic_store.cl @@ -15,8 +15,10 @@ #define __CLC_BODY #include -#undef __CLC_PTR_CASTTYPE -#define __CLC_PTR_CASTTYPE __CLC_BIT_INTN +#undef __CLC_CASTTYPE +#undef __CLC_AS_CASTTYPE +#define __CLC_CASTTYPE __CLC_BIT_INTN +#define __CLC_AS_CASTTYPE __CLC_AS_S_GENTYPE #define __CLC_BODY #include