[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