forked from OSchip/llvm-project
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:
parent
b993f6394f
commit
10ebc189ee
|
@ -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,
|
||||
|
|
|
@ -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>
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue