[clang] af5d41e - [clang][Interp] Support CXXScalarValueInitExprs of vector type
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 30 03:43:35 PDT 2024
Author: Timm Bäder
Date: 2024-04-30T12:41:14+02:00
New Revision: af5d41e0caf22536fbfb6e65aa10eff78118c822
URL: https://github.com/llvm/llvm-project/commit/af5d41e0caf22536fbfb6e65aa10eff78118c822
DIFF: https://github.com/llvm/llvm-project/commit/af5d41e0caf22536fbfb6e65aa10eff78118c822.diff
LOG: [clang][Interp] Support CXXScalarValueInitExprs of vector type
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/test/CodeGenCXX/mangle-ms-vector-types.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index b07c57ab86d9ad..f1a51e81a92c2d 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -2292,26 +2292,54 @@ bool ByteCodeExprGen<Emitter>::VisitCXXScalarValueInitExpr(
if (std::optional<PrimType> T = classify(Ty))
return this->visitZeroInitializer(*T, Ty, E);
- assert(Ty->isAnyComplexType());
- if (!Initializing) {
- std::optional<unsigned> LocalIndex = allocateLocal(E, /*IsExtended=*/false);
- if (!LocalIndex)
- return false;
- if (!this->emitGetPtrLocal(*LocalIndex, E))
- return false;
+ if (const auto *CT = Ty->getAs<ComplexType>()) {
+ if (!Initializing) {
+ std::optional<unsigned> LocalIndex =
+ allocateLocal(E, /*IsExtended=*/false);
+ if (!LocalIndex)
+ return false;
+ if (!this->emitGetPtrLocal(*LocalIndex, E))
+ return false;
+ }
+
+ // Initialize both fields to 0.
+ QualType ElemQT = CT->getElementType();
+ PrimType ElemT = classifyPrim(ElemQT);
+
+ for (unsigned I = 0; I != 2; ++I) {
+ if (!this->visitZeroInitializer(ElemT, ElemQT, E))
+ return false;
+ if (!this->emitInitElem(ElemT, I, E))
+ return false;
+ }
+ return true;
}
- // Initialize both fields to 0.
- QualType ElemQT = Ty->getAs<ComplexType>()->getElementType();
- PrimType ElemT = classifyPrim(ElemQT);
+ if (const auto *VT = Ty->getAs<VectorType>()) {
+ // FIXME: Code duplication with the _Complex case above.
+ if (!Initializing) {
+ std::optional<unsigned> LocalIndex =
+ allocateLocal(E, /*IsExtended=*/false);
+ if (!LocalIndex)
+ return false;
+ if (!this->emitGetPtrLocal(*LocalIndex, E))
+ return false;
+ }
- for (unsigned I = 0; I != 2; ++I) {
- if (!this->visitZeroInitializer(ElemT, ElemQT, E))
- return false;
- if (!this->emitInitElem(ElemT, I, E))
- return false;
+ // Initialize all fields to 0.
+ QualType ElemQT = VT->getElementType();
+ PrimType ElemT = classifyPrim(ElemQT);
+
+ for (unsigned I = 0, N = VT->getNumElements(); I != N; ++I) {
+ if (!this->visitZeroInitializer(ElemT, ElemQT, E))
+ return false;
+ if (!this->emitInitElem(ElemT, I, E))
+ return false;
+ }
+ return true;
}
- return true;
+
+ return false;
}
template <class Emitter>
diff --git a/clang/test/CodeGenCXX/mangle-ms-vector-types.cpp b/clang/test/CodeGenCXX/mangle-ms-vector-types.cpp
index 6699c99deaec00..9a0c8896166222 100644
--- a/clang/test/CodeGenCXX/mangle-ms-vector-types.cpp
+++ b/clang/test/CodeGenCXX/mangle-ms-vector-types.cpp
@@ -1,4 +1,5 @@
// RUN: %clang_cc1 -fms-extensions -fcxx-exceptions -ffreestanding -target-feature +avx -emit-llvm %s -o - -triple=i686-pc-win32 | FileCheck %s
+// RUN: %clang_cc1 -fms-extensions -fcxx-exceptions -ffreestanding -target-feature +avx -emit-llvm %s -o - -triple=i686-pc-win32 -fexperimental-new-constant-interpreter | FileCheck %s
#include <xmmintrin.h>
#include <emmintrin.h>
More information about the cfe-commits
mailing list