From b67e596d866142b80c23492a2f32d2532f70f26b Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Wed, 24 Oct 2007 18:05:48 +0000 Subject: [PATCH] Handle non-constant initializers. llvm-svn: 43301 --- clang/CodeGen/CGExprScalar.cpp | 11 ++++++----- clang/test/CodeGen/ocu-vector.c | 11 +++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/clang/CodeGen/CGExprScalar.cpp b/clang/CodeGen/CGExprScalar.cpp index d23473a64c40..4b45980d7e72 100644 --- a/clang/CodeGen/CGExprScalar.cpp +++ b/clang/CodeGen/CGExprScalar.cpp @@ -121,14 +121,15 @@ public: Value *VisitPreDefinedExpr(Expr *E) { return EmitLValue(E).getAddress(); } Value *VisitInitListExpr(InitListExpr *E) { - std::vector Elements; unsigned N = E->getNumInits(); + QualType T = E->getInit(0)->getType(); + Value *V = llvm::UndefValue::get(llvm::VectorType::get(ConvertType(T), N)); for (unsigned i = 0; i < N; ++i) { - Value *V = Visit(E->getInit(i)); - llvm::Constant * C = cast(V); - Elements.push_back(C); + Value *NewV = Visit(E->getInit(i)); + Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, i); + V = Builder.CreateInsertElement(V, NewV, Idx); } - return llvm::ConstantVector::get(Elements); + return V; } Value *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { diff --git a/clang/test/CodeGen/ocu-vector.c b/clang/test/CodeGen/ocu-vector.c index 1c20535a58c9..9e904f69ff46 100644 --- a/clang/test/CodeGen/ocu-vector.c +++ b/clang/test/CodeGen/ocu-vector.c @@ -22,3 +22,14 @@ static void test2() { vec2.yx = vec2; // reverse } +static void test3(float4 *out) { + *out = ((float4) {1.0f, 2.0f, 3.0f, 4.0f }); +} + +static void test4(float4 *out) { + float a = 1.0f; + float b = 2.0f; + float c = 3.0f; + float d = 4.0f; + *out = ((float4) {a,b,c,d}); +}