forked from OSchip/llvm-project
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:
parent
c2bc61b006
commit
1217112d11
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue