Fix PR9464 by correcting some math that just happened to be right in most cases

that were hit in practice.

llvm-svn: 128146
This commit is contained in:
Cameron Zwarich 2011-03-23 05:25:55 +00:00
parent b993f6394f
commit 10ebc189ee
2 changed files with 26 additions and 11 deletions

View File

@ -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<VectorType>(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<VectorType>(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,

View File

@ -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>
}