[libc-commits] [libc] [libc][math] Qualify setpayload functions to constexpr (PR #195582)

via libc-commits libc-commits at lists.llvm.org
Sun May 3 21:50:37 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libc

Author: Kiriti Ponduri  (udaykiriti)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/195582.diff


9 Files Affected:

- (modified) libc/src/__support/FPUtil/BasicOperations.h (+1-1) 
- (modified) libc/src/__support/math/setpayload.h (+1-1) 
- (modified) libc/src/__support/math/setpayloadbf16.h (+1-1) 
- (modified) libc/src/__support/math/setpayloadf.h (+1-1) 
- (modified) libc/src/__support/math/setpayloadf128.h (+1-1) 
- (modified) libc/src/__support/math/setpayloadf16.h (+1-1) 
- (modified) libc/src/__support/math/setpayloadl.h (+1-1) 
- (modified) libc/test/shared/CMakeLists.txt (+6) 
- (modified) libc/test/shared/shared_math_constexpr_test.cpp (+24) 


``````````diff
diff --git a/libc/src/__support/FPUtil/BasicOperations.h b/libc/src/__support/FPUtil/BasicOperations.h
index e6f5f29e73726..54295fdb3e52f 100644
--- a/libc/src/__support/FPUtil/BasicOperations.h
+++ b/libc/src/__support/FPUtil/BasicOperations.h
@@ -386,7 +386,7 @@ getpayload(T x) {
 }
 
 template <bool IsSignaling, typename T>
-LIBC_INLINE cpp::enable_if_t<cpp::is_floating_point_v<T>, bool>
+LIBC_INLINE constexpr cpp::enable_if_t<cpp::is_floating_point_v<T>, bool>
 setpayload(T &res, T pl) {
   using FPBits = FPBits<T>;
   FPBits pl_bits(pl);
diff --git a/libc/src/__support/math/setpayload.h b/libc/src/__support/math/setpayload.h
index f9fa79ce76e1d..d0226107a3447 100644
--- a/libc/src/__support/math/setpayload.h
+++ b/libc/src/__support/math/setpayload.h
@@ -16,7 +16,7 @@ namespace LIBC_NAMESPACE_DECL {
 
 namespace math {
 
-LIBC_INLINE int setpayload(double *res, double pl) {
+LIBC_INLINE constexpr int setpayload(double *res, double pl) {
   return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl));
 }
 
diff --git a/libc/src/__support/math/setpayloadbf16.h b/libc/src/__support/math/setpayloadbf16.h
index 31e02eb4f7ccb..5dcea9894f1e6 100644
--- a/libc/src/__support/math/setpayloadbf16.h
+++ b/libc/src/__support/math/setpayloadbf16.h
@@ -17,7 +17,7 @@ namespace LIBC_NAMESPACE_DECL {
 
 namespace math {
 
-LIBC_INLINE int setpayloadbf16(bfloat16 *res, bfloat16 pl) {
+LIBC_INLINE constexpr int setpayloadbf16(bfloat16 *res, bfloat16 pl) {
   return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl));
 }
 
diff --git a/libc/src/__support/math/setpayloadf.h b/libc/src/__support/math/setpayloadf.h
index 2431f253956a1..1a90207299d3a 100644
--- a/libc/src/__support/math/setpayloadf.h
+++ b/libc/src/__support/math/setpayloadf.h
@@ -16,7 +16,7 @@ namespace LIBC_NAMESPACE_DECL {
 
 namespace math {
 
-LIBC_INLINE int setpayloadf(float *res, float pl) {
+LIBC_INLINE constexpr int setpayloadf(float *res, float pl) {
   return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl));
 }
 
diff --git a/libc/src/__support/math/setpayloadf128.h b/libc/src/__support/math/setpayloadf128.h
index cf301e92c69b3..bacd17af658e0 100644
--- a/libc/src/__support/math/setpayloadf128.h
+++ b/libc/src/__support/math/setpayloadf128.h
@@ -20,7 +20,7 @@ namespace LIBC_NAMESPACE_DECL {
 
 namespace math {
 
-LIBC_INLINE int setpayloadf128(float128 *res, float128 pl) {
+LIBC_INLINE constexpr int setpayloadf128(float128 *res, float128 pl) {
   return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl));
 }
 
diff --git a/libc/src/__support/math/setpayloadf16.h b/libc/src/__support/math/setpayloadf16.h
index 4a417f0c525eb..3595f44b83b0a 100644
--- a/libc/src/__support/math/setpayloadf16.h
+++ b/libc/src/__support/math/setpayloadf16.h
@@ -20,7 +20,7 @@ namespace LIBC_NAMESPACE_DECL {
 
 namespace math {
 
-LIBC_INLINE int setpayloadf16(float16 *res, float16 pl) {
+LIBC_INLINE constexpr int setpayloadf16(float16 *res, float16 pl) {
   return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl));
 }
 
diff --git a/libc/src/__support/math/setpayloadl.h b/libc/src/__support/math/setpayloadl.h
index d5ed051766827..8cc754b044168 100644
--- a/libc/src/__support/math/setpayloadl.h
+++ b/libc/src/__support/math/setpayloadl.h
@@ -16,7 +16,7 @@ namespace LIBC_NAMESPACE_DECL {
 
 namespace math {
 
-LIBC_INLINE int setpayloadl(long double *res, long double pl) {
+LIBC_INLINE constexpr int setpayloadl(long double *res, long double pl) {
   return static_cast<int>(fputil::setpayload</*IsSignaling=*/false>(*res, pl));
 }
 
diff --git a/libc/test/shared/CMakeLists.txt b/libc/test/shared/CMakeLists.txt
index f632843d31284..16235bd4bf1e5 100644
--- a/libc/test/shared/CMakeLists.txt
+++ b/libc/test/shared/CMakeLists.txt
@@ -678,6 +678,12 @@ add_fp_unittest(
     libc.src.__support.math.scalbnf128
     libc.src.__support.math.scalbnf16
     libc.src.__support.math.scalbnl
+    libc.src.__support.math.setpayload
+    libc.src.__support.math.setpayloadbf16
+    libc.src.__support.math.setpayloadf
+    libc.src.__support.math.setpayloadf128
+    libc.src.__support.math.setpayloadf16
+    libc.src.__support.math.setpayloadl
     libc.src.__support.math.sqrtl
     libc.src.__support.math.ufromfp
     libc.src.__support.math.ufromfpbf16
diff --git a/libc/test/shared/shared_math_constexpr_test.cpp b/libc/test/shared/shared_math_constexpr_test.cpp
index 964c1f9e97f3a..2185540173bd2 100644
--- a/libc/test/shared/shared_math_constexpr_test.cpp
+++ b/libc/test/shared/shared_math_constexpr_test.cpp
@@ -62,6 +62,10 @@ static_assert(0.0 == [] {
 static_assert(0.0 == LIBC_NAMESPACE::shared::ldexp(0.0, 0.0));
 static_assert(0.0 == LIBC_NAMESPACE::shared::scalbln(0.0, 0.0));
 static_assert(0.0 == LIBC_NAMESPACE::shared::scalbn(0.0, 0.0));
+static_assert(0 == [] {
+  double res = 0.0;
+  return LIBC_NAMESPACE::shared::setpayload(&res, 0.0);
+}());
 static_assert(0.0 == [] {
   int exp{};
   return LIBC_NAMESPACE::shared::frexp(0.0, &exp);
@@ -122,6 +126,10 @@ static_assert(0.0f == [] {
 }());
 static_assert(0.0f == LIBC_NAMESPACE::shared::scalblnf(0.0f, 0.0));
 static_assert(0.0f == LIBC_NAMESPACE::shared::scalbnf(0.0f, 0.0));
+static_assert(0 == [] {
+  float res = 0.0f;
+  return LIBC_NAMESPACE::shared::setpayloadf(&res, 0.0f);
+}());
 static_assert(0.0f == LIBC_NAMESPACE::shared::fmul(0.0, 0.0));
 static_assert(0.0f == LIBC_NAMESPACE::shared::fsub(0.0, 0.0));
 static_assert(0LL == LIBC_NAMESPACE::shared::llrintf(0.0f));
@@ -200,6 +208,10 @@ static_assert(0.0f16 == [] {
 }());
 static_assert(0.0f16 == LIBC_NAMESPACE::shared::scalblnf16(0.0f16, 0.0));
 static_assert(0.0f16 == LIBC_NAMESPACE::shared::scalbnf16(0.0f16, 0.0));
+static_assert(0 == [] {
+  float16 res = 0.0f16;
+  return LIBC_NAMESPACE::shared::setpayloadf16(&res, 0.0f16);
+}());
 static_assert(0LL == LIBC_NAMESPACE::shared::llrintf16(0.0));
 static_assert(0LL == LIBC_NAMESPACE::shared::llroundf16(0.0f16));
 static_assert(0L == LIBC_NAMESPACE::shared::lrintf16(0.0f16));
@@ -267,6 +279,10 @@ static_assert(0.0L == [] {
 static_assert(0.0L == LIBC_NAMESPACE::shared::ldexpl(0.0L, 0.0));
 static_assert(0.0L == LIBC_NAMESPACE::shared::scalblnl(0.0L, 0.0));
 static_assert(0.0L == LIBC_NAMESPACE::shared::scalbnl(0.0L, 0.0));
+static_assert(0 == [] {
+  long double res = 0.0L;
+  return LIBC_NAMESPACE::shared::setpayloadl(&res, 0.0L);
+}());
 static_assert(0.0f == LIBC_NAMESPACE::shared::fmull(0.0L, 0.0L));
 static_assert(0.0f == LIBC_NAMESPACE::shared::fsubl(0.0L, 0.0L));
 static_assert(0.0L == [] {
@@ -375,6 +391,10 @@ static_assert(float128(0.0) ==
               LIBC_NAMESPACE::shared::scalblnf128(float128(0.0), 0.0));
 static_assert(float128(0.0) ==
               LIBC_NAMESPACE::shared::scalbnf128(float128(0.0), 0.0));
+static_assert(0 == [] {
+  float128 res = float128(0.0);
+  return LIBC_NAMESPACE::shared::setpayloadf128(&res, float128(0.0));
+}());
 static_assert(0.0f ==
               LIBC_NAMESPACE::shared::fmulf128(float128(0.0), float128(0.0)));
 static_assert(0.0f ==
@@ -480,6 +500,10 @@ static_assert(bfloat16(0.0) ==
               LIBC_NAMESPACE::shared::scalblnbf16(bfloat16(0.0), 0.0));
 static_assert(bfloat16(0.0) ==
               LIBC_NAMESPACE::shared::scalbnbf16(bfloat16(0.0), 0.0));
+static_assert(0 == [] {
+  bfloat16 res = bfloat16(0.0);
+  return LIBC_NAMESPACE::shared::setpayloadbf16(&res, bfloat16(0.0));
+}());
 static_assert(bfloat16(0.0) == [] {
   int exp{};
   return LIBC_NAMESPACE::shared::frexpbf16(bfloat16(0.0), &exp);

``````````

</details>


https://github.com/llvm/llvm-project/pull/195582


More information about the libc-commits mailing list