aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Scalar/ScalarReplAggregates.cpp21
-rw-r--r--test/Transforms/ScalarRepl/vector_promote.ll16
2 files changed, 26 insertions, 11 deletions
diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp
index efc0df5ad3..c261dede92 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<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,
diff --git a/test/Transforms/ScalarRepl/vector_promote.ll b/test/Transforms/ScalarRepl/vector_promote.ll
index 8e143612eb..67bbf71b36 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>
+}