diff options
| author | Cameron Zwarich <zwarich@apple.com> | 2011-10-11 06:10:30 +0000 | 
|---|---|---|
| committer | Cameron Zwarich <zwarich@apple.com> | 2011-10-11 06:10:30 +0000 | 
| commit | d7515ccc47d13c8827b8db317457f7b893843646 (patch) | |
| tree | 917fef23a999069093026012b1caf497959d7e80 /llvm/lib/Transforms | |
| parent | 1bc6f71ebcc87b5ac19e06b4713a766107677099 (diff) | |
| download | bcm5719-llvm-d7515ccc47d13c8827b8db317457f7b893843646.tar.gz bcm5719-llvm-d7515ccc47d13c8827b8db317457f7b893843646.zip | |
Remove a lot of the fancy scalar replacement code for dealing with llvm-gcc's
lowering of NEON code. It provides little-to-no benefit now and only introduces
additional complexity.
llvm-svn: 141646
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp | 221 | 
1 files changed, 16 insertions, 205 deletions
| diff --git a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp index b4bfdd52eb8..3a4fac07ad3 100644 --- a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -298,8 +298,6 @@ AllocaInst *ConvertToScalarInfo::TryConvert(AllocaInst *AI) {    if (ScalarKind == Unknown)      ScalarKind = Integer; -  // FIXME: It should be possible to promote the vector type up to the alloca's -  // size.    if (ScalarKind == Vector && VectorTy->getBitWidth() != AllocaSize * 8)      ScalarKind = Integer; @@ -334,16 +332,12 @@ AllocaInst *ConvertToScalarInfo::TryConvert(AllocaInst *AI) {  /// (VectorTy) so far at the offset specified by Offset (which is specified in  /// bytes).  /// -/// There are three cases we handle here: +/// There are two cases we handle here:  ///   1) A union of vector types of the same size and potentially its elements.  ///      Here we turn element accesses into insert/extract element operations.  ///      This promotes a <4 x float> with a store of float to the third element  ///      into a <4 x float> that uses insert element. -///   2) A union of vector types with power-of-2 size differences, e.g. a float, -///      <2 x float> and <4 x float>.  Here we turn element accesses into insert -///      and extract element operations, and <2 x float> accesses into a cast to -///      <2 x double>, an extract, and a cast back to <2 x float>. -///   3) A fully general blob of memory, which we turn into some (potentially +///   2) A fully general blob of memory, which we turn into some (potentially  ///      large) integer type with extract and insert operations where the loads  ///      and stores would mutate the memory.  We mark this by setting VectorTy  ///      to VoidTy. @@ -374,20 +368,13 @@ void ConvertToScalarInfo::MergeInTypeForLoadOrStore(Type *In,      // if the implied vector agrees with what we already have and if Offset is      // compatible with it.      if (Offset % EltSize == 0 && AllocaSize % EltSize == 0 && -        (!VectorTy || Offset * 8 < VectorTy->getPrimitiveSizeInBits())) { +        (!VectorTy || EltSize == VectorTy->getElementType() +                                         ->getPrimitiveSizeInBits()/8)) {        if (!VectorTy) {          ScalarKind = ImplicitVector;          VectorTy = VectorType::get(In, AllocaSize/EltSize); -        return;        } - -      unsigned CurrentEltSize = VectorTy->getElementType() -                                ->getPrimitiveSizeInBits()/8; -      if (EltSize == CurrentEltSize) -        return; - -      if (In->isIntegerTy() && isPowerOf2_32(AllocaSize / EltSize)) -        return; +      return;      }    } @@ -400,78 +387,19 @@ void ConvertToScalarInfo::MergeInTypeForLoadOrStore(Type *In,  /// returning true if the type was successfully merged and false otherwise.  bool ConvertToScalarInfo::MergeInVectorType(VectorType *VInTy,                                              uint64_t Offset) { -  // TODO: Support nonzero offsets? -  if (Offset != 0) -    return false; - -  // Only allow vectors that are a power-of-2 away from the size of the alloca. -  if (!isPowerOf2_64(AllocaSize / (VInTy->getBitWidth() / 8))) -    return false; - -  // If this the first vector we see, remember the type so that we know the -  // element size. -  if (!VectorTy) { +  if (VInTy->getBitWidth()/8 == AllocaSize && Offset == 0) { +    // If we're storing/loading a vector of the right size, allow it as a +    // vector.  If this the first vector we see, remember the type so that +    // we know the element size. If this is a subsequent access, ignore it +    // even if it is a differing type but the same size. Worst case we can +    // bitcast the resultant vectors. +    if (!VectorTy) +      VectorTy = VInTy;      ScalarKind = Vector; -    VectorTy = VInTy;      return true;    } -  unsigned BitWidth = VectorTy->getBitWidth(); -  unsigned InBitWidth = VInTy->getBitWidth(); - -  // Vectors of the same size can be converted using a simple bitcast. -  if (InBitWidth == BitWidth && AllocaSize == (InBitWidth / 8)) { -    ScalarKind = Vector; -    return true; -  } - -  Type *ElementTy = VectorTy->getElementType(); -  Type *InElementTy = VInTy->getElementType(); - -  // If they're the same alloc size, we'll be attempting to convert between -  // them with a vector shuffle, which requires the element types to match. -  if (TD.getTypeAllocSize(VectorTy) == TD.getTypeAllocSize(VInTy) && -      ElementTy != InElementTy) -    return false; - -  // Do not allow mixed integer and floating-point accesses from vectors of -  // different sizes. -  if (ElementTy->isFloatingPointTy() != InElementTy->isFloatingPointTy()) -    return false; - -  if (ElementTy->isFloatingPointTy()) { -    // Only allow floating-point vectors of different sizes if they have the -    // same element type. -    // TODO: This could be loosened a bit, but would anything benefit? -    if (ElementTy != InElementTy) -      return false; - -    // There are no arbitrary-precision floating-point types, which limits the -    // number of legal vector types with larger element types that we can form -    // to bitcast and extract a subvector. -    // TODO: We could support some more cases with mixed fp128 and double here. -    if (!(BitWidth == 64 || BitWidth == 128) || -        !(InBitWidth == 64 || InBitWidth == 128)) -      return false; -  } else { -    assert(ElementTy->isIntegerTy() && "Vector elements must be either integer " -                                       "or floating-point."); -    unsigned BitWidth = ElementTy->getPrimitiveSizeInBits(); -    unsigned InBitWidth = InElementTy->getPrimitiveSizeInBits(); - -    // Do not allow integer types smaller than a byte or types whose widths are -    // not a multiple of a byte. -    if (BitWidth < 8 || InBitWidth < 8 || -        BitWidth % 8 != 0 || InBitWidth % 8 != 0) -      return false; -  } - -  // Pick the largest of the two vector types. -  ScalarKind = Vector; -  if (InBitWidth > BitWidth) -    VectorTy = VInTy; - -  return true; +  return false;  }  /// CanConvertToScalar - V is a pointer.  If we can convert the pointee and all @@ -735,63 +663,6 @@ void ConvertToScalarInfo::ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI,    }  } -/// getScaledElementType - Gets a scaled element type for a partial vector -/// access of an alloca. The input types must be integer or floating-point -/// scalar or vector types, and the resulting type is an integer, float or -/// double. -static Type *getScaledElementType(Type *Ty1, Type *Ty2, -                                        unsigned NewBitWidth) { -  bool IsFP1 = Ty1->isFloatingPointTy() || -               (Ty1->isVectorTy() && -                cast<VectorType>(Ty1)->getElementType()->isFloatingPointTy()); -  bool IsFP2 = Ty2->isFloatingPointTy() || -               (Ty2->isVectorTy() && -                cast<VectorType>(Ty2)->getElementType()->isFloatingPointTy()); - -  LLVMContext &Context = Ty1->getContext(); - -  // Prefer floating-point types over integer types, as integer types may have -  // been created by earlier scalar replacement. -  if (IsFP1 || IsFP2) { -    if (NewBitWidth == 32) -      return Type::getFloatTy(Context); -    if (NewBitWidth == 64) -      return Type::getDoubleTy(Context); -  } - -  return Type::getIntNTy(Context, NewBitWidth); -} - -/// CreateShuffleVectorCast - Creates a shuffle vector to convert one vector -/// to another vector of the same element type which has the same allocation -/// size but different primitive sizes (e.g. <3 x i32> and <4 x i32>). -static Value *CreateShuffleVectorCast(Value *FromVal, Type *ToType, -                                      IRBuilder<> &Builder) { -  Type *FromType = FromVal->getType(); -  VectorType *FromVTy = cast<VectorType>(FromType); -  VectorType *ToVTy = cast<VectorType>(ToType); -  assert((ToVTy->getElementType() == FromVTy->getElementType()) && -         "Vectors must have the same element type"); -   Value *UnV = UndefValue::get(FromType); -   unsigned numEltsFrom = FromVTy->getNumElements(); -   unsigned numEltsTo = ToVTy->getNumElements(); - -   SmallVector<Constant*, 3> Args; -   Type* Int32Ty = Builder.getInt32Ty(); -   unsigned minNumElts = std::min(numEltsFrom, numEltsTo); -   unsigned i; -   for (i=0; i != minNumElts; ++i) -     Args.push_back(ConstantInt::get(Int32Ty, i)); - -   if (i < numEltsTo) { -     Constant* UnC = UndefValue::get(Int32Ty); -     for (; i != numEltsTo; ++i) -       Args.push_back(UnC); -   } -   Constant *Mask = ConstantVector::get(Args); -   return Builder.CreateShuffleVector(FromVal, UnV, Mask, "tmpV"); -} -  /// ConvertScalar_ExtractValue - Extract a value of type ToType from an integer  /// or vector value FromVal, extracting the bits from the offset specified by  /// Offset.  This returns the value, which is of type ToType. @@ -815,38 +686,8 @@ ConvertScalar_ExtractValue(Value *FromVal, Type *ToType,    if (VectorType *VTy = dyn_cast<VectorType>(FromType)) {      unsigned FromTypeSize = TD.getTypeAllocSize(FromType);      unsigned ToTypeSize = TD.getTypeAllocSize(ToType); -    if (FromTypeSize == ToTypeSize) { -      // If the two types have the same primitive size, use a bit cast. -      // Otherwise, it is two vectors with the same element type that has -      // the same allocation size but different number of elements so use -      // a shuffle vector. -      if (FromType->getPrimitiveSizeInBits() == -          ToType->getPrimitiveSizeInBits()) +    if (FromTypeSize == ToTypeSize)          return Builder.CreateBitCast(FromVal, ToType); -      else -        return CreateShuffleVectorCast(FromVal, ToType, Builder); -    } - -    if (isPowerOf2_64(FromTypeSize / ToTypeSize)) { -      assert(!(ToType->isVectorTy() && Offset != 0) && "Can't extract a value " -             "of a smaller vector type at a nonzero offset."); - -      Type *CastElementTy = getScaledElementType(FromType, ToType, -                                                       ToTypeSize * 8); -      unsigned NumCastVectorElements = FromTypeSize / ToTypeSize; - -      LLVMContext &Context = FromVal->getContext(); -      Type *CastTy = VectorType::get(CastElementTy, -                                           NumCastVectorElements); -      Value *Cast = Builder.CreateBitCast(FromVal, CastTy); - -      unsigned EltSize = TD.getTypeAllocSizeInBits(CastElementTy); -      unsigned Elt = Offset/EltSize; -      assert(EltSize*Elt == Offset && "Invalid modulus in validity checking"); -      Value *Extract = Builder.CreateExtractElement(Cast, ConstantInt::get( -                                        Type::getInt32Ty(Context), Elt)); -      return Builder.CreateBitCast(Extract, ToType); -    }      // Otherwise it must be an element access.      unsigned Elt = 0; @@ -961,38 +802,8 @@ ConvertScalar_InsertValue(Value *SV, Value *Old,      // Changing the whole vector with memset or with an access of a different      // vector type? -    if (ValSize == VecSize) { -      // If the two types have the same primitive size, use a bit cast. -      // Otherwise, it is two vectors with the same element type that has -      // the same allocation size but different number of elements so use -      // a shuffle vector. -      if (VTy->getPrimitiveSizeInBits() == -          SV->getType()->getPrimitiveSizeInBits()) +    if (ValSize == VecSize)          return Builder.CreateBitCast(SV, AllocaType); -      else -        return CreateShuffleVectorCast(SV, VTy, Builder); -    } - -    if (isPowerOf2_64(VecSize / ValSize)) { -      assert(!(SV->getType()->isVectorTy() && Offset != 0) && "Can't insert a " -             "value of a smaller vector type at a nonzero offset."); - -      Type *CastElementTy = getScaledElementType(VTy, SV->getType(), -                                                       ValSize); -      unsigned NumCastVectorElements = VecSize / ValSize; - -      Type *OldCastTy = VectorType::get(CastElementTy, NumCastVectorElements); -      Value *OldCast = Builder.CreateBitCast(Old, OldCastTy); - -      Value *SVCast = Builder.CreateBitCast(SV, CastElementTy); - -      unsigned EltSize = TD.getTypeAllocSizeInBits(CastElementTy); -      unsigned Elt = Offset/EltSize; -      assert(EltSize*Elt == Offset && "Invalid modulus in validity checking"); -      Value *Insert = -        Builder.CreateInsertElement(OldCast, SVCast, Builder.getInt32(Elt)); -      return Builder.CreateBitCast(Insert, AllocaType); -    }      // Must be an element insertion.      assert(SV->getType() == VTy->getElementType()); | 

