https://github.com/wenju-he created 
https://github.com/llvm/llvm-project/pull/177928

MATH_RECIP expands to 1.0f / x, which is not a reciprocal. Replace it with 
__clc_native_recip in atan/atanpi/atan2/atan2pi/cos/ cospi/sin/sinpi/rootn/tan 
float builtins.
Change to bitcode:
  %27 = fdiv float 1.000000e+00, %26, !fpmath !23
->
  %27 = fdiv arcp afn float 1.000000e+00, %26, !fpmath !23

The new code still passes OpenCL CTS math_brute_force on intel gpu.

>From af7660d1e2b122a22e54505c26d494ffda5de2bb Mon Sep 17 00:00:00 2001
From: Wenju He <[email protected]>
Date: Mon, 26 Jan 2026 12:03:04 +0100
Subject: [PATCH] [libclc] Use native reciprocal in float trig and rootn paths

MATH_RECIP expands to 1.0f / x, which is not a reciprocal.
Replace it with __clc_native_recip in atan/atanpi/atan2/atan2pi/cos/
cospi/sin/sinpi/rootn/tan float builtins.
Change to bitcode:
  %27 = fdiv float 1.000000e+00, %26, !fpmath !23
->
  %27 = fdiv arcp afn float 1.000000e+00, %26, !fpmath !23

The new code still passes OpenCL CTS math_brute_force on intel gpu.
---
 libclc/clc/lib/generic/math/clc_atan.cl            | 1 +
 libclc/clc/lib/generic/math/clc_atan.inc           | 2 +-
 libclc/clc/lib/generic/math/clc_atan2.cl           | 1 +
 libclc/clc/lib/generic/math/clc_atan2.inc          | 2 +-
 libclc/clc/lib/generic/math/clc_atan2pi.cl         | 1 +
 libclc/clc/lib/generic/math/clc_atan2pi.inc        | 2 +-
 libclc/clc/lib/generic/math/clc_atanpi.cl          | 1 +
 libclc/clc/lib/generic/math/clc_atanpi.inc         | 2 +-
 libclc/clc/lib/generic/math/clc_rootn.cl           | 1 +
 libclc/clc/lib/generic/math/clc_rootn.inc          | 2 +-
 libclc/clc/lib/generic/math/clc_sincos_helpers.cl  | 1 +
 libclc/clc/lib/generic/math/clc_sincos_helpers.inc | 2 +-
 12 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/libclc/clc/lib/generic/math/clc_atan.cl 
b/libclc/clc/lib/generic/math/clc_atan.cl
index d960f75baca2b..073a16ce9114d 100644
--- a/libclc/clc/lib/generic/math/clc_atan.cl
+++ b/libclc/clc/lib/generic/math/clc_atan.cl
@@ -12,6 +12,7 @@
 #include <clc/math/clc_fabs.h>
 #include <clc/math/clc_fma.h>
 #include <clc/math/clc_mad.h>
+#include <clc/math/clc_native_recip.h>
 #include <clc/math/math.h>
 #include <clc/relational/clc_isnan.h>
 
