[clang] [clang] Constant evaluation support for `__builtin_copysign{,f,l}` (PR #225167)
Lucas Mellone via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 22 01:42:14 PDT 2026
https://github.com/lknknm updated https://github.com/llvm/llvm-project/pull/225167
>From 888c5180303853f772d911248891a7e43c033051 Mon Sep 17 00:00:00 2001
From: Lucas Mellone <github.snugness349 at passinbox.com>
Date: Sat, 19 Sep 2026 18:27:51 +0200
Subject: [PATCH 1/7] copysign to ExprConstant
---
clang/include/clang/Basic/Builtins.td | 1 -
clang/lib/AST/ExprConstant.cpp | 1 +
2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td
index 90340ad7f812c..31f235c490e9a 100644
--- a/clang/include/clang/Basic/Builtins.td
+++ b/clang/include/clang/Basic/Builtins.td
@@ -4056,7 +4056,6 @@ def Copysign : FPMathTemplate, LibBuiltin<"math.h"> {
let Attributes = [NoThrow, Const];
let Prototype = "T(T, T)";
let AddBuiltinPrefixedAlias = 1;
- let OnlyBuiltinPrefixedAliasIsConstexpr = 1;
}
def Fabs : FPMathTemplate, LibBuiltin<"math.h"> {
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 9242491832841..fd61fb8d6a976 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -20605,6 +20605,7 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
// FIXME: Builtin::BI__builtin_powif
// FIXME: Builtin::BI__builtin_powil
+ case Builtin::BIcopysign:
case Builtin::BI__builtin_copysign:
case Builtin::BI__builtin_copysignf:
case Builtin::BI__builtin_copysignl:
>From 4374300e1c5812cfa945975790f241c5eb138105 Mon Sep 17 00:00:00 2001
From: Lucas Mellone <github.snugness349 at passinbox.com>
Date: Sun, 20 Sep 2026 23:18:48 +0200
Subject: [PATCH 2/7] add: simple test case to understand if it is working
---
clang/test/Sema/constant-builtins-2.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/clang/test/Sema/constant-builtins-2.c b/clang/test/Sema/constant-builtins-2.c
index fd3643bbdb7c8..c40a31c214fed 100644
--- a/clang/test/Sema/constant-builtins-2.c
+++ b/clang/test/Sema/constant-builtins-2.c
@@ -251,6 +251,10 @@ __extension__ _Static_assert(
1, ""
);
+__extension__ _Static_assert(
+ __builtin_copysign(1.0, 1.0) == 1.0
+, "");
+
//double g19 = __builtin_powi(2.0, 4);
//float g20 = __builtin_powif(2.0f, 4);
//long double g21 = __builtin_powil(2.0L, 4);
>From c630680dc54c84fef8ac1a7ebf0a1942ae4aadda Mon Sep 17 00:00:00 2001
From: Lucas Mellone <github.snugness349 at passinbox.com>
Date: Mon, 21 Sep 2026 19:57:24 +0200
Subject: [PATCH 3/7] Add: Constexpr to copysign
---
clang/include/clang/Basic/Builtins.td | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td
index 31f235c490e9a..87c28981e9a35 100644
--- a/clang/include/clang/Basic/Builtins.td
+++ b/clang/include/clang/Basic/Builtins.td
@@ -244,7 +244,7 @@ def Atan2F16F128 : Builtin, F16F128MathTemplate {
def CopysignF16 : Builtin {
let Spellings = ["__builtin_copysignf16"];
- let Attributes = [FunctionWithBuiltinPrefix, NoThrow, Const];
+ let Attributes = [FunctionWithBuiltinPrefix, NoThrow, Const, Constexpr];
let Prototype = "__fp16(__fp16, __fp16)";
}
@@ -4053,7 +4053,7 @@ def Atan2 : FPMathTemplate, LibBuiltin<"math.h"> {
def Copysign : FPMathTemplate, LibBuiltin<"math.h"> {
let Spellings = ["copysign"];
- let Attributes = [NoThrow, Const];
+ let Attributes = [NoThrow, Const, Constexpr];
let Prototype = "T(T, T)";
let AddBuiltinPrefixedAlias = 1;
}
>From f8f973bf78c3684c8e1e8b6a662cbec90ff843c5 Mon Sep 17 00:00:00 2001
From: Lucas Mellone <github.snugness349 at passinbox.com>
Date: Mon, 21 Sep 2026 20:20:10 +0200
Subject: [PATCH 4/7] add: copysign double tests
---
clang/test/Sema/constant-builtins-2.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/clang/test/Sema/constant-builtins-2.c b/clang/test/Sema/constant-builtins-2.c
index c40a31c214fed..5a790b6d10584 100644
--- a/clang/test/Sema/constant-builtins-2.c
+++ b/clang/test/Sema/constant-builtins-2.c
@@ -252,7 +252,15 @@ __extension__ _Static_assert(
);
__extension__ _Static_assert(
- __builtin_copysign(1.0, 1.0) == 1.0
+ // double
+ __builtin_copysign(1.0, 1.0) == 1.0 && __builtin_copysign(1.0, -1.0) == -1.0 && \
+ __builtin_copysign(-1.0, 1.0) == 1.0 && __builtin_copysign(-1.0, -1.0) == -1.0 && \
+ !__builtin_signbit(__builtin_copysign(0.0, 1.0)) && __builtin_signbit(__builtin_copysign(0.0, -1.0)) && \
+ !__builtin_signbit(__builtin_copysign(-0.0, 1.0)) && __builtin_signbit(__builtin_copysign(-0.0, -1.0)) && \
+ __builtin_copysign(1.0, 0.0) == 1.0 && __builtin_copysign(1.0, -0.0) == -1.0 && \
+
+ // floating-point
+ // long double
, "");
//double g19 = __builtin_powi(2.0, 4);
>From f86844ac3f51652bfc1aeddd7b3c6220e02d1dfd Mon Sep 17 00:00:00 2001
From: Lucas Mellone <github.snugness349 at passinbox.com>
Date: Mon, 21 Sep 2026 20:28:35 +0200
Subject: [PATCH 5/7] add: all copysign tests
---
clang/test/Sema/constant-builtins-2.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/clang/test/Sema/constant-builtins-2.c b/clang/test/Sema/constant-builtins-2.c
index 5a790b6d10584..498a7af94490b 100644
--- a/clang/test/Sema/constant-builtins-2.c
+++ b/clang/test/Sema/constant-builtins-2.c
@@ -257,11 +257,32 @@ __extension__ _Static_assert(
__builtin_copysign(-1.0, 1.0) == 1.0 && __builtin_copysign(-1.0, -1.0) == -1.0 && \
!__builtin_signbit(__builtin_copysign(0.0, 1.0)) && __builtin_signbit(__builtin_copysign(0.0, -1.0)) && \
!__builtin_signbit(__builtin_copysign(-0.0, 1.0)) && __builtin_signbit(__builtin_copysign(-0.0, -1.0)) && \
- __builtin_copysign(1.0, 0.0) == 1.0 && __builtin_copysign(1.0, -0.0) == -1.0 && \
+ __builtin_copysign(1.0, 0.0) == 1.0 && __builtin_copysign(1.0, -0.0) == -1.0 && \
// floating-point
+ __builtin_copysignf(1.0f, 1.0f) == 1.0f && __builtin_copysignf(1.0f, -1.0f) == -1.0f && \
+ __builtin_copysignf(-1.0f, 1.0f) == 1.0f && __builtin_copysignf(-1.0f, -1.0f) == -1.0f && \
+ !__builtin_signbit(__builtin_copysignf(0.0f, 1.0f)) && __builtin_signbit(__builtin_copysignf(0.0f, -1.0f)) && \
+ !__builtin_signbit(__builtin_copysignf(-0.0f, 1.0f)) && __builtin_signbit(__builtin_copysignf(-0.0f, -1.0f)) && \
+ __builtin_copysignf(1.0f, 0.0f) == 1.0f && __builtin_copysignf(1.0f, -0.0f) == -1.0f && \
+
// long double
-, "");
+ __builtin_copysignl(1.0L, 1.0L) == 1.0L && __builtin_copysignl(1.0L, -1.0L) == -1.0L && \
+ __builtin_copysignl(-1.0L, 1.0L) == 1.0L && __builtin_copysignl(-1.0L, -1.0L) == -1.0L && \
+ !__builtin_signbitl(__builtin_copysignl(0.0L, 1.0L)) && __builtin_signbitl(__builtin_copysignl(0.0L, -1.0L)) && \
+ !__builtin_signbitl(__builtin_copysignl(-0.0L, 1.0L)) && __builtin_signbitl(__builtin_copysignl(-0.0L, -1.0L)) && \
+ __builtin_copysignl(1.0L, 0.0L) == 1.0L && __builtin_copysignl(1.0L, -0.0L) == -1.0L && \
+
+#if defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)
+ // __float128
+ __builtin_copysignf128(1.0q, 1.0q) == 1.0q && __builtin_copysignf128(1.0q, -1.0q) == -1.0q && \
+ __builtin_copysignf128(-1.0q, 1.0q) == 1.0q && __builtin_copysignf128(-1.0q, -1.0q) == -1.0q && \
+ !__builtin_signbit(__builtin_copysignf128(0.0q, 1.0q)) && __builtin_signbit(__builtin_copysignf128(0.0q, -1.0q)) && \
+ !__builtin_signbit(__builtin_copysignf128(-0.0q, 1.0q)) && __builtin_signbit(__builtin_copysignf128(-0.0q, -1.0q)) && \
+ __builtin_copysignf128(1.0q, 0.0q) == 1.0q && __builtin_copysignf128(1.0q, -0.0q) == -1.0q &&
+#endif
+ 1, ""
+);
//double g19 = __builtin_powi(2.0, 4);
//float g20 = __builtin_powif(2.0f, 4);
>From d7d04e99651578bc400e3e2c990b4ceabea4de77 Mon Sep 17 00:00:00 2001
From: Lucas Mellone <github.snugness349 at passinbox.com>
Date: Tue, 22 Sep 2026 09:35:25 +0200
Subject: [PATCH 6/7] add: BIcopysign to InterpBuiltin.cpp
---
clang/lib/AST/ByteCode/InterpBuiltin.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index 843850af334a2..d52e9f397b7d1 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -4666,6 +4666,7 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
case Builtin::BI__builtin_inff128:
return interp__builtin_inf(S, OpPC, Frame, Call);
+ case Builtin::BIcopysign:
case Builtin::BI__builtin_copysign:
case Builtin::BI__builtin_copysignf:
case Builtin::BI__builtin_copysignl:
>From 8dbc23c2a7342a33e7c4fa0184a61872fd176afb Mon Sep 17 00:00:00 2001
From: Lucas Mellone <github.snugness349 at passinbox.com>
Date: Tue, 22 Sep 2026 10:41:36 +0200
Subject: [PATCH 7/7] add BIcopysignf and BIcopysignl
---
clang/lib/AST/ByteCode/InterpBuiltin.cpp | 2 ++
clang/lib/AST/ExprConstant.cpp | 2 ++
2 files changed, 4 insertions(+)
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index d52e9f397b7d1..fc67359a5e5ac 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -4667,6 +4667,8 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
return interp__builtin_inf(S, OpPC, Frame, Call);
case Builtin::BIcopysign:
+ case Builtin::BIcopysignf:
+ case Builtin::BIcopysignl:
case Builtin::BI__builtin_copysign:
case Builtin::BI__builtin_copysignf:
case Builtin::BI__builtin_copysignl:
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index fd61fb8d6a976..f5ccbdc0f5b04 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -20606,6 +20606,8 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
// FIXME: Builtin::BI__builtin_powil
case Builtin::BIcopysign:
+ case Builtin::BIcopysignf:
+ case Builtin::BIcopysignl:
case Builtin::BI__builtin_copysign:
case Builtin::BI__builtin_copysignf:
case Builtin::BI__builtin_copysignl:
More information about the cfe-commits
mailing list