aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorCameron Zwarich <zwarich@apple.com>2011-03-09 07:34:11 +0000
committerCameron Zwarich <zwarich@apple.com>2011-03-09 07:34:11 +0000
commit032c10fee2a4bb731488ce75844878009d3bd409 (patch)
tree88e181febcb2c9b82eb8686cce6ebc65e3fe0e91 /lib
parent84dd4fa2e36f72050f5c46577359f5df0467e3e4 (diff)
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
Diffstat (limited to 'lib')
-rw-r--r--lib/Transforms/Scalar/ScalarReplAggregates.cpp39
1 files changed, 21 insertions, 18 deletions
diff --git a/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/lib/Transforms/Scalar/ScalarReplAggregates.cpp
index 1f64ad2606..e1b79fb2db 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<VectorType>(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<VectorType>(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<VectorType>(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.