https://github.com/DenisGZM created https://github.com/llvm/llvm-project/pull/158301
Added declarations for nan/nanf so Clang could translate it to appropriate functions from libdevice >From 100645ecb2f8d406fb8c1b59c3e4f3e85ca81100 Mon Sep 17 00:00:00 2001 From: Denis Gerasimov <deng...@gmail.com> Date: Fri, 12 Sep 2025 17:13:21 +0300 Subject: [PATCH] [CLANG][CUDA] Enable nan/nanf from libdevice in device code --- clang/lib/Headers/__clang_cuda_libdevice_declares.h | 4 ++-- clang/lib/Headers/__clang_cuda_math.h | 2 ++ clang/test/Headers/Inputs/include/math.h | 2 ++ clang/test/Headers/nvptx_device_cmath_functions.cpp | 4 ++++ clang/test/Headers/nvptx_device_math_functions.cpp | 4 ++++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/clang/lib/Headers/__clang_cuda_libdevice_declares.h b/clang/lib/Headers/__clang_cuda_libdevice_declares.h index ded0382a7ddce..cbc7f723ce8c4 100644 --- a/clang/lib/Headers/__clang_cuda_libdevice_declares.h +++ b/clang/lib/Headers/__clang_cuda_libdevice_declares.h @@ -269,8 +269,8 @@ __DEVICE__ float __nv_modff(float __a, float *__b); __DEVICE__ int __nv_mul24(int __a, int __b); __DEVICE__ long long __nv_mul64hi(long long __a, long long __b); __DEVICE__ int __nv_mulhi(int __a, int __b); -__DEVICE__ double __nv_nan(const signed char *__a); -__DEVICE__ float __nv_nanf(const signed char *__a); +__DEVICE__ double __nv_nan(const char *__a); +__DEVICE__ float __nv_nanf(const char *__a); __DEVICE__ double __nv_nearbyint(double __a); __DEVICE__ float __nv_nearbyintf(float __a); __DEVICE__ double __nv_nextafter(double __a, double __b); diff --git a/clang/lib/Headers/__clang_cuda_math.h b/clang/lib/Headers/__clang_cuda_math.h index 44c6e9a4e48d1..0d67ea309d272 100644 --- a/clang/lib/Headers/__clang_cuda_math.h +++ b/clang/lib/Headers/__clang_cuda_math.h @@ -201,6 +201,8 @@ __DEVICE__ int max(int __a, int __b) { return __nv_max(__a, __b); } __DEVICE__ int min(int __a, int __b) { return __nv_min(__a, __b); } __DEVICE__ double modf(double __a, double *__b) { return __nv_modf(__a, __b); } __DEVICE__ float modff(float __a, float *__b) { return __nv_modff(__a, __b); } +__DEVICE__ float nanf(const char *__a) { return __nv_nanf(__a); } +__DEVICE__ double nan(const char *__a) { return __nv_nan(__a); } __DEVICE__ double nearbyint(double __a) { return __builtin_nearbyint(__a); } __DEVICE__ float nearbyintf(float __a) { return __builtin_nearbyintf(__a); } __DEVICE__ double nextafter(double __a, double __b) { diff --git a/clang/test/Headers/Inputs/include/math.h b/clang/test/Headers/Inputs/include/math.h index cbd6bf7457a76..65f4395d6c966 100644 --- a/clang/test/Headers/Inputs/include/math.h +++ b/clang/test/Headers/Inputs/include/math.h @@ -107,6 +107,8 @@ long lround(double __a); long lroundf(float __a); double modf(double __a, double *__b); float modff(float __a, float *__b); +float nanf(const char *__a); +double nan(const char *__a); double nearbyint(double __a); float nearbyintf(float __a); double nextafter(double __a, double __b); diff --git a/clang/test/Headers/nvptx_device_cmath_functions.cpp b/clang/test/Headers/nvptx_device_cmath_functions.cpp index 898a8544a6e6a..04778210a2991 100644 --- a/clang/test/Headers/nvptx_device_cmath_functions.cpp +++ b/clang/test/Headers/nvptx_device_cmath_functions.cpp @@ -22,5 +22,9 @@ void test_sqrt(double a1) { double l4 = fabs(a1); // CHECK-YES: call noundef i32 @__nv_abs(i32 double l5 = abs((int)a1); + // CHECK-YES: call noundef float @__nv_nanf(ptr noundef + float l6 = nanf(""); + // CHECK-YES: call noundef double @__nv_nan(ptr noundef + double l7 = nan(""); } } diff --git a/clang/test/Headers/nvptx_device_math_functions.cpp b/clang/test/Headers/nvptx_device_math_functions.cpp index 791cb49f918c7..d70f3d7dac582 100644 --- a/clang/test/Headers/nvptx_device_math_functions.cpp +++ b/clang/test/Headers/nvptx_device_math_functions.cpp @@ -22,5 +22,9 @@ void test_sqrt(double a1) { double l4 = fabs(a1); // CHECK-YES: call noundef i32 @__nv_abs(i32 double l5 = abs((int)a1); + // CHECK-YES: call noundef float @__nv_nanf(ptr noundef + float l6 = nanf(""); + // CHECK-YES: call noundef double @__nv_nan(ptr noundef + double l7 = nan(""); } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits