diff options
-rw-r--r-- | llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 1f64ad2606a..e1b79fb2dbd 100644 --- a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -681,25 +681,28 @@ ConvertScalar_ExtractValue(Value *FromVal, const Type *ToType, // access or a bitcast to another vector type of the same size. if (const VectorType *VTy = dyn_cast<VectorType>(FromVal->getType())) { if (ToType->isVectorTy()) { - if (isPowerOf2_64(AllocaSize / TD.getTypeAllocSize(ToType))) { - assert(Offset == 0 && "Can't extract a value of a smaller vector type " - "from a nonzero offset."); - - const Type *ToElementTy = cast<VectorType>(ToType)->getElementType(); - unsigned Scale = AllocaSize / TD.getTypeAllocSize(ToType); - const Type *CastElementTy = getScaledElementType(ToElementTy, Scale); - unsigned NumCastVectorElements = VTy->getNumElements() / Scale; - - LLVMContext &Context = FromVal->getContext(); - const Type *CastTy = VectorType::get(CastElementTy, - NumCastVectorElements); - Value *Cast = Builder.CreateBitCast(FromVal, CastTy, "tmp"); - Value *Extract = Builder.CreateExtractElement(Cast, ConstantInt::get( - Type::getInt32Ty(Context), 0), "tmp"); - return Builder.CreateBitCast(Extract, ToType, "tmp"); - } + unsigned ToTypeSize = TD.getTypeAllocSize(ToType); + if (ToTypeSize == AllocaSize) + return Builder.CreateBitCast(FromVal, ToType, "tmp"); + + assert(isPowerOf2_64(AllocaSize / ToTypeSize) && + "Partial vector access of an alloca must have a power-of-2 size " + "ratio."); + assert(Offset == 0 && "Can't extract a value of a smaller vector type " + "from a nonzero offset."); + + const Type *ToElementTy = cast<VectorType>(ToType)->getElementType(); + unsigned Scale = AllocaSize / ToTypeSize; + const Type *CastElementTy = getScaledElementType(ToElementTy, Scale); + unsigned NumCastVectorElements = VTy->getNumElements() / Scale; - return Builder.CreateBitCast(FromVal, ToType, "tmp"); + LLVMContext &Context = FromVal->getContext(); + const Type *CastTy = VectorType::get(CastElementTy, + NumCastVectorElements); + Value *Cast = Builder.CreateBitCast(FromVal, CastTy, "tmp"); + Value *Extract = Builder.CreateExtractElement(Cast, ConstantInt::get( + Type::getInt32Ty(Context), 0), "tmp"); + return Builder.CreateBitCast(Extract, ToType, "tmp"); } // Otherwise it must be an element access. |