[libc-commits] [libc] 71816ef - [libc][math] Qualify fdim funtions to constexpr (#194137)
via libc-commits
libc-commits at lists.llvm.org
Sat Apr 25 16:12:57 PDT 2026
Author: Kiriti Ponduri
Date: 2026-04-26T02:12:53+03:00
New Revision: 71816ef062df569c4a0e99204ab79a283bf1dda7
URL: https://github.com/llvm/llvm-project/commit/71816ef062df569c4a0e99204ab79a283bf1dda7
DIFF: https://github.com/llvm/llvm-project/commit/71816ef062df569c4a0e99204ab79a283bf1dda7.diff
LOG: [libc][math] Qualify fdim funtions to constexpr (#194137)
Signed-off-by: udaykiriti <udaykiriti624 at gmail.com>
Co-authored-by: Muhammad Bassiouni <60100307+bassiounix at users.noreply.github.com>
Added:
Modified:
libc/src/__support/FPUtil/BasicOperations.h
libc/src/__support/FPUtil/generic/add_sub.h
libc/src/__support/math/fdim.h
libc/src/__support/math/fdimbf16.h
libc/src/__support/math/fdimf.h
libc/src/__support/math/fdimf128.h
libc/src/__support/math/fdimf16.h
libc/src/__support/math/fdiml.h
libc/test/shared/CMakeLists.txt
libc/test/shared/shared_math_constexpr_test.cpp
Removed:
################################################################################
diff --git a/libc/src/__support/FPUtil/BasicOperations.h b/libc/src/__support/FPUtil/BasicOperations.h
index ee5c90a8f290f..1253359c53bbb 100644
--- a/libc/src/__support/FPUtil/BasicOperations.h
+++ b/libc/src/__support/FPUtil/BasicOperations.h
@@ -233,7 +233,7 @@ LIBC_INLINE T fminimum_mag_num(T x, T y) {
}
template <typename T, cpp::enable_if_t<cpp::is_floating_point_v<T>, int> = 0>
-LIBC_INLINE T fdim(T x, T y) {
+LIBC_INLINE T constexpr fdim(T x, T y) {
FPBits<T> bitx(x), bity(y);
if (bitx.is_nan()) {
diff --git a/libc/src/__support/FPUtil/generic/add_sub.h b/libc/src/__support/FPUtil/generic/add_sub.h
index 5e7df85a9cc76..6db5bcbb75020 100644
--- a/libc/src/__support/FPUtil/generic/add_sub.h
+++ b/libc/src/__support/FPUtil/generic/add_sub.h
@@ -114,10 +114,14 @@ add_or_sub(InType x, InType y) {
return y_bits.get_val();
} else {
+#ifdef LIBC_HAS_CONSTANT_EVALUATION
+ InType tmp = y;
+#else
// volatile prevents Clang from converting tmp to OutType and then
// immediately back to InType before negating it, resulting in double
// rounding.
volatile InType tmp = y;
+#endif // LIBC_HAS_CONSTANT_EVALUATION
if constexpr (IsSub)
tmp = -tmp;
return cast<OutType>(tmp);
@@ -155,7 +159,7 @@ add_or_sub(InType x, InType y) {
InFPBits max_bits(cpp::max(x_abs, y_abs));
InFPBits min_bits(cpp::min(x_abs, y_abs));
- InStorageType result_mant;
+ InStorageType result_mant{};
if (max_bits.is_subnormal()) {
// min_bits must be subnormal too.
diff --git a/libc/src/__support/math/fdim.h b/libc/src/__support/math/fdim.h
index 6b6def814a28a..24e5425237295 100644
--- a/libc/src/__support/math/fdim.h
+++ b/libc/src/__support/math/fdim.h
@@ -15,7 +15,9 @@
namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE double fdim(double x, double y) { return fputil::fdim(x, y); }
+LIBC_INLINE constexpr double fdim(double x, double y) {
+ return fputil::fdim(x, y);
+}
} // namespace math
} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/__support/math/fdimbf16.h b/libc/src/__support/math/fdimbf16.h
index 473a326b8c114..265f771648a17 100644
--- a/libc/src/__support/math/fdimbf16.h
+++ b/libc/src/__support/math/fdimbf16.h
@@ -16,7 +16,7 @@
namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE bfloat16 fdimbf16(bfloat16 x, bfloat16 y) {
+LIBC_INLINE constexpr bfloat16 fdimbf16(bfloat16 x, bfloat16 y) {
return fputil::fdim(x, y);
}
diff --git a/libc/src/__support/math/fdimf.h b/libc/src/__support/math/fdimf.h
index d837b5200de38..39e3050c9f311 100644
--- a/libc/src/__support/math/fdimf.h
+++ b/libc/src/__support/math/fdimf.h
@@ -15,7 +15,9 @@
namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE float fdimf(float x, float y) { return fputil::fdim(x, y); }
+LIBC_INLINE constexpr float fdimf(float x, float y) {
+ return fputil::fdim(x, y);
+}
} // namespace math
} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/__support/math/fdimf128.h b/libc/src/__support/math/fdimf128.h
index 02e4b821f2a4b..2537070633257 100644
--- a/libc/src/__support/math/fdimf128.h
+++ b/libc/src/__support/math/fdimf128.h
@@ -19,7 +19,7 @@
namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE float128 fdimf128(float128 x, float128 y) {
+LIBC_INLINE constexpr float128 fdimf128(float128 x, float128 y) {
return fputil::fdim(x, y);
}
diff --git a/libc/src/__support/math/fdimf16.h b/libc/src/__support/math/fdimf16.h
index b92ae6eae8c59..0a5142cafb8f9 100644
--- a/libc/src/__support/math/fdimf16.h
+++ b/libc/src/__support/math/fdimf16.h
@@ -19,7 +19,9 @@
namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE float16 fdimf16(float16 x, float16 y) { return fputil::fdim(x, y); }
+LIBC_INLINE constexpr float16 fdimf16(float16 x, float16 y) {
+ return fputil::fdim(x, y);
+}
} // namespace math
} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/__support/math/fdiml.h b/libc/src/__support/math/fdiml.h
index bc765951d4a4d..285c61910577e 100644
--- a/libc/src/__support/math/fdiml.h
+++ b/libc/src/__support/math/fdiml.h
@@ -15,7 +15,7 @@
namespace LIBC_NAMESPACE_DECL {
namespace math {
-LIBC_INLINE long double fdiml(long double x, long double y) {
+LIBC_INLINE constexpr long double fdiml(long double x, long double y) {
return fputil::fdim(x, y);
}
diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt
index 4a210c81b7a0c..8948186ec1775 100644
--- a/libc/test/shared/CMakeLists.txt
+++ b/libc/test/shared/CMakeLists.txt
@@ -309,6 +309,12 @@ add_fp_unittest(
libc.src.__support.math.ddivl
libc.src.__support.math.dmulf128
libc.src.__support.math.dmull
+ libc.src.__support.math.fdim
+ libc.src.__support.math.fdimbf16
+ libc.src.__support.math.fdimf
+ libc.src.__support.math.fdimf128
+ libc.src.__support.math.fdimf16
+ libc.src.__support.math.fdiml
libc.src.__support.math.fdiv
libc.src.__support.math.fdivf128
libc.src.__support.math.fdivl
diff --git a/libc/test/shared/shared_math_constexpr_test.cpp b/libc/test/shared/shared_math_constexpr_test.cpp
index 93050d14c858d..e3bfc65bd5211 100644
--- a/libc/test/shared/shared_math_constexpr_test.cpp
+++ b/libc/test/shared/shared_math_constexpr_test.cpp
@@ -18,6 +18,7 @@
static_assert(0.0 == LIBC_NAMESPACE::shared::ceil(0.0));
static_assert(0.0 == LIBC_NAMESPACE::shared::copysign(0.0, 0.0));
static_assert(1.0 == LIBC_NAMESPACE::shared::fabs(-1.0));
+static_assert(1.0 == LIBC_NAMESPACE::shared::fdim(1.0, 0.0));
static_assert(0.0f == LIBC_NAMESPACE::shared::fdiv(0.0, 1.0));
static_assert(1.0 == LIBC_NAMESPACE::shared::floor(1.2));
static_assert(0.0 == LIBC_NAMESPACE::shared::log(1.0));
@@ -29,6 +30,7 @@ static_assert(0.0 == LIBC_NAMESPACE::shared::log(1.0));
static_assert(0.0f == LIBC_NAMESPACE::shared::ceilf(0.0f));
static_assert(0.0f == LIBC_NAMESPACE::shared::copysignf(0.0f, 0.0f));
static_assert(1.0f == LIBC_NAMESPACE::shared::fabsf(-1.0f));
+static_assert(1.0f == LIBC_NAMESPACE::shared::fdimf(1.0f, 0.0f));
static_assert(0.0f == LIBC_NAMESPACE::shared::floorf(0.0f));
//===----------------------------------------------------------------------===//
@@ -40,6 +42,7 @@ static_assert(0.0f == LIBC_NAMESPACE::shared::floorf(0.0f));
static_assert(0.0f16 == LIBC_NAMESPACE::shared::ceilf16(0.0f16));
static_assert(0.0f16 == LIBC_NAMESPACE::shared::copysignf16(0.0f16, 0.0f16));
static_assert(1.0f16 == LIBC_NAMESPACE::shared::fabsf16(-1.0f16));
+static_assert(1.0f16 == LIBC_NAMESPACE::shared::fdimf16(1.0f16, 0.0f16));
static_assert(3.0f16 == LIBC_NAMESPACE::shared::floorf16(3.7f16));
#endif // LIBC_TYPES_HAS_FLOAT16
@@ -56,6 +59,7 @@ static_assert(0.0L == LIBC_NAMESPACE::shared::copysignl(0.0L, 0.0L));
static_assert(0.0 == LIBC_NAMESPACE::shared::ddivl(0.0L, 1.0L));
static_assert(0.0 == LIBC_NAMESPACE::shared::dmull(0.0L, 1.0L));
static_assert(1.0L == LIBC_NAMESPACE::shared::fabsl(-1.0L));
+static_assert(1.0L == LIBC_NAMESPACE::shared::fdiml(1.0L, 0.0L));
static_assert(0.0f == LIBC_NAMESPACE::shared::fdivl(0.0L, 1.0L));
static_assert(0.0L == LIBC_NAMESPACE::shared::floorl(0.0L));
@@ -77,6 +81,8 @@ static_assert(0.0 ==
LIBC_NAMESPACE::shared::ddivf128(float128(0.0), float128(1.0)));
static_assert(0.0 ==
LIBC_NAMESPACE::shared::dmulf128(float128(0.0), float128(1.0)));
+static_assert(float128(1.0) ==
+ LIBC_NAMESPACE::shared::fdimf128(float128(1.0), float128(0.0)));
static_assert(0.0f ==
LIBC_NAMESPACE::shared::fdivf128(float128(0.0), float128(1.0)));
static_assert(float128(0.0) ==
@@ -95,6 +101,8 @@ static_assert(bfloat16(1.0) ==
static_assert(bfloat16(0.0) ==
LIBC_NAMESPACE::shared::copysignbf16(bfloat16(0.0),
bfloat16(0.0)));
+static_assert(bfloat16(1.0) ==
+ LIBC_NAMESPACE::shared::fdimbf16(bfloat16(1.0), bfloat16(0.0)));
static_assert(bfloat16(0.0) ==
LIBC_NAMESPACE::shared::floorbf16(bfloat16(0.0f)));
static_assert(bfloat16(0.0) ==
More information about the libc-commits
mailing list