Check whether a pointer is non-null (isKnownNonNull) in isKnownNonZero.

This handles the case where we have an inbounds GEP with alloca as the pointer.
This fixes the regression in PR12750 and rdar://13286434.
Note that we can also fix this by handling some GEP cases in isKnownNonNull.

llvm-svn: 177321
This commit is contained in:
Manman Ren 2013-03-18 21:23:25 +00:00
parent c2bc61b006
commit 1217112d11
2 changed files with 13 additions and 0 deletions

View File

@ -953,6 +953,8 @@ bool llvm::isKnownNonZero(Value *V, const DataLayout *TD, unsigned Depth) {
// Check for pointer simplifications.
if (V->getType()->isPointerTy()) {
if (isKnownNonNull(V))
return true;
if (GEPOperator *GEP = dyn_cast<GEPOperator>(V))
if (isGEPKnownNonNull(GEP, TD, Depth))
return true;

View File

@ -682,3 +682,14 @@ define zeroext i1 @external_compare(i32* noalias %x) {
; CHECK: external_compare
; CHECK: ret i1 %cmp
}
define i1 @alloca_gep(i64 %a, i64 %b) {
; CHECK: @alloca_gep
; We can prove this GEP is non-null because it is inbounds and the pointer
; is non-null.
%strs = alloca [1000 x [1001 x i8]], align 16
%x = getelementptr inbounds [1000 x [1001 x i8]]* %strs, i64 0, i64 %a, i64 %b
%cmp = icmp eq i8* %x, null
ret i1 %cmp
; CHECK-NEXT: ret i1 false
}