[cfe-commits] r44606 - /cfe/trunk/CodeGen/CGExprScalar.cpp
Devang Patel
dpatel at apple.com
Wed Dec 5 09:23:34 PST 2007
On Dec 4, 2007, at 11:36 PM, Anders Carlsson wrote:
> --- cfe/trunk/CodeGen/CGExprScalar.cpp (original)
> +++ cfe/trunk/CodeGen/CGExprScalar.cpp Wed Dec 5 01:36:10 2007
> @@ -125,14 +125,57 @@
> Value *VisitPreDefinedExpr(Expr *E) { return
> EmitLValue(E).getAddress(); }
>
> Value *VisitInitListExpr(InitListExpr *E) {
> - 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) {
> + unsigned NumInitElements = E->getNumInits();
> +
> + std::vector<llvm::Constant*> VectorElts;
> + const llvm::VectorType *VType =
> + cast<llvm::VectorType>(ConvertType(E->getType()));
> +
> + // Copy initializer elements.
> + bool AllConstElements = true;
> + unsigned i = 0;
> + for (i = 0; i < NumInitElements; ++i) {
> + if (llvm::Constant *C = dyn_cast<llvm::Constant>(Visit(E-
> >getInit(i))))
> + VectorElts.push_back(C);
> + else {
> + AllConstElements = false;
> + break;
> + }
> + }
> +
> + unsigned NumVectorElements = VType->getNumElements();
> + const llvm::Type *ElementType = VType->getElementType();
> + if (AllConstElements) {
> + // Initialize remaining array elements.
> + for (/*Do not initialize i*/; i < NumVectorElements; ++i)
> +
> VectorElts.push_back(llvm::Constant::getNullValue(ElementType));
> +
> + return llvm::ConstantVector::get(VectorElts);
> + }
> +
> + // Emit individual vector element stores.
> + llvm::Value *V = llvm::UndefValue::get(VType);
> +
> + // Emit already seen constants initializers.
> + for (i = 0; i < VectorElts.size(); i++) {
> + Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, i);
> + V = Builder.CreateInsertElement(V, VectorElts[i], Idx);
> + }
> +
> + // Emit remaining initializers
> + for (/*Do not initialize i*/; i < NumInitElements; ++i) {
> Value *NewV = Visit(E->getInit(i));
> Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, i);
> V = Builder.CreateInsertElement(V, NewV, Idx);
> }
> +
> + // Emit remaining default initializers
> + for (/* Do not initialize i*/; i < NumVectorElements; ++i) {
> + Value *Idx = llvm::ConstantInt::get(llvm::Type::Int32Ty, i);
> + llvm::Value *NewV = llvm::Constant::getNullValue(ElementType);
> + V = Builder.CreateInsertElement(V, NewV, Idx);
> + }
> +
> return V;
> }
>
Nice!
Thanks
-
Devang
More information about the cfe-commits
mailing list