[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