forked from OSchip/llvm-project
SROA: Replace calls to getScalarSizeInBits to DataLayout's API because
getScalarSizeInBits could not handle vectors of pointers. llvm-svn: 170412
This commit is contained in:
parent
7174e90078
commit
a5024fc3e1
|
@ -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(),
|
||||
|
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue