-
Notifications
You must be signed in to change notification settings - Fork 14.9k
[clang][bytecode] Handle vector assignments #155573
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang Author: Timm Baeder (tbaederr) ChangesFull diff: https://github.com/llvm/llvm-project/pull/155573.diff 2 Files Affected:
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}}
+}
|
1ad4ccd
to
d39fd95
Compare
Hi @tbaederr, the test you added fails if run with a compiler that defaults to C++20 because the warning about a C++20 extension does not get emitted. If that warning is not really relevant to what you are testing could we perhaps add |
Sure, makes sense. |
…20. (#156166) The test added in #155573 assumes the compiler defaults to the current default of C++17. If the compiler is changed to default to C++20, the test fails because the expected warnings about a construct being a C++20 extension are no longer emitted. This change fixes up the test to work in either C++17 or C++20 mode by disabling the warning and removing the check for it as this is not what is being tested here.
No description provided.