From 032c10fee2a4bb731488ce75844878009d3bd409 Mon Sep 17 00:00:00 2001 From: Cameron Zwarich Date: Wed, 9 Mar 2011 07:34:11 +0000 Subject: [PATCH] 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 --- .../Scalar/ScalarReplAggregates.cpp | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 1f64ad2606a..e1b79fb2dbd 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(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(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(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. -- 2.34.1