forked from OSchip/llvm-project
[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:
parent
51a62f15d8
commit
0c97988e54
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue