From: Cameron Zwarich Date: Wed, 23 Mar 2011 05:25:55 +0000 (+0000) Subject: Fix PR9464 by correcting some math that just happened to be right in most cases X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1537ce75ed25bbca58096383bb1fb9dd427bf1aa;p=oota-llvm.git Fix PR9464 by correcting some math that just happened to be right in most cases that were hit in practice. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128146 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp index efc0df5ad3a..c261dede922 100644 --- a/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -654,18 +654,18 @@ void ConvertToScalarInfo::ConvertUsesToScalar(Value *Ptr, AllocaInst *NewAI, /// getScaledElementType - Gets a scaled element type for a partial vector /// access of an alloca. The input type must be an integer or float, and /// the resulting type must be an integer, float or double. -static const Type *getScaledElementType(const Type *OldTy, unsigned Scale) { +static const Type *getScaledElementType(const Type *OldTy, + unsigned NewBitWidth) { assert((OldTy->isIntegerTy() || OldTy->isFloatTy()) && "Partial vector " "accesses must be scaled from integer or float elements."); LLVMContext &Context = OldTy->getContext(); - unsigned Size = OldTy->getPrimitiveSizeInBits() * Scale; if (OldTy->isIntegerTy()) - return Type::getIntNTy(Context, Size); - if (Size == 32) + return Type::getIntNTy(Context, NewBitWidth); + if (NewBitWidth == 32) return Type::getFloatTy(Context); - if (Size == 64) + if (NewBitWidth == 64) return Type::getDoubleTy(Context); llvm_unreachable("Invalid type for a partial vector access of an alloca!"); @@ -703,9 +703,9 @@ ConvertScalar_ExtractValue(Value *FromVal, const Type *ToType, "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; + const Type *CastElementTy = getScaledElementType(ToElementTy, + ToTypeSize * 8); + unsigned NumCastVectorElements = AllocaSize / ToTypeSize; LLVMContext &Context = FromVal->getContext(); const Type *CastTy = VectorType::get(CastElementTy, @@ -841,9 +841,8 @@ ConvertScalar_InsertValue(Value *SV, Value *Old, const Type *ToElementTy = cast(SV->getType())->getElementType(); - unsigned Scale = VecSize / ValSize; - const Type *CastElementTy = getScaledElementType(ToElementTy, Scale); - unsigned NumCastVectorElements = VTy->getNumElements() / Scale; + const Type *CastElementTy = getScaledElementType(ToElementTy, ValSize); + unsigned NumCastVectorElements = VecSize / ValSize; LLVMContext &Context = SV->getContext(); const Type *OldCastTy = VectorType::get(CastElementTy, diff --git a/test/Transforms/ScalarRepl/vector_promote.ll b/test/Transforms/ScalarRepl/vector_promote.ll index 8e143612ebd..67bbf71b362 100644 --- a/test/Transforms/ScalarRepl/vector_promote.ll +++ b/test/Transforms/ScalarRepl/vector_promote.ll @@ -171,3 +171,19 @@ define void @test11(<2 x i64> %x) { ; CHECK: @test11 ; CHECK-NOT: alloca } + +define void @test12() { +entry: + %a = alloca <64 x i8>, align 64 + store <64 x i8> undef, <64 x i8>* %a, align 64 + %p = bitcast <64 x i8>* %a to <16 x i8>* + %0 = load <16 x i8>* %p, align 64 + store <16 x i8> undef, <16 x i8>* %p, align 64 + %q = bitcast <16 x i8>* %p to <64 x i8>* + %1 = load <64 x i8>* %q, align 64 + ret void +; CHECK: @test12 +; CHECK-NOT: alloca +; CHECK: extractelement <4 x i128> +; CHECK: insertelement <4 x i128> +}