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> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits