[clang] [X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - allow SSE/AVX FP2INT conversion intrinsics to be used in constexpr (PR #214611)

2026-08-19 Thread Simon Pilgrim via cfe-commits

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)

2026-08-19 Thread Simon Pilgrim via cfe-commits

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)

2026-08-19 Thread Simon Pilgrim via cfe-commits

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)

2026-08-19 Thread Simon Pilgrim via cfe-commits

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)

2026-08-19 Thread Simon Pilgrim via cfe-commits

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)

2026-08-19 Thread Chirag Patel via cfe-commits

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)

2026-08-18 Thread Timm Baeder via cfe-commits


@@ -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)

2026-08-18 Thread Chirag Patel via cfe-commits

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)

2026-08-16 Thread Chirag Patel via cfe-commits

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)

2026-08-16 Thread Simon Pilgrim via cfe-commits


@@ -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)

2026-08-15 Thread Chirag Patel via cfe-commits

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)

2026-08-15 Thread Chirag Patel via cfe-commits

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)

2026-08-15 Thread Chirag Patel via cfe-commits

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)

2026-08-14 Thread Chirag Patel via cfe-commits

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)

2026-08-14 Thread Timm Baeder via cfe-commits


@@ -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)

2026-08-14 Thread Timm Baeder via cfe-commits


@@ -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)

2026-08-14 Thread Timm Baeder via cfe-commits


@@ -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)

2026-08-14 Thread Timm Baeder via cfe-commits


@@ -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)

2026-08-14 Thread Timm Baeder via cfe-commits


@@ -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)

2026-08-14 Thread Simon Pilgrim via cfe-commits


@@ -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)

2026-08-14 Thread Simon Pilgrim via cfe-commits


@@ -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)

2026-08-14 Thread Simon Pilgrim via cfe-commits


@@ -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)

2026-08-13 Thread Chirag Patel via cfe-commits

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)

2026-08-11 Thread Chirag Patel via cfe-commits

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)

2026-08-09 Thread Chirag Patel via cfe-commits

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)

2026-08-09 Thread Chirag Patel via cfe-commits

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)

2026-08-09 Thread Chirag Patel via cfe-commits

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)

2026-08-07 Thread Chirag Patel via cfe-commits

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)

2026-08-06 Thread Chirag Patel via cfe-commits

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)

2026-08-06 Thread Chirag Patel via cfe-commits

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)

2026-08-06 Thread Chirag Patel via cfe-commits

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)

2026-08-06 Thread Chirag Patel via cfe-commits

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)

2026-08-06 Thread via cfe-commits

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)

2026-08-06 Thread via cfe-commits

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)

2026-08-06 Thread Chirag Patel via cfe-commits

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)

2026-08-06 Thread Chirag Patel via cfe-commits

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 @@