diff --git a/libclc/clc/lib/generic/math/clc_atan.inc 
b/libclc/clc/lib/generic/math/clc_atan.inc
index 23136dbd74e02..3deff0ce9a16e 100644
--- a/libclc/clc/lib/generic/math/clc_atan.inc
+++ b/libclc/clc/lib/generic/math/clc_atan.inc
@@ -28,7 +28,7 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_atan(__CLC_GENTYPE 
x) {
   // Reduce arguments 2^-19 <= |x| < 2^26
 
   // 39/16 <= x < 2^26
-  x = -MATH_RECIP(v);
+  x = -__clc_native_recip(v);
   __CLC_GENTYPE c = 1.57079632679489655800f; // atan(infinity)
 
   // 19/16 <= x < 39/16
diff --git a/libclc/clc/lib/generic/math/clc_atan2.cl 
b/libclc/clc/lib/generic/math/clc_atan2.cl
index b10bf32333a32..196dd16bc7f57 100644
--- a/libclc/clc/lib/generic/math/clc_atan2.cl
+++ b/libclc/clc/lib/generic/math/clc_atan2.cl
@@ -14,6 +14,7 @@
 #include <clc/math/clc_fma.h>
 #include <clc/math/clc_ldexp.h>
 #include <clc/math/clc_mad.h>
+#include <clc/math/clc_native_recip.h>
 #include <clc/math/math.h>
 #include <clc/math/tables.h>
 #include <clc/relational/clc_isinf.h>
diff --git a/libclc/clc/lib/generic/math/clc_atan2.inc 
b/libclc/clc/lib/generic/math/clc_atan2.inc
index 19eaaeee0092d..e321affb7b61e 100644
--- a/libclc/clc/lib/generic/math/clc_atan2.inc
+++ b/libclc/clc/lib/generic/math/clc_atan2.inc
@@ -47,7 +47,7 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE 
__clc_atan2(__CLC_GENTYPE y,
 #endif
 
   // Octant 0 result
-  __CLC_GENTYPE a = __clc_mad(p, MATH_RECIP(q), vbyu);
+  __CLC_GENTYPE a = __clc_mad(p, __clc_native_recip(q), vbyu);
 
   // Fix up 3 other octants
   __CLC_GENTYPE at = piby2 - a;
diff --git a/libclc/clc/lib/generic/math/clc_atan2pi.cl 
b/libclc/clc/lib/generic/math/clc_atan2pi.cl
index 7f75c11d15d7b..d45c3f8100ddb 100644
--- a/libclc/clc/lib/generic/math/clc_atan2pi.cl
+++ b/libclc/clc/lib/generic/math/clc_atan2pi.cl
@@ -14,6 +14,7 @@
 #include <clc/math/clc_fma.h>
 #include <clc/math/clc_ldexp.h>
 #include <clc/math/clc_mad.h>
+#include <clc/math/clc_native_recip.h>
 #include <clc/math/math.h>
 #include <clc/math/tables.h>
 #include <clc/relational/clc_isinf.h>
diff --git a/libclc/clc/lib/generic/math/clc_atan2pi.inc 
b/libclc/clc/lib/generic/math/clc_atan2pi.inc
index 9f901947887d8..70d75d8bf68fb 100644
--- a/libclc/clc/lib/generic/math/clc_atan2pi.inc
+++ b/libclc/clc/lib/generic/math/clc_atan2pi.inc
@@ -31,7 +31,7 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE 
__clc_atan2pi(__CLC_GENTYPE y,
       __clc_mad(vbyu2, __clc_mad(vbyu2, 0x1.1a714cp-2f, 0x1.287c56p+0f), 1.0f);
 
   // Octant 0 result
-  __CLC_GENTYPE a = MATH_DIVIDE(__clc_mad(p, MATH_RECIP(q), vbyu), pi);
+  __CLC_GENTYPE a = MATH_DIVIDE(__clc_mad(p, __clc_native_recip(q), vbyu), pi);
 
   // Fix up 3 other octants
   __CLC_GENTYPE at = 0.5f - a;
diff --git a/libclc/clc/lib/generic/math/clc_atanpi.cl 
b/libclc/clc/lib/generic/math/clc_atanpi.cl
index fee72aa7efb47..6cbb28266557d 100644
--- a/libclc/clc/lib/generic/math/clc_atanpi.cl
+++ b/libclc/clc/lib/generic/math/clc_atanpi.cl
@@ -12,6 +12,7 @@
 #include <clc/math/clc_fabs.h>
 #include <clc/math/clc_fma.h>
 #include <clc/math/clc_mad.h>
+#include <clc/math/clc_native_recip.h>
 #include <clc/math/math.h>
 #include <clc/relational/clc_isnan.h>
 
diff --git a/libclc/clc/lib/generic/math/clc_atanpi.inc 
b/libclc/clc/lib/generic/math/clc_atanpi.inc
index fd25a586cf527..8a649b85340fd 100644
--- a/libclc/clc/lib/generic/math/clc_atanpi.inc
+++ b/libclc/clc/lib/generic/math/clc_atanpi.inc
@@ -30,7 +30,7 @@ _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE 
__clc_atanpi(__CLC_GENTYPE x) {
   // Reduce arguments 2^-19 <= |x| < 2^26
 
   // 39/16 <= x < 2^26
-  x = -MATH_RECIP(v);
+  x = -__clc_native_recip(v);
   __CLC_GENTYPE c = 1.57079632679489655800f; // atan(infinity)
 
   // 19/16 <= x < 39/16
diff --git a/libclc/clc/lib/generic/math/clc_rootn.cl 
b/libclc/clc/lib/generic/math/clc_rootn.cl
index da397cf66da62..5f6c90f2c3eb7 100644
--- a/libclc/clc/lib/generic/math/clc_rootn.cl
+++ b/libclc/clc/lib/generic/math/clc_rootn.cl
@@ -13,6 +13,7 @@
 #include <clc/math/clc_fma.h>
 #include <clc/math/clc_ldexp.h>
 #include <clc/math/clc_mad.h>
+#include <clc/math/clc_native_recip.h>
 #include <clc/math/clc_subnormal_config.h>
 #include <clc/math/math.h>
 #include <clc/math/tables.h>
diff --git a/libclc/clc/lib/generic/math/clc_rootn.inc 
b/libclc/clc/lib/generic/math/clc_rootn.inc
index fd3d0becb0dff..c83b66cb811ee 100644
--- a/libclc/clc/lib/generic/math/clc_rootn.inc
+++ b/libclc/clc/lib/generic/math/clc_rootn.inc
@@ -54,7 +54,7 @@
 
 _CLC_DEF _CLC_OVERLOAD __CLC_GENTYPE __clc_rootn(__CLC_GENTYPE x,
                                                  __CLC_INTN ny) {
-  __CLC_GENTYPE y = MATH_RECIP(__CLC_CONVERT_GENTYPE(ny));
+  __CLC_GENTYPE y = __clc_native_recip(__CLC_CONVERT_GENTYPE(ny));
 
   __CLC_INTN ix = __CLC_AS_INTN(x);
   __CLC_INTN ax = ix & EXSIGNBIT_SP32;
diff --git a/libclc/clc/lib/generic/math/clc_sincos_helpers.cl 
b/libclc/clc/lib/generic/math/clc_sincos_helpers.cl
index 19705c42f6f07..cd81f9c5e89f8 100644
--- a/libclc/clc/lib/generic/math/clc_sincos_helpers.cl
+++ b/libclc/clc/lib/generic/math/clc_sincos_helpers.cl
@@ -13,6 +13,7 @@
 #include <clc/math/clc_fma.h>
 #include <clc/math/clc_mad.h>
 #include <clc/math/clc_native_divide.h>
+#include <clc/math/clc_native_recip.h>
 #include <clc/math/clc_trunc.h>
 #include <clc/math/math.h>
 
diff --git a/libclc/clc/lib/generic/math/clc_sincos_helpers.inc 
b/libclc/clc/lib/generic/math/clc_sincos_helpers.inc
index 2a71b5626ccc5..aa90e157141a2 100644
--- a/libclc/clc/lib/generic/math/clc_sincos_helpers.inc
+++ b/libclc/clc/lib/generic/math/clc_sincos_helpers.inc
@@ -125,7 +125,7 @@ _CLC_DEF _CLC_OVERLOAD __CLC_FLOATN 
__clc_tanf_piby4(__CLC_FLOATN x,
       1.15588821434688393452299f);
 
   __CLC_FLOATN t = __clc_mad(x * r, __clc_native_divide(a, b), x);
-  __CLC_FLOATN tr = -MATH_RECIP(t);
+  __CLC_FLOATN tr = -__clc_native_recip(t);
 
   return (regn & 1) != 0 ? tr : t;
 }

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

Reply via email to