[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/RKSimon closed https://github.com/llvm/llvm-project/pull/214611 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/RKSimon auto_merge_enabled https://github.com/llvm/llvm-project/pull/214611 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/RKSimon updated
https://github.com/llvm/llvm-project/pull/214611
>From 9df2aae8c3a25ddc60baad658e756b0fcb1a42ab Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 01/18] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvttpd_epi32(__m256d __a)
{
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
@@ -2256,7 +2256,7 @@ _mm256_cvttpd_epi32(__m256d __a)
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtpd_epi32(__m256d __a)
{
return
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/RKSimon edited https://github.com/llvm/llvm-project/pull/214611 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/RKSimon approved this pull request. LGTM - cheers https://github.com/llvm/llvm-project/pull/214611 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 updated
https://github.com/llvm/llvm-project/pull/214611
>From 9df2aae8c3a25ddc60baad658e756b0fcb1a42ab Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 01/17] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvttpd_epi32(__m256d __a)
{
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
@@ -2256,7 +2256,7 @@ _mm256_cvttpd_epi32(__m256d __a)
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtpd_epi32(__m256d __a)
{
return
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
@@ -4668,6 +4668,63 @@ static bool interp__builtin_ia32_bmac(InterpState &S,
CodePtr OpPC,
return true;
}
+static bool interp_builtin_ia32_cvt_scalar_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ const Floating &FloatElem = SrcVecPtr.elem(0);
+
+ unsigned BitWidth = S.getASTContext().getIntWidth(E->getType());
+ bool IsUnsigned = E->getType()->isUnsignedIntegerType();
+
+ llvm::APSInt IntResult(BitWidth, IsUnsigned);
+ bool IsExact = false;
+ // We only allow exact conversions so rounding mode does not matter for cvt*
+ // and cvtt* builtins
+ FloatElem.getAPFloat().convertToInteger(
+ IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+ if (!IsExact)
+return false;
+
+ pushInteger(S, IntResult, E->getType());
+ return true;
+}
+
+static bool interp_builtin_ia32_cvt_vector_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ const Pointer &Dst = S.Stk.peek();
+
+ unsigned NumSrcElems = SrcVecPtr.getNumElems();
+ unsigned NumDstElems = Dst.getNumElems();
+
+ QualType ElemType = Dst.getFieldDesc()->getElemQualType();
+ unsigned BitWidth = S.getASTContext().getIntWidth(ElemType);
+ bool IsUnsigned = ElemType->isUnsignedIntegerType();
+
+ PrimType ElemT = *S.getContext().classify(ElemType);
+ INT_TYPE_SWITCH_NO_BOOL(ElemT, {
+llvm::SmallVector ConvertedElts;
+ConvertedElts.reserve(NumSrcElems);
+for (unsigned I = 0; I != NumSrcElems; ++I) {
+ const Floating &FloatElem = SrcVecPtr.elem(I);
+ llvm::APSInt IntResult(BitWidth, IsUnsigned);
+
+ bool IsExact = false;
+ FloatElem.getAPFloat().convertToInteger(
+ IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+ if (!IsExact)
+return false;
+ ConvertedElts.push_back(T::from(IntResult.getZExtValue()));
+}
+
+for (unsigned I = 0; I != NumDstElems; ++I)
+ Dst.elem(I) = I < NumSrcElems ? ConvertedElts[I] : T::from(0);
tbaederr wrote:
So, does `NumDstElements >= NumSrcElements` always hold? It's not checked
above.
If so, I don't understand what we need `ConvertedElts` for at all, you can just
assign the values to `Dst` directly.
https://github.com/llvm/llvm-project/pull/214611
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
ChiragPatel8 wrote: Bump ! https://github.com/llvm/llvm-project/pull/214611 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 updated
https://github.com/llvm/llvm-project/pull/214611
>From 9df2aae8c3a25ddc60baad658e756b0fcb1a42ab Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 01/16] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvttpd_epi32(__m256d __a)
{
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
@@ -2256,7 +2256,7 @@ _mm256_cvttpd_epi32(__m256d __a)
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtpd_epi32(__m256d __a)
{
return
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
@@ -4668,6 +4668,71 @@ static bool interp__builtin_ia32_bmac(InterpState &S,
CodePtr OpPC,
return true;
}
+static bool interp_builtin_ia32_cvt_scalar_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ const Floating &FloatElem = SrcVecPtr.elem(0);
+
+ unsigned BitWidth = S.getASTContext().getIntWidth(E->getType());
+ bool IsUnsigned = E->getType()->isUnsignedIntegerType();
+
+ llvm::APSInt IntResult(BitWidth, IsUnsigned);
+ bool IsExact = false;
+ // We only allow exact conversions so rounding mode does not matter for cvt*
+ // and cvtt* builtins
+ FloatElem.getAPFloat().convertToInteger(
+ IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+ if (!IsExact)
+return false;
+
+ pushInteger(S, IntResult, E->getType());
+ return true;
+}
+
+static bool interp_builtin_ia32_cvt_vector_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ const Pointer &Dst = S.Stk.peek();
+
+ unsigned NumSrcElems = SrcVecPtr.getNumElems();
+ unsigned NumDstElems = Dst.getNumElems();
+
+ QualType ElemType = Dst.getFieldDesc()->getElemQualType();
+ unsigned BitWidth = S.getASTContext().getIntWidth(ElemType);
+ bool IsUnsigned = ElemType->isUnsignedIntegerType();
+
+ bool Failed = false;
+ PrimType ElemT = *S.getContext().classify(ElemType);
+ INT_TYPE_SWITCH_NO_BOOL(ElemT, {
+llvm::SmallVector ConvertedElts;
+ConvertedElts.reserve(NumSrcElems);
+for (unsigned I = 0; I != NumSrcElems; ++I) {
+ const Floating &FloatElem = SrcVecPtr.elem(I);
+ llvm::APSInt IntResult(BitWidth, IsUnsigned);
+
+ bool IsExact = false;
+ FloatElem.getAPFloat().convertToInteger(
+ IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+ if (!IsExact) {
+Failed = true;
RKSimon wrote:
why not just return false?
https://github.com/llvm/llvm-project/pull/214611
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 updated
https://github.com/llvm/llvm-project/pull/214611
>From 9df2aae8c3a25ddc60baad658e756b0fcb1a42ab Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 01/15] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvttpd_epi32(__m256d __a)
{
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
@@ -2256,7 +2256,7 @@ _mm256_cvttpd_epi32(__m256d __a)
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtpd_epi32(__m256d __a)
{
return
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 updated
https://github.com/llvm/llvm-project/pull/214611
>From 9df2aae8c3a25ddc60baad658e756b0fcb1a42ab Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 01/14] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvttpd_epi32(__m256d __a)
{
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
@@ -2256,7 +2256,7 @@ _mm256_cvttpd_epi32(__m256d __a)
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtpd_epi32(__m256d __a)
{
return
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 updated
https://github.com/llvm/llvm-project/pull/214611
>From 9df2aae8c3a25ddc60baad658e756b0fcb1a42ab Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 01/13] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvttpd_epi32(__m256d __a)
{
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
@@ -2256,7 +2256,7 @@ _mm256_cvttpd_epi32(__m256d __a)
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtpd_epi32(__m256d __a)
{
return
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 updated
https://github.com/llvm/llvm-project/pull/214611
>From 9df2aae8c3a25ddc60baad658e756b0fcb1a42ab Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 01/12] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvttpd_epi32(__m256d __a)
{
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
@@ -2256,7 +2256,7 @@ _mm256_cvttpd_epi32(__m256d __a)
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtpd_epi32(__m256d __a)
{
return
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
@@ -4668,6 +4668,57 @@ static bool interp__builtin_ia32_bmac(InterpState &S,
CodePtr OpPC,
return true;
}
+static bool interp_builtin_ia32_cvt_scalar_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ Pointer Lane0Ptr = SrcVecPtr.atIndex(0);
+ const Floating &FloatElem = Lane0Ptr.deref();
+ unsigned BitWidth = S.getASTContext().getIntWidth(E->getType());
+
+ llvm::APSInt IntResult(BitWidth, /*isUnsigned=*/false);
+ bool IsExact = false;
+ // We only allow exact conversions so rounding mode does not matter for cvt*
+ // and cvtt* builtins
+ FloatElem.getAPFloat().convertToInteger(
+ IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+ if (!IsExact)
+return false;
+
+ pushInteger(S, IntResult, E->getType());
+ return true;
+}
+
+static bool interp_builtin_ia32_cvt_vector_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ const Pointer &Dst = S.Stk.peek();
+
+ unsigned NumSrcElts = SrcVecPtr.getNumElems();
+ unsigned NumDstElts = Dst.getNumElems();
+ llvm::SmallVector ConvertedElts;
+ for (unsigned I = 0; I < NumSrcElts; ++I) {
+const Floating &FloatElem = SrcVecPtr.atIndex(I).deref();
+llvm::APSInt IntResult(32, /*isUnsigned=*/false);
+bool IsExact = false;
+// We only allow exact conversions so rounding mode does not matter for
cvt*
+// and cvtt* builtins
+FloatElem.getAPFloat().convertToInteger(
+IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+if (!IsExact)
+ return false;
+
+ConvertedElts.push_back(IntResult.getSExtValue());
+ }
+
+ for (unsigned I = 0; I < NumDstElts; ++I)
+Dst.atIndex(I).deref>() =
tbaederr wrote:
```suggestion
Dst.elem>(I) =
```
https://github.com/llvm/llvm-project/pull/214611
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
@@ -4668,6 +4668,57 @@ static bool interp__builtin_ia32_bmac(InterpState &S,
CodePtr OpPC,
return true;
}
+static bool interp_builtin_ia32_cvt_scalar_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ Pointer Lane0Ptr = SrcVecPtr.atIndex(0);
+ const Floating &FloatElem = Lane0Ptr.deref();
+ unsigned BitWidth = S.getASTContext().getIntWidth(E->getType());
+
+ llvm::APSInt IntResult(BitWidth, /*isUnsigned=*/false);
+ bool IsExact = false;
+ // We only allow exact conversions so rounding mode does not matter for cvt*
+ // and cvtt* builtins
+ FloatElem.getAPFloat().convertToInteger(
+ IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+ if (!IsExact)
+return false;
+
+ pushInteger(S, IntResult, E->getType());
+ return true;
+}
+
+static bool interp_builtin_ia32_cvt_vector_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ const Pointer &Dst = S.Stk.peek();
+
+ unsigned NumSrcElts = SrcVecPtr.getNumElems();
+ unsigned NumDstElts = Dst.getNumElems();
+ llvm::SmallVector ConvertedElts;
+ for (unsigned I = 0; I < NumSrcElts; ++I) {
+const Floating &FloatElem = SrcVecPtr.atIndex(I).deref();
tbaederr wrote:
```suggestion
const Floating &FloatElem = SrcVecPtr.elem(I);
```
https://github.com/llvm/llvm-project/pull/214611
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
@@ -4668,6 +4668,57 @@ static bool interp__builtin_ia32_bmac(InterpState &S,
CodePtr OpPC,
return true;
}
+static bool interp_builtin_ia32_cvt_scalar_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ Pointer Lane0Ptr = SrcVecPtr.atIndex(0);
+ const Floating &FloatElem = Lane0Ptr.deref();
+ unsigned BitWidth = S.getASTContext().getIntWidth(E->getType());
+
+ llvm::APSInt IntResult(BitWidth, /*isUnsigned=*/false);
+ bool IsExact = false;
+ // We only allow exact conversions so rounding mode does not matter for cvt*
+ // and cvtt* builtins
+ FloatElem.getAPFloat().convertToInteger(
+ IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+ if (!IsExact)
+return false;
+
+ pushInteger(S, IntResult, E->getType());
+ return true;
+}
+
+static bool interp_builtin_ia32_cvt_vector_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ const Pointer &Dst = S.Stk.peek();
+
+ unsigned NumSrcElts = SrcVecPtr.getNumElems();
+ unsigned NumDstElts = Dst.getNumElems();
+ llvm::SmallVector ConvertedElts;
+ for (unsigned I = 0; I < NumSrcElts; ++I) {
+const Floating &FloatElem = SrcVecPtr.atIndex(I).deref();
+llvm::APSInt IntResult(32, /*isUnsigned=*/false);
+bool IsExact = false;
+// We only allow exact conversions so rounding mode does not matter for
cvt*
+// and cvtt* builtins
+FloatElem.getAPFloat().convertToInteger(
+IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+if (!IsExact)
+ return false;
+
+ConvertedElts.push_back(IntResult.getSExtValue());
+ }
+
+ for (unsigned I = 0; I < NumDstElts; ++I)
tbaederr wrote:
```suggestion
for (unsigned I = 0; I != NumDstElts; ++I)
```
https://github.com/llvm/llvm-project/pull/214611
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
@@ -4668,6 +4668,57 @@ static bool interp__builtin_ia32_bmac(InterpState &S,
CodePtr OpPC,
return true;
}
+static bool interp_builtin_ia32_cvt_scalar_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ Pointer Lane0Ptr = SrcVecPtr.atIndex(0);
+ const Floating &FloatElem = Lane0Ptr.deref();
+ unsigned BitWidth = S.getASTContext().getIntWidth(E->getType());
+
+ llvm::APSInt IntResult(BitWidth, /*isUnsigned=*/false);
+ bool IsExact = false;
+ // We only allow exact conversions so rounding mode does not matter for cvt*
+ // and cvtt* builtins
+ FloatElem.getAPFloat().convertToInteger(
+ IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+ if (!IsExact)
+return false;
+
+ pushInteger(S, IntResult, E->getType());
+ return true;
+}
+
+static bool interp_builtin_ia32_cvt_vector_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ const Pointer &Dst = S.Stk.peek();
+
+ unsigned NumSrcElts = SrcVecPtr.getNumElems();
+ unsigned NumDstElts = Dst.getNumElems();
tbaederr wrote:
```suggestion
unsigned NumSrcElems = SrcVecPtr.getNumElems();
unsigned NumDstElems = Dst.getNumElems();
```
https://github.com/llvm/llvm-project/pull/214611
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
@@ -4668,6 +4668,57 @@ static bool interp__builtin_ia32_bmac(InterpState &S,
CodePtr OpPC,
return true;
}
+static bool interp_builtin_ia32_cvt_scalar_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ Pointer Lane0Ptr = SrcVecPtr.atIndex(0);
+ const Floating &FloatElem = Lane0Ptr.deref();
+ unsigned BitWidth = S.getASTContext().getIntWidth(E->getType());
+
+ llvm::APSInt IntResult(BitWidth, /*isUnsigned=*/false);
+ bool IsExact = false;
+ // We only allow exact conversions so rounding mode does not matter for cvt*
+ // and cvtt* builtins
+ FloatElem.getAPFloat().convertToInteger(
+ IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+ if (!IsExact)
+return false;
+
+ pushInteger(S, IntResult, E->getType());
+ return true;
+}
+
+static bool interp_builtin_ia32_cvt_vector_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ const Pointer &Dst = S.Stk.peek();
+
+ unsigned NumSrcElts = SrcVecPtr.getNumElems();
+ unsigned NumDstElts = Dst.getNumElems();
+ llvm::SmallVector ConvertedElts;
+ for (unsigned I = 0; I < NumSrcElts; ++I) {
tbaederr wrote:
```suggestion
for (unsigned I = 0; I != NumSrcElts; ++I) {
```
https://github.com/llvm/llvm-project/pull/214611
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
@@ -4668,6 +4668,57 @@ static bool interp__builtin_ia32_bmac(InterpState &S,
CodePtr OpPC,
return true;
}
+static bool interp_builtin_ia32_cvt_scalar_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ Pointer Lane0Ptr = SrcVecPtr.atIndex(0);
+ const Floating &FloatElem = Lane0Ptr.deref();
+ unsigned BitWidth = S.getASTContext().getIntWidth(E->getType());
+
+ llvm::APSInt IntResult(BitWidth, /*isUnsigned=*/false);
+ bool IsExact = false;
+ // We only allow exact conversions so rounding mode does not matter for cvt*
+ // and cvtt* builtins
+ FloatElem.getAPFloat().convertToInteger(
+ IntResult, llvm::APFloat::rmTowardZero, &IsExact);
+ if (!IsExact)
+return false;
+
+ pushInteger(S, IntResult, E->getType());
+ return true;
+}
+
+static bool interp_builtin_ia32_cvt_vector_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ const Pointer &Dst = S.Stk.peek();
+
+ unsigned NumSrcElts = SrcVecPtr.getNumElems();
+ unsigned NumDstElts = Dst.getNumElems();
+ llvm::SmallVector ConvertedElts;
+ for (unsigned I = 0; I < NumSrcElts; ++I) {
+const Floating &FloatElem = SrcVecPtr.atIndex(I).deref();
+llvm::APSInt IntResult(32, /*isUnsigned=*/false);
RKSimon wrote:
Can we use the call to determine signedness? AFAICT all builtin signatures are
coorect - and it will make it easier to extend to the avx512 intrinsics in the
future.
https://github.com/llvm/llvm-project/pull/214611
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
@@ -4668,6 +4668,57 @@ static bool interp__builtin_ia32_bmac(InterpState &S,
CodePtr OpPC,
return true;
}
+static bool interp_builtin_ia32_cvt_scalar_to_int(InterpState &S, CodePtr OpPC,
+ const CallExpr *E) {
+ Pointer SrcVecPtr = S.Stk.pop();
+ Pointer Lane0Ptr = SrcVecPtr.atIndex(0);
+ const Floating &FloatElem = Lane0Ptr.deref();
+ unsigned BitWidth = S.getASTContext().getIntWidth(E->getType());
+
+ llvm::APSInt IntResult(BitWidth, /*isUnsigned=*/false);
RKSimon wrote:
Can we use the call to determine signedness? AFAICT all builtin signatures are
coorect - and it will make it easier to extend to the avx512 intrinsics in the
future.
https://github.com/llvm/llvm-project/pull/214611
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
@@ -364,33 +366,41 @@ int test_mm_cvtss_si32(__m128 A) {
// CHECK: call {{.*}}i32 @llvm.x86.sse.cvtss2si(<4 x float> %{{.*}})
return _mm_cvtss_si32(A);
}
+TEST_CONSTEXPR(_mm_cvtss_si32((__m128){+3.0f}) == 3);
+TEST_CONSTEXPR(_mm_cvtss_si32((__m128){-2.0f}) == -2);
#ifdef __x86_64__
long long test_mm_cvtss_si64(__m128 A) {
// CHECK-LABEL: test_mm_cvtss_si64
// CHECK: call {{.*}}i64 @llvm.x86.sse.cvtss2si64(<4 x float> %{{.*}})
return _mm_cvtss_si64(A);
}
+TEST_CONSTEXPR(_mm_cvtss_si64((__m128){+1.0f}) == 1LL);
+TEST_CONSTEXPR(_mm_cvtss_si64((__m128){-7.0f}) == -7LL);
#endif
int test_mm_cvtt_ss2si(__m128 A) {
// CHECK-LABEL: test_mm_cvtt_ss2si
// CHECK: call {{.*}}i32 @llvm.x86.sse.cvttss2si(<4 x float> %{{.*}})
return _mm_cvtt_ss2si(A);
}
+TEST_CONSTEXPR(_mm_cvtt_ss2si((__m128){+3.0f}) == 3);
int test_mm_cvttss_si32(__m128 A) {
// CHECK-LABEL: test_mm_cvttss_si32
// CHECK: call {{.*}}i32 @llvm.x86.sse.cvttss2si(<4 x float> %{{.*}})
return _mm_cvttss_si32(A);
}
+TEST_CONSTEXPR(_mm_cvttss_si32((__m128){+3.0f}) == 3);
+
#ifdef __x86_64__
long long test_mm_cvttss_si64(__m128 A) {
// CHECK-LABEL: test_mm_cvttss_si64
// CHECK: call {{.*}}i64 @llvm.x86.sse.cvttss2si64(<4 x float> %{{.*}})
return _mm_cvttss_si64(A);
}
+TEST_CONSTEXPR(_mm_cvttss_si64((__m128){-12.0f}) == -12LL);
RKSimon wrote:
add a second test with a result that requires a i64 ?
https://github.com/llvm/llvm-project/pull/214611
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 updated
https://github.com/llvm/llvm-project/pull/214611
>From 9df2aae8c3a25ddc60baad658e756b0fcb1a42ab Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 01/11] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvttpd_epi32(__m256d __a)
{
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
@@ -2256,7 +2256,7 @@ _mm256_cvttpd_epi32(__m256d __a)
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtpd_epi32(__m256d __a)
{
return
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
ChiragPatel8 wrote: @topperc I'd appreciate a review when you have a moment. It looks like RKSimon has his hands full right now. https://github.com/llvm/llvm-project/pull/214611 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 updated
https://github.com/llvm/llvm-project/pull/214611
>From b7696705d4125fe7c6393df57b2eba71995826e1 Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 01/10] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvttpd_epi32(__m256d __a)
{
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
@@ -2256,7 +2256,7 @@ _mm256_cvttpd_epi32(__m256d __a)
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtpd_epi32(__m256d __a)
{
return
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 updated
https://github.com/llvm/llvm-project/pull/214611
>From b7696705d4125fe7c6393df57b2eba71995826e1 Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 1/9] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvttpd_epi32(__m256d __a)
{
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
@@ -2256,7 +2256,7 @@ _mm256_cvttpd_epi32(__m256d __a)
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtpd_epi32(__m256d __a)
{
return
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
ChiragPatel8 wrote: Ping ! https://github.com/llvm/llvm-project/pull/214611 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 edited https://github.com/llvm/llvm-project/pull/214611 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
ChiragPatel8 wrote: @RKSimon currently this patch only supports EXACT conversions as mentioned in the Issue #169374 . If you prefer, I can add support for rounding/denormal, nan/inf. https://github.com/llvm/llvm-project/pull/214611 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 updated
https://github.com/llvm/llvm-project/pull/214611
>From b7696705d4125fe7c6393df57b2eba71995826e1 Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 1/8] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvttpd_epi32(__m256d __a)
{
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
@@ -2256,7 +2256,7 @@ _mm256_cvttpd_epi32(__m256d __a)
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtpd_epi32(__m256d __a)
{
return
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 edited https://github.com/llvm/llvm-project/pull/214611 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 updated
https://github.com/llvm/llvm-project/pull/214611
>From b7696705d4125fe7c6393df57b2eba71995826e1 Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 1/6] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvttpd_epi32(__m256d __a)
{
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
@@ -2256,7 +2256,7 @@ _mm256_cvttpd_epi32(__m256d __a)
/// \param __a
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
-static __inline __m128i __DEFAULT_FN_ATTRS
+static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtpd_epi32(__m256d __a)
{
return
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
github-actions[bot] wrote:
:warning: C/C++ code formatter, clang-format found issues in your code.
:warning:
You can test this locally with the following command:
``bash
git-clang-format --diff origin/main HEAD --extensions c,h,cpp --
clang/lib/AST/ByteCode/InterpBuiltin.cpp clang/lib/AST/ExprConstant.cpp
clang/lib/Headers/avxintrin.h clang/lib/Headers/emmintrin.h
clang/lib/Headers/xmmintrin.h clang/test/CodeGen/X86/avx-builtins.c
clang/test/CodeGen/X86/mmx-builtins.c clang/test/CodeGen/X86/sse-builtins.c
clang/test/CodeGen/X86/sse2-builtins.c --diff_from_common_commit
``
:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:
View the diff from clang-format here.
``diff
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 0af667799..0456ee12c 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -15296,7 +15296,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr
*E) {
FloatElem.convertToInteger(IntResult, RoundingMode, &IsExact);
if (Status != llvm::APFloat::opOK || !IsExact)
- return false;
+return false;
ResultElts.push_back(APValue(IntResult));
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index 18b8c6c76..6557b7c98 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2201,8 +2201,7 @@ _mm256_cvtpd_ps(__m256d __a) {
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
-_mm256_cvtps_epi32(__m256 __a)
-{
+_mm256_cvtps_epi32(__m256 __a) {
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
}
@@ -2237,8 +2236,7 @@ _mm256_cvtps_pd(__m128 __a) {
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
-_mm256_cvttpd_epi32(__m256d __a)
-{
+_mm256_cvttpd_epi32(__m256d __a) {
return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
}
@@ -2257,8 +2255,7 @@ _mm256_cvttpd_epi32(__m256d __a)
///A 256-bit vector of [4 x double].
/// \returns A 128-bit integer vector containing the converted values.
static __inline __m128i __DEFAULT_FN_ATTRS_CONSTEXPR
-_mm256_cvtpd_epi32(__m256d __a)
-{
+_mm256_cvtpd_epi32(__m256d __a) {
return (__m128i)__builtin_ia32_cvtpd2dq256((__v4df) __a);
}
@@ -2277,8 +2274,7 @@ _mm256_cvtpd_epi32(__m256d __a)
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
-_mm256_cvttps_epi32(__m256 __a)
-{
+_mm256_cvttps_epi32(__m256 __a) {
return (__m256i)__builtin_ia32_cvttps2dq256((__v8sf) __a);
}
diff --git a/clang/lib/Headers/xmmintrin.h b/clang/lib/Headers/xmmintrin.h
index 3c7116a23..36e133312 100644
--- a/clang/lib/Headers/xmmintrin.h
+++ b/clang/lib/Headers/xmmintrin.h
@@ -1382,9 +1382,7 @@ _mm_ucomineq_ss(__m128 __a, __m128 __b)
///A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
///used in the conversion.
/// \returns A 32-bit integer containing the converted value.
-static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
-_mm_cvtss_si32(__m128 __a)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvtss_si32(__m128 __a) {
return __builtin_ia32_cvtss2si((__v4sf)__a);
}
@@ -1404,9 +1402,7 @@ _mm_cvtss_si32(__m128 __a)
///A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
///used in the conversion.
/// \returns A 32-bit integer containing the converted value.
-static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
-_mm_cvt_ss2si(__m128 __a)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_cvt_ss2si(__m128 __a) {
return _mm_cvtss_si32(__a);
}
@@ -1429,8 +1425,7 @@ _mm_cvt_ss2si(__m128 __a)
///used in the conversion.
/// \returns A 64-bit integer containing the converted value.
static __inline__ long long __DEFAULT_FN_ATTRS_CONSTEXPR
-_mm_cvtss_si64(__m128 __a)
-{
+_mm_cvtss_si64(__m128 __a) {
return __builtin_ia32_cvtss2si64((__v4sf)__a);
}
@@ -1451,8 +1446,7 @@ _mm_cvtss_si64(__m128 __a)
///A 128-bit vector of [4 x float].
/// \returns A 64-bit integer vector containing the converted values.
static __inline__ __m64 __DEFAULT_FN_ATTRS_SSE2_CONSTEXPR
-_mm_cvtps_pi32(__m128 __a)
-{
+_mm_cvtps_pi32(__m128 __a) {
return __trunc64(__builtin_ia32_cvtps2dq((__v4sf)__zeroupper64(__a)));
}
@@ -1471,8 +1465,7 @@ _mm_cvtps_pi32(__m128 __a)
///A 128-bit vector of [4 x float].
/// \returns A 64-bit integer vector containing the converted values.
static __inline__ __m64
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
llvmorg-github-actions[bot] wrote:
@llvm/pr-subscribers-backend-x86
Author: Chirag Patel (ChiragPatel8)
Changes
Adds support for below builtins,
_mm_cvtss_si32
_mm_cvt_ss2si
_mm_cvtss_si64
_mm_cvtps_pi32
_mm_cvt_ps2pi
_mm_cvttss_si32
_mm_cvtt_ss2si
_mm_cvttss_si64
_mm_cvttps_pi32
_mm_cvtt_ps2pi
_mm_cvtps_pi16
_mm_cvtps_pi8
_mm_cvtpd_epi32
_mm_cvtsd_si32
_mm_cvttpd_epi32
_mm_cvttsd_si32
_mm_cvtpd_pi32
_mm_cvttpd_pi32
_mm_cvtsd_si64
_mm_cvttsd_si64
_mm_cvtps_epi32
_mm_cvttps_epi32
_mm256_cvtpd_epi32
_mm256_cvttpd_epi32
_mm256_cvtps_epi32
_mm256_cvttps_epi32
P.S. the current implementation only allows EXACT/INBOUNDS and FINITE
conversions - any special case (DENORMAL/INF/NAN/etc.) or loss of precision
aren't allowed in constexpr for now as per request in issue.
Fixes #169374
---
Patch is 30.74 KiB, truncated to 20.00 KiB below, full version:
https://github.com/llvm/llvm-project/pull/214611.diff
11 Files Affected:
- (modified) clang/include/clang/Basic/BuiltinsX86.td (+5-2)
- (modified) clang/include/clang/Basic/BuiltinsX86_64.td (+2-2)
- (modified) clang/lib/AST/ByteCode/InterpBuiltin.cpp (+86)
- (modified) clang/lib/AST/ExprConstant.cpp (+106)
- (modified) clang/lib/Headers/avxintrin.h (+4-4)
- (modified) clang/lib/Headers/emmintrin.h (+19-10)
- (modified) clang/lib/Headers/xmmintrin.h (+12-12)
- (modified) clang/test/CodeGen/X86/avx-builtins.c (+4)
- (modified) clang/test/CodeGen/X86/mmx-builtins.c (+7)
- (modified) clang/test/CodeGen/X86/sse-builtins.c (+10)
- (modified) clang/test/CodeGen/X86/sse2-builtins.c (+8)
``diff
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index 0e81059a0f6cf..c9ba00b48c443 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -4668,6 +4668,60 @@ static bool interp__builtin_ia32_bmac(InterpState &S,
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
ChiragPatel8 wrote: CC @RKSimon https://github.com/llvm/llvm-project/pull/214611 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)
https://github.com/ChiragPatel8 created
https://github.com/llvm/llvm-project/pull/214611
Adds support for below builtins,
_mm_cvtss_si32
_mm_cvt_ss2si
_mm_cvtss_si64
_mm_cvtps_pi32
_mm_cvt_ps2pi
_mm_cvttss_si32
_mm_cvtt_ss2si
_mm_cvttss_si64
_mm_cvttps_pi32
_mm_cvtt_ps2pi
_mm_cvtps_pi16
_mm_cvtps_pi8
_mm_cvtpd_epi32
_mm_cvtsd_si32
_mm_cvttpd_epi32
_mm_cvttsd_si32
_mm_cvtpd_pi32
_mm_cvttpd_pi32
_mm_cvtsd_si64
_mm_cvttsd_si64
_mm_cvtps_epi32
_mm_cvttps_epi32
_mm256_cvtpd_epi32
_mm256_cvttpd_epi32
_mm256_cvtps_epi32
_mm256_cvttps_epi32
P.S. the current implementation only allows EXACT/INBOUNDS and FINITE
conversions - any special case (DENORMAL/INF/NAN/etc.) or loss of precision
aren't allowed in constexpr for now as per request in issue.
Fixes #169374
>From b7696705d4125fe7c6393df57b2eba71995826e1 Mon Sep 17 00:00:00 2001
From: chirag
Date: Thu, 6 Aug 2026 08:13:17 +0530
Subject: [PATCH 1/5] Adding const attribute.
---
clang/include/clang/Basic/BuiltinsX86.td| 7 +++--
clang/include/clang/Basic/BuiltinsX86_64.td | 4 +--
clang/lib/Headers/avxintrin.h | 8 +++---
clang/lib/Headers/emmintrin.h | 29 ++---
clang/lib/Headers/xmmintrin.h | 24 -
5 files changed, 42 insertions(+), 30 deletions(-)
diff --git a/clang/include/clang/Basic/BuiltinsX86.td
b/clang/include/clang/Basic/BuiltinsX86.td
index 9b7abefb75049..04f93db3aa0b0 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -129,7 +129,7 @@ let Features = "sse", Header = "xmmintrin.h", Attributes =
[NoThrow, RequireDecl
def _mm_getcsr : X86LibBuiltin<"unsigned int()">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si : X86Builtin<"int(_Vector<4, float>)">;
def cvttss2si : X86Builtin<"int(_Vector<4, float>)">;
}
@@ -179,7 +179,7 @@ let Features = "avx512f", Attributes = [NoThrow, Const,
Constexpr, RequiredVecto
def cvtsd2ss_round_mask : X86Builtin<"_Vector<4, float>(_Vector<4, float>,
_Vector<2, double>, _Vector<4, float>, unsigned char, _Constant int)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvttpd2dq : X86Builtin<"_Vector<4, int>(_Vector<2, double>)">;
def cvtsd2si : X86Builtin<"int(_Vector<2, double>)">;
@@ -475,6 +475,9 @@ let Features = "avx", Attributes = [NoThrow, Const,
RequiredVectorWidth<256>] in
def dpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
def cmppd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4,
double>, _Constant char)">;
def cmpps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8,
float>, _Constant char)">;
+}
+
+let Features = "avx", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<256>] in {
def cvtps2dq256 : X86Builtin<"_Vector<8, int>(_Vector<8, float>)">;
def cvttpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
def cvtpd2dq256 : X86Builtin<"_Vector<4, int>(_Vector<4, double>)">;
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td
b/clang/include/clang/Basic/BuiltinsX86_64.td
index 0a98b3049df34..cf76d9a257614 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -42,12 +42,12 @@ let Attributes = [NoThrow] in {
def writeeflags_u64 : X86Builtin<"void(unsigned long long int)">;
}
-let Features = "sse", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
def cvttss2si64 : X86Builtin<"long long int(_Vector<4, float>)">;
}
-let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>]
in {
+let Features = "sse2", Attributes = [NoThrow, Const, Constexpr,
RequiredVectorWidth<128>] in {
def cvtsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
def cvttsd2si64 : X86Builtin<"long long int(_Vector<2, double>)">;
}
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index fbd20e58329a3..18b8c6c76a7ce 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -2200,7 +2200,7 @@ _mm256_cvtpd_ps(__m256d __a) {
/// \param __a
///A 256-bit vector of [8 x float].
/// \returns A 256-bit integer vector containing the converted values.
-static __inline __m256i __DEFAULT_FN_ATTRS
+static __inline __m256i __DEFAULT_FN_ATTRS_CONSTEXPR
_mm256_cvtps_epi32(__m256 __a)
{
return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
@@ -2236,7 +2236,7 @@
