[clang] 7505452 - [clang][Interp] Implement VectorSplat casts
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 16 10:31:42 PDT 2024
Author: Timm Bäder
Date: 2024-04-16T19:31:16+02:00
New Revision: 75054525ae58f26c86e418382164540760871186
URL: https://github.com/llvm/llvm-project/commit/75054525ae58f26c86e418382164540760871186
DIFF: https://github.com/llvm/llvm-project/commit/75054525ae58f26c86e418382164540760871186.diff
LOG: [clang][Interp] Implement VectorSplat casts
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/lib/AST/Interp/ByteCodeExprGen.h
clang/test/AST/Interp/vectors.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 00c4a9f161304a..6b4b51aac41e84 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -398,6 +398,35 @@ bool ByteCodeExprGen<Emitter>::VisitCastExpr(const CastExpr *CE) {
return true;
}
+ case CK_VectorSplat: {
+ assert(!classify(CE->getType()));
+ assert(classify(SubExpr->getType()));
+ assert(CE->getType()->isVectorType());
+
+ if (DiscardResult)
+ return this->discard(SubExpr);
+
+ assert(Initializing); // FIXME: Not always correct.
+ const auto *VT = CE->getType()->getAs<VectorType>();
+ PrimType ElemT = classifyPrim(SubExpr);
+ unsigned ElemOffset = allocateLocalPrimitive(
+ SubExpr, ElemT, /*IsConst=*/true, /*IsExtended=*/false);
+
+ if (!this->visit(SubExpr))
+ return false;
+ if (!this->emitSetLocal(ElemT, ElemOffset, CE))
+ return false;
+
+ for (unsigned I = 0; I != VT->getNumElements(); ++I) {
+ if (!this->emitGetLocal(ElemT, ElemOffset, CE))
+ return false;
+ if (!this->emitInitElem(ElemT, I, CE))
+ return false;
+ }
+
+ return true;
+ }
+
case CK_ToVoid:
return discard(SubExpr);
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.h b/clang/lib/AST/Interp/ByteCodeExprGen.h
index db0d73ce23f7c4..7e9dc8631fc0d3 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.h
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.h
@@ -148,13 +148,20 @@ class ByteCodeExprGen : public ConstStmtVisitor<ByteCodeExprGen<Emitter>, bool>,
return Ctx.classify(Ty);
}
- /// Classifies a known primitive type
+ /// Classifies a known primitive type.
PrimType classifyPrim(QualType Ty) const {
if (auto T = classify(Ty)) {
return *T;
}
llvm_unreachable("not a primitive type");
}
+ /// Classifies a known primitive expression.
+ PrimType classifyPrim(const Expr *E) const {
+ if (auto T = classify(E))
+ return *T;
+ llvm_unreachable("not a primitive type");
+ }
+
/// Evaluates an expression and places the result on the stack. If the
/// expression is of composite type, a local variable will be created
/// and a pointer to said variable will be placed on the stack.
diff --git a/clang/test/AST/Interp/vectors.cpp b/clang/test/AST/Interp/vectors.cpp
index 6c5d916f51f563..5c4694f122d812 100644
--- a/clang/test/AST/Interp/vectors.cpp
+++ b/clang/test/AST/Interp/vectors.cpp
@@ -1,10 +1,23 @@
// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -verify=expected,both %s
// RUN: %clang_cc1 -verify=ref,both %s
-// ref-no-diagnostics
-
typedef int __attribute__((vector_size(16))) VI4;
constexpr VI4 A = {1,2,3,4};
+static_assert(A[0] == 1, ""); // ref-error {{not an integral constant expression}}
+static_assert(A[1] == 2, ""); // ref-error {{not an integral constant expression}}
+static_assert(A[2] == 3, ""); // ref-error {{not an integral constant expression}}
+static_assert(A[3] == 4, ""); // ref-error {{not an integral constant expression}}
+
+/// VectorSplat casts
+typedef __attribute__(( ext_vector_type(4) )) float float4;
+constexpr float4 vec4_0 = (float4)0.5f;
+static_assert(vec4_0[0] == 0.5, ""); // ref-error {{not an integral constant expression}}
+static_assert(vec4_0[1] == 0.5, ""); // ref-error {{not an integral constant expression}}
+static_assert(vec4_0[2] == 0.5, ""); // ref-error {{not an integral constant expression}}
+static_assert(vec4_0[3] == 0.5, ""); // ref-error {{not an integral constant expression}}
+constexpr int vec4_0_discarded = ((float4)12.0f, 0);
+
+
/// From constant-expression-cxx11.cpp
namespace Vector {
More information about the cfe-commits
mailing list