[PATCH] D15597: [ValueTracking] Handle opaque types in isDereferenceableAndAlignedPointer.
Michael Zolotukhin via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 18 12:01:23 PST 2015
mzolotukhin updated this revision to Diff 43255.
mzolotukhin added a comment.
- Sink 'isSized' to 'isAligned'.
http://reviews.llvm.org/D15597
Files:
lib/Analysis/ValueTracking.cpp
test/Analysis/ValueTracking/memory-dereferenceable.ll
Index: test/Analysis/ValueTracking/memory-dereferenceable.ll
===================================================================
--- test/Analysis/ValueTracking/memory-dereferenceable.ll
+++ test/Analysis/ValueTracking/memory-dereferenceable.ll
@@ -5,6 +5,8 @@
target datalayout = "e"
+%TypeOpaque = type opaque
+
declare zeroext i1 @return_i1()
declare i32* @foo()
@@ -17,6 +19,7 @@
@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 @@
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)
Index: lib/Analysis/ValueTracking.cpp
===================================================================
--- lib/Analysis/ValueTracking.cpp
+++ lib/Analysis/ValueTracking.cpp
@@ -3179,6 +3179,8 @@
if (!BaseAlign) {
Type *Ty = Base->getType()->getPointerElementType();
+ if (!Ty->isSized())
+ return false;
BaseAlign = DL.getABITypeAlignment(Ty);
}
@@ -3189,7 +3191,10 @@
}
static bool isAligned(const Value *Base, unsigned Align, const DataLayout &DL) {
- APInt Offset(DL.getTypeStoreSizeInBits(Base->getType()), 0);
+ Type *Ty = Base->getType();
+ if (!Ty->isSized())
+ return false;
+ APInt Offset(DL.getTypeStoreSizeInBits(Ty), 0);
return isAligned(Base, Offset, Align, DL);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D15597.43255.patch
Type: text/x-patch
Size: 2111 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151218/730b0c22/attachment.bin>
More information about the llvm-commits
mailing list