diff options
-rw-r--r-- | lib/Transforms/Scalar/SROA.cpp | 12 | ||||
-rw-r--r-- | test/Transforms/SROA/2012-12-17-vpointers.ll | 25 |
2 files changed, 31 insertions, 6 deletions
diff --git a/lib/Transforms/Scalar/SROA.cpp b/lib/Transforms/Scalar/SROA.cpp index a0ee849..11dd049 100644 --- a/lib/Transforms/Scalar/SROA.cpp +++ b/lib/Transforms/Scalar/SROA.cpp @@ -1669,9 +1669,9 @@ static bool accumulateGEPOffsets(const DataLayout &TD, GEPOperator &GEP, APInt TypeSize(Offset.getBitWidth(), TD.getTypeAllocSize(GTI.getIndexedType())); if (VectorType *VTy = dyn_cast<VectorType>(*GTI)) { - assert((VTy->getScalarSizeInBits() % 8) == 0 && + assert((TD.getTypeSizeInBits(VTy->getScalarType()) % 8) == 0 && "vector element size is not a multiple of 8, cannot GEP over it"); - TypeSize = VTy->getScalarSizeInBits() / 8; + TypeSize = TD.getTypeSizeInBits(VTy->getScalarType()) / 8; } GEPOffset += OpC->getValue().sextOrTrunc(Offset.getBitWidth()) * TypeSize; @@ -1762,7 +1762,7 @@ static Value *getNaturalGEPRecursively(IRBuilder<> &IRB, const DataLayout &TD, // extremely poorly defined currently. The long-term goal is to remove GEPing // over a vector from the IR completely. if (VectorType *VecTy = dyn_cast<VectorType>(Ty)) { - unsigned ElementSizeInBits = VecTy->getScalarSizeInBits(); + unsigned ElementSizeInBits = TD.getTypeSizeInBits(VecTy->getScalarType()); if (ElementSizeInBits % 8) return 0; // GEPs over non-multiple of 8 size vector elements are invalid. APInt ElementSize(Offset.getBitWidth(), ElementSizeInBits / 8); @@ -2010,7 +2010,7 @@ static bool isVectorPromotionViable(const DataLayout &TD, return false; uint64_t VecSize = TD.getTypeSizeInBits(Ty); - uint64_t ElementSize = Ty->getScalarSizeInBits(); + uint64_t ElementSize = TD.getTypeSizeInBits(Ty->getScalarType()); // While the definition of LLVM vectors is bitpacked, we don't support sizes // that aren't byte sized. @@ -2370,9 +2370,9 @@ public: ++NumVectorized; VecTy = cast<VectorType>(NewAI.getAllocatedType()); ElementTy = VecTy->getElementType(); - assert((VecTy->getScalarSizeInBits() % 8) == 0 && + assert((TD.getTypeSizeInBits(VecTy->getScalarType()) % 8) == 0 && "Only multiple-of-8 sized vector elements are viable"); - ElementSize = VecTy->getScalarSizeInBits() / 8; + ElementSize = TD.getTypeSizeInBits(VecTy->getScalarType()) / 8; } else if (isIntegerWideningViable(TD, NewAI.getAllocatedType(), NewAllocaBeginOffset, P, I, E)) { IntTy = Type::getIntNTy(NewAI.getContext(), diff --git a/test/Transforms/SROA/2012-12-17-vpointers.ll b/test/Transforms/SROA/2012-12-17-vpointers.ll new file mode 100644 index 0000000..7e995b9 --- /dev/null +++ b/test/Transforms/SROA/2012-12-17-vpointers.ll @@ -0,0 +1,25 @@ +; RUN: opt < %s -sroa + +; Make sure we don't crash on this one. + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +define void @foo() { +entry: + %Args.i = alloca <2 x i32*>, align 16 + br i1 undef, label %bb0.exit158, label %if.then.i.i.i.i.i138 + +if.then.i.i.i.i.i138: + unreachable + +bb0.exit158: + br i1 undef, label %bb0.exit257, label %if.then.i.i.i.i.i237 + +if.then.i.i.i.i.i237: + unreachable + +bb0.exit257: + %0 = load <2 x i32*>* %Args.i, align 16 + unreachable +} |