[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
Thu Mar 19 01:02:35 PDT 2026


https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/187358

>From c0a0ff74f4b289a123a59166e3658ec8ccb6c3dc 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