[llvm-branch-commits] [libclc] libclc: Fix nextafter with -cl-denorms-are-zero (PR #187358)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Mar 18 12:01:32 PDT 2026
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 <Matthew.Arsenault at amd.com>
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;
}
More information about the llvm-branch-commits
mailing list