[llvm-branch-commits] [libclc] libclc: Really implement denormal config checks (PR #187356)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Mar 19 01:02:37 PDT 2026
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/187356
>From b9a7bc634b385796d1576e9317ec7c1c64572d9f Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Wed, 18 Mar 2026 18:41:22 +0100
Subject: [PATCH] libclc: Really implement denormal config checks
These should be implementable by checking the behavior of
the canonicalize intrinsic. Hack around spirv still failing
on canonicalize by overriding and assuming DAZ for float.
---
.../include/clc/math/clc_subnormal_config.h | 3 ++
libclc/clc/include/clc/math/gentype.inc | 8 +++++-
libclc/clc/lib/generic/subnormal_config.cl | 28 +++++++++++++++++--
libclc/clc/lib/spirv/CMakeLists.txt | 1 +
libclc/clc/lib/spirv/subnormal_config.cl | 19 +++++++++++++
5 files changed, 55 insertions(+), 4 deletions(-)
create mode 100644 libclc/clc/lib/spirv/subnormal_config.cl
diff --git a/libclc/clc/include/clc/math/clc_subnormal_config.h b/libclc/clc/include/clc/math/clc_subnormal_config.h
index 3b6298e621f0e..5c73bfaabaea2 100644
--- a/libclc/clc/include/clc/math/clc_subnormal_config.h
+++ b/libclc/clc/include/clc/math/clc_subnormal_config.h
@@ -10,7 +10,10 @@
#include "clc/clcfunc.h"
+#ifdef cl_khr_fp16
_CLC_DECL bool __clc_denormals_are_zero_fp16();
+#endif
+
_CLC_DECL bool __clc_denormals_are_zero_fp32();
_CLC_DECL bool __clc_denormals_are_zero_fp64();
diff --git a/libclc/clc/include/clc/math/gentype.inc b/libclc/clc/include/clc/math/gentype.inc
index c8d0c8a397fa2..f36a5b1a00c0f 100644
--- a/libclc/clc/include/clc/math/gentype.inc
+++ b/libclc/clc/include/clc/math/gentype.inc
@@ -77,10 +77,11 @@
#define __CLC_GENTYPE_INF (__CLC_GENTYPE) INFINITY
#define __CLC_GENTYPE_MIN (__CLC_GENTYPE) FLT_MIN
#define __CLC_GENTYPE_TRUE_MIN (__CLC_GENTYPE) FLT_TRUE_MIN
-
#define __CLC_S_GENTYPE __CLC_XCONCAT(int, __CLC_VECSIZE)
#define __CLC_U_GENTYPE __CLC_XCONCAT(uint, __CLC_VECSIZE)
+#define __CLC_GENTYPE_DENORMS_ARE_ZERO __clc_denormals_are_zero_fp32()
+
#define __CLC_GENTYPE float
#define __CLC_BIT_INT int
#define __CLC_BIT_INTN int
@@ -143,6 +144,7 @@
#undef __CLC_GENTYPE_NAN
#undef __CLC_GENTYPE_MIN
#undef __CLC_GENTYPE_TRUE_MIN
+#undef __CLC_GENTYPE_DENORMS_ARE_ZERO
#undef __CLC_FP_LIT
#undef __CLC_FPSIZE
#undef __CLC_SCALAR_GENTYPE
@@ -159,6 +161,7 @@
#define __CLC_GENTYPE_NAN (__CLC_GENTYPE) DBL_NAN
#define __CLC_GENTYPE_MIN (__CLC_GENTYPE) DBL_MIN
#define __CLC_GENTYPE_TRUE_MIN (__CLC_GENTYPE) DBL_TRUE_MIN
+#define __CLC_GENTYPE_DENORMS_ARE_ZERO __clc_denormals_are_zero_fp64()
#define __CLC_S_GENTYPE __CLC_XCONCAT(long, __CLC_VECSIZE)
#define __CLC_U_GENTYPE __CLC_XCONCAT(ulong, __CLC_VECSIZE)
@@ -225,6 +228,7 @@
#undef __CLC_GENTYPE_NAN
#undef __CLC_GENTYPE_MIN
#undef __CLC_GENTYPE_TRUE_MIN
+#undef __CLC_GENTYPE_DENORMS_ARE_ZERO
#undef __CLC_FP_LIT
#undef __CLC_FPSIZE
#undef __CLC_SCALAR_GENTYPE
@@ -241,6 +245,7 @@
#define __CLC_GENTYPE_NAN (__CLC_GENTYPE) HALF_NAN
#define __CLC_GENTYPE_MIN (__CLC_GENTYPE) HALF_MIN
#define __CLC_GENTYPE_TRUE_MIN (__CLC_GENTYPE) HALF_TRUE_MIN
+#define __CLC_GENTYPE_DENORMS_ARE_ZERO __clc_denormals_are_zero_fp16()
#define __CLC_S_GENTYPE __CLC_XCONCAT(short, __CLC_VECSIZE)
#define __CLC_U_GENTYPE __CLC_XCONCAT(ushort, __CLC_VECSIZE)
@@ -307,6 +312,7 @@
#undef __CLC_GENTYPE_NAN
#undef __CLC_GENTYPE_MIN
#undef __CLC_GENTYPE_TRUE_MIN
+#undef __CLC_GENTYPE_DENORMS_ARE_ZERO
#undef __CLC_FP_LIT
#undef __CLC_FPSIZE
#undef __CLC_SCALAR_GENTYPE
diff --git a/libclc/clc/lib/generic/subnormal_config.cl b/libclc/clc/lib/generic/subnormal_config.cl
index c80d48802c890..b3cc8248fb9cb 100644
--- a/libclc/clc/lib/generic/subnormal_config.cl
+++ b/libclc/clc/lib/generic/subnormal_config.cl
@@ -6,8 +6,30 @@
//
//===----------------------------------------------------------------------===//
+#include "clc/float/definitions.h"
#include "clc/math/clc_subnormal_config.h"
-_CLC_DEF bool __clc_denormals_are_zero_fp16() { return false; }
-_CLC_DEF bool __clc_denormals_are_zero_fp32() { return true; }
-_CLC_DEF bool __clc_denormals_are_zero_fp64() { return false; }
+#ifdef cl_khr_fp16
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_DEF bool __clc_denormals_are_zero_fp16() {
+ return __builtin_isfpclass(__builtin_canonicalizef16(HALF_TRUE_MIN),
+ __FPCLASS_POSZERO);
+}
+
+#endif
+
+_CLC_DEF bool __clc_denormals_are_zero_fp32() {
+ return __builtin_isfpclass(__builtin_canonicalizef(FLT_TRUE_MIN),
+ __FPCLASS_POSZERO);
+}
+
+#ifdef cl_khr_fp64
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+_CLC_DEF bool __clc_denormals_are_zero_fp64() {
+ return __builtin_isfpclass(__builtin_canonicalize(DBL_TRUE_MIN),
+ __FPCLASS_POSZERO);
+}
+
+#endif
diff --git a/libclc/clc/lib/spirv/CMakeLists.txt b/libclc/clc/lib/spirv/CMakeLists.txt
index 8bf5c29be8da3..b7481615b9414 100644
--- a/libclc/clc/lib/spirv/CMakeLists.txt
+++ b/libclc/clc/lib/spirv/CMakeLists.txt
@@ -2,4 +2,5 @@ libclc_configure_source_list(CLC_SPIRV_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}
math/clc_fmax.cl
math/clc_fmin.cl
+ subnormal_config.cl
)
diff --git a/libclc/clc/lib/spirv/subnormal_config.cl b/libclc/clc/lib/spirv/subnormal_config.cl
new file mode 100644
index 0000000000000..7c2e69aab86ec
--- /dev/null
+++ b/libclc/clc/lib/spirv/subnormal_config.cl
@@ -0,0 +1,19 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// FIXME: These overrides are a workaround for canonicalize not working.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clc/math/clc_subnormal_config.h"
+
+_CLC_DEF bool __clc_denormals_are_zero_fp16() { return false; }
+
+_CLC_DEF bool __clc_denormals_are_zero_fp32() { return true; }
+
+_CLC_DEF bool __clc_denormals_are_zero_fp64() { return false; }
More information about the llvm-branch-commits
mailing list