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

>From 535f95bdf1986c23a166ec2d25acda1e61935ffd Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Fri, 13 Mar 2026 11:05:59 +0100
Subject: [PATCH] libclc: Move edge case handling of trig functions

The explicit handling of nan is unnecessary. Clamp infinities
to nan at the input. This allows optimizations of the following
implementation code to take advantage of the knowledge that it
does not need to handle infinities.
---
 libclc/clc/lib/generic/math/clc_cos.inc | 13 ++++++-------
 libclc/clc/lib/generic/math/clc_sin.inc | 13 +++++++------
 libclc/clc/lib/generic/math/clc_tan.inc | 11 ++++++-----
 3 files changed, 19 insertions(+), 18 deletions(-)

diff --git a/libclc/clc/lib/generic/math/clc_cos.inc 
b/libclc/clc/lib/generic/math/clc_cos.inc
index 4b8108c086090..34cbbc69614a5 100644
--- a/libclc/clc/lib/generic/math/clc_cos.inc
+++ b/libclc/clc/lib/generic/math/clc_cos.inc
@@ -9,6 +9,8 @@
 #if __CLC_FPSIZE == 32
 
 _CLC_OVERLOAD _CLC_DEF __CLC_FLOATN __clc_cos(__CLC_FLOATN x) {
+  x = __clc_isinf(x) ? __CLC_GENTYPE_NAN : x;
+
   __CLC_FLOATN absx = __clc_fabs(x);
 
   __CLC_FLOATN r0, r1;
@@ -18,11 +20,7 @@ _CLC_OVERLOAD _CLC_DEF __CLC_FLOATN __clc_cos(__CLC_FLOATN 
x) {
   __CLC_FLOATN cc = __clc_cosf_piby4(r0, r1);
 
   __CLC_FLOATN c = (regn & 1) != 0 ? ss : cc;
-  c = __CLC_AS_FLOATN(__CLC_AS_INTN(c) ^ ((regn > 1) << 31));
-
-  c = __clc_select(c, __CLC_GENTYPE_NAN, __clc_isnan(x) || __clc_isinf(x));
-
-  return c;
+  return __CLC_AS_FLOATN(__CLC_AS_INTN(c) ^ ((regn > 1) << 31));
 }
 
 #elif __CLC_FPSIZE == 16
@@ -34,6 +32,8 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_cos(__CLC_GENTYPE 
x) {
 #elif __CLC_FPSIZE == 64
 
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_cos(__CLC_GENTYPE x) {
+  x = __clc_isinf(x) ? __CLC_GENTYPE_NAN : x;
+
   __CLC_GENTYPE absx = __clc_fabs(x);
 
   __CLC_BIT_INTN is_medium = absx < 0x1.0p+47;
@@ -56,8 +56,7 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_cos(__CLC_GENTYPE 
x) {
       __CLC_AS_LONGN(__CLC_CONVERT_BIT_INTN((regn & 1) != 0) ? sinval : 
cosval);
   c ^= __CLC_CONVERT_BIT_INTN(regn > 1) << 63;
 
-  return __clc_isnan(absx) | __clc_isinf(absx) ? __CLC_GENTYPE_NAN
-                                               : __CLC_AS_GENTYPE(c);
+  return __CLC_AS_GENTYPE(c);
 }
 
 #endif
diff --git a/libclc/clc/lib/generic/math/clc_sin.inc 
b/libclc/clc/lib/generic/math/clc_sin.inc
index 2018dcbe927a9..973833ba0c2fc 100644
--- a/libclc/clc/lib/generic/math/clc_sin.inc
+++ b/libclc/clc/lib/generic/math/clc_sin.inc
@@ -9,6 +9,8 @@
 #if __CLC_FPSIZE == 32
 
 _CLC_OVERLOAD _CLC_DEF __CLC_FLOATN __clc_sin(__CLC_FLOATN x) {
+  x = __clc_isinf(x) ? __CLC_GENTYPE_NAN : x;
+
   __CLC_FLOATN absx = __clc_fabs(x);
 
   __CLC_FLOATN r0, r1;
@@ -18,10 +20,8 @@ _CLC_OVERLOAD _CLC_DEF __CLC_FLOATN __clc_sin(__CLC_FLOATN 
x) {
   __CLC_FLOATN cc = __clc_cosf_piby4(r0, r1);
 
   __CLC_FLOATN s = (regn & 1) != 0 ? cc : ss;
-  s = __CLC_AS_FLOATN(__CLC_AS_INTN(s) ^ ((regn > 1) << 31) ^
-                      (__CLC_AS_INTN(x) ^ __CLC_AS_INTN(absx)));
-
-  return __clc_select(s, __CLC_GENTYPE_NAN, __clc_isnan(x) || __clc_isinf(x));
+  return __CLC_AS_FLOATN(__CLC_AS_INTN(s) ^ ((regn > 1) << 31) ^
+                         (__CLC_AS_INTN(x) ^ __CLC_AS_INTN(absx)));
 }
 
 #elif __CLC_FPSIZE == 16
@@ -33,6 +33,8 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_sin(__CLC_GENTYPE 
x) {
 #elif __CLC_FPSIZE == 64
 
 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_sin(__CLC_GENTYPE x) {
+  x = __clc_isinf(x) ? __CLC_GENTYPE_NAN : x;
+
   __CLC_GENTYPE absx = __clc_fabs(x);
 
   __CLC_BIT_INTN is_medium = absx < 0x1.0p+47;
@@ -56,8 +58,7 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_sin(__CLC_GENTYPE 
x) {
   s ^= (__CLC_CONVERT_BIT_INTN(regn > 1) << 63) ^
        (__CLC_CONVERT_BIT_INTN(x < 0.0) << 63);
 
-  return __clc_isinf(x) | __clc_isnan(x) ? __CLC_GENTYPE_NAN
-                                         : __CLC_AS_GENTYPE(s);
+  return __CLC_AS_GENTYPE(s);
 }
 
 #endif
diff --git a/libclc/clc/lib/generic/math/clc_tan.inc 
b/libclc/clc/lib/generic/math/clc_tan.inc
index 79e36ea07e13c..f1c3c0de11bc3 100644
--- a/libclc/clc/lib/generic/math/clc_tan.inc
+++ b/libclc/clc/lib/generic/math/clc_tan.inc
@@ -9,6 +9,8 @@
 #if __CLC_FPSIZE == 32
 
 _CLC_DEF _CLC_OVERLOAD __CLC_GENTYPE __clc_tan(__CLC_GENTYPE x) {
+  x = __clc_isinf(x) ? __CLC_GENTYPE_NAN : x;
+
   __CLC_GENTYPE absx = __clc_fabs(x);
   __CLC_UINTN x_signbit = __CLC_AS_UINTN(x) & SIGNBIT_SP32;
 
@@ -16,14 +18,14 @@ _CLC_DEF _CLC_OVERLOAD __CLC_GENTYPE 
__clc_tan(__CLC_GENTYPE x) {
   __CLC_INTN regn = __clc_argReductionS(&r0, &r1, absx);
 
   __CLC_GENTYPE t = __clc_tanf_piby4(r0 + r1, regn);
-  t = __CLC_AS_GENTYPE(__CLC_AS_UINTN(t) ^ x_signbit);
-
-  return __clc_select(t, __CLC_GENTYPE_NAN, __clc_isnan(x) || __clc_isinf(x));
+  return __CLC_AS_GENTYPE(__CLC_AS_UINTN(t) ^ x_signbit);
 }
 
 #elif __CLC_FPSIZE == 64
 
 _CLC_DEF _CLC_OVERLOAD __CLC_GENTYPE __clc_tan(__CLC_GENTYPE x) {
+  x = __clc_isinf(x) ? __CLC_GENTYPE_NAN : x;
+
   __CLC_GENTYPE y = __clc_fabs(x);
 
   __CLC_BIT_INTN is_medium = y < 0x1.0p+30;
@@ -45,8 +47,7 @@ _CLC_DEF _CLC_OVERLOAD __CLC_GENTYPE __clc_tan(__CLC_GENTYPE 
x) {
       __CLC_AS_LONGN(__CLC_CONVERT_BIT_INTN((regn & 1) != 0) ? tail : lead);
   t ^= __CLC_CONVERT_BIT_INTN(x < 0.0) << 63;
 
-  return __clc_isnan(x) || __clc_isinf(x) ? __CLC_GENTYPE_NAN
-                                          : __CLC_AS_GENTYPE(t);
+  return __CLC_AS_GENTYPE(t);
 }
 
 #elif __CLC_FPSIZE == 16

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to