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
