https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/155573
None >From 1ad4ccd8e3cba0e894cdfc5a012147360516a112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Wed, 27 Aug 2025 10:29:40 +0200 Subject: [PATCH] [clang][bytecode] Handle vector assignments --- clang/lib/AST/ByteCode/Compiler.cpp | 25 ++++++++++++++++++++++++- clang/test/AST/ByteCode/vectors.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index 0079d937e885b..fedaeea5bf4e0 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -1383,7 +1383,7 @@ bool Compiler<Emitter>::VisitVectorBinOp(const BinaryOperator *E) { assert(E->getRHS()->getType()->isVectorType()); // Prepare storage for result. - if (!Initializing && !E->isCompoundAssignmentOp()) { + if (!Initializing && !E->isCompoundAssignmentOp() && !E->isAssignmentOp()) { UnsignedOrNone LocalIndex = allocateTemporary(E); if (!LocalIndex) return false; @@ -1418,6 +1418,29 @@ bool Compiler<Emitter>::VisitVectorBinOp(const BinaryOperator *E) { if (!this->emitSetLocal(PT_Ptr, RHSOffset, E)) return false; + if (E->isAssignmentOp()) { + if (!this->emitGetLocal(PT_Ptr, LHSOffset, E)) + return false; + + for (unsigned I = 0; I != VecTy->getNumElements(); ++I) { + // Pointer to LHS element. + if (!this->emitConst(I, PT_Uint32, E)) + return false; + if (!this->emitArrayElemPtrUint32(E)) + return false; + // Value of RHS element. + if (!this->emitGetLocal(PT_Ptr, RHSOffset, E)) + return false; + if (!this->emitArrayElemPop(ElemT, I, E)) + return false; + if (!this->emitStorePop(ElemT, E)) + return false; + } + if (DiscardResult) + return this->emitPopPtr(E); + return true; + } + if (E->isCompoundAssignmentOp() && !this->emitGetLocal(PT_Ptr, LHSOffset, E)) return false; diff --git a/clang/test/AST/ByteCode/vectors.cpp b/clang/test/AST/ByteCode/vectors.cpp index 091caf8c9a275..6b41c8d79d5b4 100644 --- a/clang/test/AST/ByteCode/vectors.cpp +++ b/clang/test/AST/ByteCode/vectors.cpp @@ -143,3 +143,28 @@ namespace { constexpr __m128d v_mm_cvtps_pd = _mm_cvtps_pd(kf1); static_assert(v_mm_cvtps_pd[0] == -1.0 && v_mm_cvtps_pd[1] == +2.0); } + +namespace Assign { + constexpr int a2() { + VI a = {0, 0, 0, 0}; + VI b; // both-warning {{C++20 extension}} + + b = {1,1,1,1}; + return b[0] + b[1] + b[2] + b[3]; + } + + static_assert(a2() == 4); + + typedef short v2int16_t __attribute__((ext_vector_type(2))); + typedef unsigned short v2int_t __attribute__((ext_vector_type(2))); + + + constexpr bool invalid() { + v2int16_t a = {0, 0}; + v2int_t b; // both-warning {{C++20 extension}} + b = a; // both-error {{incompatible type}} + + return true; + } + static_assert(invalid()); // both-error {{not an integral constant expression}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits