[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