[llvm-commits] [llvm] r148901 - in /llvm/trunk: include/llvm/Constants.h lib/VMCore/Constants.cpp
Chris Lattner
sabre at nondot.org
Tue Jan 24 21:07:56 PST 2012
Thanks Argyrios. Somehow I must have tested before rebuilding. Not sure how I could done that :)
-Chris
On Jan 24, 2012, at 6:47 PM, Argyrios Kyrtzidis wrote:
> 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