Author: Timm Bäder Date: 2024-06-18T09:05:28+02:00 New Revision: 4b4aaf1e792367b4ce0e24966a7d21e2a83bb979
URL: https://github.com/llvm/llvm-project/commit/4b4aaf1e792367b4ce0e24966a7d21e2a83bb979 DIFF: https://github.com/llvm/llvm-project/commit/4b4aaf1e792367b4ce0e24966a7d21e2a83bb979.diff LOG: [clang][Interp] Fix non-initializing CK_VectorSplat casts Create the usual local variable to fill. Added: clang/test/AST/Interp/hlsl.hlsl Modified: clang/lib/AST/Interp/ByteCodeExprGen.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index b5e27bfb1a6db..0964ac046e630 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -488,14 +488,25 @@ bool ByteCodeExprGen<Emitter>::VisitCastExpr(const CastExpr *CE) { if (DiscardResult) return this->discard(SubExpr); - assert(Initializing); // FIXME: Not always correct. + if (!Initializing) { + std::optional<unsigned> LocalIndex = allocateLocal(CE); + if (!LocalIndex) + return false; + if (!this->emitGetPtrLocal(*LocalIndex, CE)) + return false; + } + const auto *VT = CE->getType()->getAs<VectorType>(); - PrimType ElemT = classifyPrim(SubExpr); + PrimType ElemT = classifyPrim(SubExpr->getType()); unsigned ElemOffset = allocateLocalPrimitive( SubExpr, ElemT, /*IsConst=*/true, /*IsExtended=*/false); + // Prepare a local variable for the scalar value. if (!this->visit(SubExpr)) return false; + if (classifyPrim(SubExpr) == PT_Ptr && !this->emitLoadPop(ElemT, CE)) + return false; + if (!this->emitSetLocal(ElemT, ElemOffset, CE)) return false; @@ -2778,6 +2789,7 @@ template <class Emitter> bool ByteCodeExprGen<Emitter>::VisitExtVectorElementExpr( const ExtVectorElementExpr *E) { const Expr *Base = E->getBase(); + assert(Base->getType()->isVectorType()); SmallVector<uint32_t, 4> Indices; E->getEncodedElementAccess(Indices); diff --git a/clang/test/AST/Interp/hlsl.hlsl b/clang/test/AST/Interp/hlsl.hlsl new file mode 100644 index 0000000000000..cb14662c11f39 --- /dev/null +++ b/clang/test/AST/Interp/hlsl.hlsl @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -std=hlsl2021 -finclude-default-header -x hlsl -triple \ +// RUN: dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes \ +// RUN: -o - | FileCheck %s + +// RUN: %clang_cc1 -std=hlsl2021 -finclude-default-header -x hlsl -triple \ +// RUN: dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes \ +// RUN: -o - -fexperimental-new-constant-interpreter | FileCheck %s + + +/// This test converts V to a 1-element vector and then .xx to a 2-element vector. +// CHECK-LABEL: ToTwoInts +// CHECK: [[splat:%.*]] = insertelement <1 x i32> poison, i32 {{.*}}, i64 0 +// CHECK: [[vec2:%.*]] = shufflevector <1 x i32> [[splat]], <1 x i32> poison, <2 x i32> zeroinitializer +// CHECK: ret <2 x i32> [[vec2]] +int2 ToTwoInts(int V){ + return V.xx; +} + + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits