https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/187358
Follow the suggested behavior of returning +/-FLT_MIN for logical zeros. >From 2408c2b9f9a47a1ea6c34c063f39f636944f86eb Mon Sep 17 00:00:00 2001 From: Matt Arsenault <[email protected]> Date: Wed, 18 Mar 2026 19:06:26 +0100 Subject: [PATCH] libclc: Fix nextafter with -cl-denorms-are-zero Follow the suggested behavior of returning +/-FLT_MIN for logical zeros. --- libclc/clc/lib/generic/math/clc_nextafter.cl | 2 ++ libclc/clc/lib/generic/math/clc_nextafter.inc | 2 +- libclc/clc/lib/generic/math/clc_nextdown.cl | 1 + libclc/clc/lib/generic/math/clc_nextdown.inc | 7 +++++-- libclc/clc/lib/generic/math/clc_nextup.cl | 1 + libclc/clc/lib/generic/math/clc_nextup.inc | 4 ++++ 6 files changed, 14 insertions(+), 3 deletions(-) diff --git a/libclc/clc/lib/generic/math/clc_nextafter.cl b/libclc/clc/lib/generic/math/clc_nextafter.cl index 0470361d4f6d1..2e8ec5eda5d26 100644 --- a/libclc/clc/lib/generic/math/clc_nextafter.cl +++ b/libclc/clc/lib/generic/math/clc_nextafter.cl @@ -8,8 +8,10 @@ #include "clc/clc_convert.h" #include "clc/float/definitions.h" +#include "clc/math/clc_flush_if_daz.h" #include "clc/math/clc_nextdown.h" #include "clc/math/clc_nextup.h" +#include "clc/math/clc_subnormal_config.h" #include "clc/relational/clc_isunordered.h" #define __CLC_BODY "clc_nextafter.inc" diff --git a/libclc/clc/lib/generic/math/clc_nextafter.inc b/libclc/clc/lib/generic/math/clc_nextafter.inc index ccc8c36c204fd..8eb4b44490f71 100644 --- a/libclc/clc/lib/generic/math/clc_nextafter.inc +++ b/libclc/clc/lib/generic/math/clc_nextafter.inc @@ -10,7 +10,7 @@ _CLC_OVERLOAD _CLC_CONST _CLC_DEF __CLC_GENTYPE __clc_nextafter(__CLC_GENTYPE x, __CLC_GENTYPE y) { __CLC_GENTYPE up = __clc_nextup(x); __CLC_GENTYPE down = __clc_nextdown(x); - __CLC_GENTYPE ret = x < y ? up : y; + __CLC_GENTYPE ret = x < y ? up : __clc_flush_if_daz(y); ret = x > y ? down : ret; return __clc_isunordered(x, y) ? __CLC_GENTYPE_NAN : ret; diff --git a/libclc/clc/lib/generic/math/clc_nextdown.cl b/libclc/clc/lib/generic/math/clc_nextdown.cl index 87943037e7b13..e6d46ae9f8cb5 100644 --- a/libclc/clc/lib/generic/math/clc_nextdown.cl +++ b/libclc/clc/lib/generic/math/clc_nextdown.cl @@ -9,6 +9,7 @@ #include "clc/clc_convert.h" #include "clc/float/definitions.h" #include "clc/math/clc_nextdown.h" +#include "clc/math/clc_subnormal_config.h" #include "clc/relational/clc_isnan.h" #define __CLC_BODY "clc_nextdown.inc" diff --git a/libclc/clc/lib/generic/math/clc_nextdown.inc b/libclc/clc/lib/generic/math/clc_nextdown.inc index 4c16f96fdde29..3bc1ebfb9a46c 100644 --- a/libclc/clc/lib/generic/math/clc_nextdown.inc +++ b/libclc/clc/lib/generic/math/clc_nextdown.inc @@ -11,7 +11,10 @@ __clc_nextdown(__CLC_GENTYPE x) { __CLC_S_GENTYPE increment = x > __CLC_FP_LIT(0.0) ? (__CLC_S_GENTYPE)-1 : (__CLC_S_GENTYPE)1; __CLC_S_GENTYPE ix = __CLC_AS_S_GENTYPE(x) + increment; - __CLC_GENTYPE y = - x == __CLC_FP_LIT(0.0) ? -__CLC_GENTYPE_TRUE_MIN : __CLC_AS_GENTYPE(ix); + + __CLC_GENTYPE min_value = __CLC_GENTYPE_DENORMS_ARE_ZERO + ? -__CLC_GENTYPE_MIN + : -__CLC_GENTYPE_TRUE_MIN; + __CLC_GENTYPE y = x == __CLC_FP_LIT(0.0) ? min_value : __CLC_AS_GENTYPE(ix); return __clc_isnan(x) || x == -__CLC_GENTYPE_INF ? x : y; } diff --git a/libclc/clc/lib/generic/math/clc_nextup.cl b/libclc/clc/lib/generic/math/clc_nextup.cl index 309852f313f9c..3570e766f96bf 100644 --- a/libclc/clc/lib/generic/math/clc_nextup.cl +++ b/libclc/clc/lib/generic/math/clc_nextup.cl @@ -8,6 +8,7 @@ #include "clc/clc_convert.h" #include "clc/math/clc_nextup.h" +#include "clc/math/clc_subnormal_config.h" #include "clc/relational/clc_isnan.h" #define __CLC_BODY "clc_nextup.inc" diff --git a/libclc/clc/lib/generic/math/clc_nextup.inc b/libclc/clc/lib/generic/math/clc_nextup.inc index a75deda82933a..d02dc1a839acb 100644 --- a/libclc/clc/lib/generic/math/clc_nextup.inc +++ b/libclc/clc/lib/generic/math/clc_nextup.inc @@ -11,5 +11,9 @@ _CLC_OVERLOAD _CLC_CONST _CLC_DEF __CLC_GENTYPE __clc_nextup(__CLC_GENTYPE x) { __CLC_S_GENTYPE ix = y + (y >= (__CLC_S_GENTYPE)0 ? (__CLC_S_GENTYPE)1 : (__CLC_S_GENTYPE)-1); __CLC_GENTYPE converted = __CLC_AS_GENTYPE(ix); + + if (__CLC_GENTYPE_DENORMS_ARE_ZERO) + converted = x == __CLC_FP_LIT(0.0) ? __CLC_GENTYPE_MIN : converted; + return __clc_isnan(x) || x == __CLC_GENTYPE_INF ? x : converted; } _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
