[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)
This commit is contained in:
Wenju He 2025-11-13 08:03:49 +08:00 committed by GitHub
parent 500e6d8b28
commit fa417d78b1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 24 additions and 17 deletions

View File

@ -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

View File

@ -14,10 +14,12 @@
#define __CLC_BODY <clc_atomic_def.inc>
#include <clc/integer/gentype.inc>
#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 <clc_atomic_def.inc>
#include <clc/math/gentype.inc>

View File

@ -15,9 +15,9 @@
#define __CLC_BODY <clc_atomic_def.inc>
#include <clc/integer/gentype.inc>
#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 <clc_atomic_def.inc>

View File

@ -15,8 +15,10 @@
#define __CLC_BODY <clc_atomic_def.inc>
#include <clc/integer/gentype.inc>
#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 <clc_atomic_def.inc>
#include <clc/math/gentype.inc>