aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2007-10-24 18:05:48 +0000
committerDevang Patel <dpatel@apple.com>2007-10-24 18:05:48 +0000
commita83cc33195c7d1fa31d6809416eaa4c3ebf036eb (patch)
tree3867d3d23836dbc1cda1b5cec7342b3d4d4d4c1d
parent35634f5ed67966c9f1fde38420e79cc6515cd673 (diff)
Handle non-constant initializers.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43301 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--CodeGen/CGExprScalar.cpp11
-rw-r--r--test/CodeGen/ocu-vector.c11
2 files changed, 17 insertions, 5 deletions
diff --git a/CodeGen/CGExprScalar.cpp b/CodeGen/CGExprScalar.cpp
index d23473a64c..4b45980d7e 100644
--- a/CodeGen/CGExprScalar.cpp
+++ b/CodeGen/CGExprScalar.cpp
@@ -121,14 +121,15 @@ public:
Value *VisitPreDefinedExpr(Expr *E) { return EmitLValue(E).getAddress(); }
Value *VisitInitListExpr(InitListExpr *E) {
- std::vector<llvm::Constant *> 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<llvm::Constant>(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/test/CodeGen/ocu-vector.c b/test/CodeGen/ocu-vector.c
index 1c20535a58..9e904f69ff 100644
--- a/test/CodeGen/ocu-vector.c
+++ b/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});
+}