[llvm-commits] [llvm] r148901 - in /llvm/trunk: include/llvm/Constants.h lib/VMCore/Constants.cpp

Argyrios Kyrtzidis kyrtzidis at apple.com
Tue Jan 24 18:47:20 PST 2012


I reverted it in r148906 because it crashes tests, see
http://lab.llvm.org:8011/builders/llvm-x86_64-linux/builds/2635

-Argyrios

On Jan 24, 2012, at 5:53 PM, Chris Lattner wrote:

> Author: lattner
> Date: Tue Jan 24 19:53:58 2012
> New Revision: 148901
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=148901&view=rev
> Log:
> Introduce a new ConstantVector::getSplat constructor function to 
> simplify a really common case.
> 
> Modified:
>    llvm/trunk/include/llvm/Constants.h
>    llvm/trunk/lib/VMCore/Constants.cpp
> 
> Modified: llvm/trunk/include/llvm/Constants.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Constants.h?rev=148901&r1=148900&r2=148901&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Constants.h (original)
> +++ llvm/trunk/include/llvm/Constants.h Tue Jan 24 19:53:58 2012
> @@ -489,6 +489,10 @@
>   // ConstantVector accessors
>   static Constant *get(ArrayRef<Constant*> V);
> 
> +  /// getSplat - Return a ConstantVector with the specified constant in each
> +  /// element.
> +  static Constant *getSplat(unsigned NumElts, Constant *Elt);
> +  
>   /// Transparently provide more efficient getOperand methods.
>   DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Constant);
> 
> @@ -757,6 +761,11 @@
>   static Constant *get(LLVMContext &Context, ArrayRef<float> Elts);
>   static Constant *get(LLVMContext &Context, ArrayRef<double> Elts);
> 
> +  /// getSplat - Return a ConstantVector with the specified constant in each
> +  /// element.  The specified constant has to be a of a compatible type (i8/i16/
> +  /// i32/i64/float/double) and must be a ConstantFP or ConstantInt.
> +  static Constant *getSplat(unsigned NumElts, Constant *Elt);
> +
>   /// getType - Specialize the getType() method to always return a VectorType,
>   /// which reduces the amount of casting needed in parts of the compiler.
>   ///
> 
> Modified: llvm/trunk/lib/VMCore/Constants.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Constants.cpp?rev=148901&r1=148900&r2=148901&view=diff
> ==============================================================================
> --- llvm/trunk/lib/VMCore/Constants.cpp (original)
> +++ llvm/trunk/lib/VMCore/Constants.cpp Tue Jan 24 19:53:58 2012
> @@ -129,7 +129,7 @@
> 
>   // Broadcast a scalar to a vector, if necessary.
>   if (VectorType *VTy = dyn_cast<VectorType>(Ty))
> -    C = ConstantVector::get(std::vector<Constant *>(VTy->getNumElements(), C));
> +    C = ConstantVector::getSplat(VTy->getNumElements(), C);
> 
>   return C;
> }
> @@ -145,11 +145,9 @@
>     return ConstantFP::get(Ty->getContext(), FL);
>   }
> 
> -  SmallVector<Constant*, 16> Elts;
>   VectorType *VTy = cast<VectorType>(Ty);
> -  Elts.resize(VTy->getNumElements(), getAllOnesValue(VTy->getElementType()));
> -  assert(Elts[0] && "Invalid AllOnes value!");
> -  return cast<ConstantVector>(ConstantVector::get(Elts));
> +  return ConstantVector::getSplat(VTy->getNumElements(),
> +                                  getAllOnesValue(VTy->getElementType()));
> }
> 
> void Constant::destroyConstantImpl() {
> @@ -394,9 +392,8 @@
>   }
>   assert(VTy->getElementType()->isIntegerTy(1) &&
>          "True must be vector of i1 or i1.");
> -  SmallVector<Constant*, 16> Splat(VTy->getNumElements(),
> -                                   ConstantInt::getTrue(Ty->getContext()));
> -  return ConstantVector::get(Splat);
> +  return ConstantVector::getSplat(VTy->getNumElements(),
> +                                  ConstantInt::getTrue(Ty->getContext()));
> }
> 
> Constant *ConstantInt::getFalse(Type *Ty) {
> @@ -407,9 +404,8 @@
>   }
>   assert(VTy->getElementType()->isIntegerTy(1) &&
>          "False must be vector of i1 or i1.");
> -  SmallVector<Constant*, 16> Splat(VTy->getNumElements(),
> -                                   ConstantInt::getFalse(Ty->getContext()));
> -  return ConstantVector::get(Splat);
> +  return ConstantVector::getSplat(VTy->getNumElements(),
> +                                  ConstantInt::getFalse(Ty->getContext()));
> }
> 
> 
> @@ -433,8 +429,7 @@
> 
>   // For vectors, broadcast the value.
>   if (VectorType *VTy = dyn_cast<VectorType>(Ty))
> -    return ConstantVector::get(SmallVector<Constant*,
> -                                           16>(VTy->getNumElements(), C));
> +    return ConstantVector::getSplat(VTy->getNumElements(), C);
> 
>   return C;
> }
> @@ -459,8 +454,7 @@
> 
>   // For vectors, broadcast the value.
>   if (VectorType *VTy = dyn_cast<VectorType>(Ty))
> -    return ConstantVector::get(
> -      SmallVector<Constant *, 16>(VTy->getNumElements(), C));
> +    return ConstantVector::getSplat(VTy->getNumElements(), C);
> 
>   return C;
> }
> @@ -506,8 +500,7 @@
> 
>   // For vectors, broadcast the value.
>   if (VectorType *VTy = dyn_cast<VectorType>(Ty))
> -    return ConstantVector::get(
> -      SmallVector<Constant *, 16>(VTy->getNumElements(), C));
> +    return ConstantVector::getSplat(VTy->getNumElements(), C);
> 
>   return C;
> }
> @@ -521,8 +514,7 @@
> 
>   // For vectors, broadcast the value.
>   if (VectorType *VTy = dyn_cast<VectorType>(Ty))
> -    return ConstantVector::get(
> -      SmallVector<Constant *, 16>(VTy->getNumElements(), C));
> +    return ConstantVector::getSplat(VTy->getNumElements(), C);
> 
>   return C; 
> }
> @@ -537,15 +529,12 @@
> 
> 
> Constant *ConstantFP::getZeroValueForNegation(Type* Ty) {
> -  if (VectorType *PTy = dyn_cast<VectorType>(Ty))
> -    if (PTy->getElementType()->isFloatingPointTy()) {
> -      SmallVector<Constant*, 16> zeros(PTy->getNumElements(),
> -                           getNegativeZero(PTy->getElementType()));
> -      return ConstantVector::get(zeros);
> -    }
> -
> -  if (Ty->isFloatingPointTy()) 
> -    return getNegativeZero(Ty);
> +  if (Ty->getScalarType()->isFloatingPointTy()) {
> +    Constant *C = getNegativeZero(Ty);
> +    if (VectorType *VTy = dyn_cast<VectorType>(Ty))
> +      return ConstantVector::getSplat(VTy->getNumElements(), C);
> +    return C;
> +  }
> 
>   return Constant::getNullValue(Ty);
> }
> @@ -818,6 +807,12 @@
>   return pImpl->VectorConstants.getOrCreate(T, V);
> }
> 
> +Constant *ConstantVector::getSplat(unsigned NumElts, Constant *V) {
> +  SmallVector<Constant*, 32> Elts(NumElts, V);
> +  return get(Elts);
> +}
> +
> +
> // Utility function for determining if a ConstantExpr is a CastOp or not. This
> // can't be inline because we don't want to #include Instruction.h into
> // Constant.h
> @@ -2194,6 +2189,38 @@
>   return getImpl(StringRef((char*)Elts.data(), Elts.size()*8), Ty);
> }
> 
> +Constant *ConstantDataVector::getSplat(unsigned NumElts, Constant *V) {
> +  assert(isElementTypeCompatible(V->getType()) &&
> +         "Element type not compatible with ConstantData");
> +  if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
> +    if (CI->getType()->isIntegerTy(8)) {
> +      SmallVector<uint8_t, 16> Elts(NumElts, CI->getZExtValue());
> +      return get(V->getContext(), Elts);
> +    }
> +    if (CI->getType()->isIntegerTy(16)) {
> +      SmallVector<uint16_t, 16> Elts(NumElts, CI->getZExtValue());
> +      return get(V->getContext(), Elts);
> +    }
> +    if (CI->getType()->isIntegerTy(32)) {
> +      SmallVector<uint32_t, 16> Elts(NumElts, CI->getZExtValue());
> +      return get(V->getContext(), Elts);
> +    }
> +    assert(CI->getType()->isIntegerTy(64) && "Unsupported ConstantData type");
> +    SmallVector<uint64_t, 16> Elts(NumElts, CI->getZExtValue());
> +    return get(V->getContext(), Elts);
> +  }
> +
> +  ConstantFP *CFP = cast<ConstantFP>(V);
> +  if (CFP->getType()->isFloatTy()) {
> +    SmallVector<float, 16> Elts(NumElts, CFP->getValueAPF().convertToFloat());
> +    return get(V->getContext(), Elts);
> +  }
> +  assert(CFP->getType()->isDoubleTy() && "Unsupported ConstantData type");
> +  SmallVector<double, 16> Elts(NumElts, CFP->getValueAPF().convertToDouble());
> +  return get(V->getContext(), Elts);
> +}
> +
> +
> /// getElementAsInteger - If this is a sequential container of integers (of
> /// any size), return the specified element in the low bits of a uint64_t.
> uint64_t ConstantDataSequential::getElementAsInteger(unsigned Elt) const {
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list