[ValueTracking] Properly handle non-sized types in isAligned function.

Reviewers: apilipenko, reames, sanjoy, hfinkel

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D15597

llvm-svn: 256192
This commit is contained in:
Michael Zolotukhin 2015-12-21 20:38:18 +00:00
parent 51a62f15d8
commit 0c97988e54
2 changed files with 25 additions and 1 deletions

View File

@ -3179,6 +3179,8 @@ static bool isAligned(const Value *Base, APInt Offset, unsigned Align,
if (!BaseAlign) {
Type *Ty = Base->getType()->getPointerElementType();
if (!Ty->isSized())
return false;
BaseAlign = DL.getABITypeAlignment(Ty);
}
@ -3189,7 +3191,9 @@ static bool isAligned(const Value *Base, APInt Offset, unsigned Align,
}
static bool isAligned(const Value *Base, unsigned Align, const DataLayout &DL) {
APInt Offset(DL.getTypeStoreSizeInBits(Base->getType()), 0);
Type *Ty = Base->getType();
assert(Ty->isSized() && "must be sized");
APInt Offset(DL.getTypeStoreSizeInBits(Ty), 0);
return isAligned(Base, Offset, Align, DL);
}

View File

@ -5,6 +5,8 @@
target datalayout = "e"
%TypeOpaque = type opaque
declare zeroext i1 @return_i1()
declare i32* @foo()
@ -17,6 +19,7 @@ declare i32* @foo()
@globalptr.align1 = external global i8, align 1
@globalptr.align16 = external global i8, align 16
; CHECK-LABEL: 'test'
define void @test(i32 addrspace(1)* dereferenceable(8) %dparam,
i8 addrspace(1)* dereferenceable(32) align 1 %dparam.align1,
i8 addrspace(1)* dereferenceable(32) align 16 %dparam.align16)
@ -133,6 +136,23 @@ entry:
ret void
}
; Just check that we don't crash.
; CHECK-LABEL: 'opaque_type_crasher'
define void @opaque_type_crasher(%TypeOpaque* dereferenceable(16) %a) {
entry:
%bc = bitcast %TypeOpaque* %a to i8*
%ptr8 = getelementptr inbounds i8, i8* %bc, i32 8
%ptr32 = bitcast i8* %ptr8 to i32*
br i1 undef, label %if.then, label %if.end
if.then:
%res = load i32, i32* %ptr32, align 4
br label %if.end
if.end:
ret void
}
declare i32 @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...)
declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32, i32, i32)