diff options
author | Cameron Zwarich <zwarich@apple.com> | 2011-03-09 07:34:11 +0000 |
---|---|---|
committer | Cameron Zwarich <zwarich@apple.com> | 2011-03-09 07:34:11 +0000 |
commit | 032c10fee2a4bb731488ce75844878009d3bd409 (patch) | |
tree | 88e181febcb2c9b82eb8686cce6ebc65e3fe0e91 /lib | |
parent | 84dd4fa2e36f72050f5c46577359f5df0467e3e4 (diff) |
Fix a crasher introduced by r127317 that is seen on the bots when using an
alloca as both integer and floating-point vectors of the same size. Bugpoint is
not cooperating with me, but I'll try to find a manual testcase tomorrow.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127320 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Transforms/Scalar/ScalarReplAggregates.cpp | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 1f64ad2606..e1b79fb2db 100644 --- a/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/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. |