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.
|
// Check for pointer simplifications.
|
||||||
if (V->getType()->isPointerTy()) {
|
if (V->getType()->isPointerTy()) {
|
||||||
|
if (isKnownNonNull(V))
|
||||||
|
return true;
|
||||||
if (GEPOperator *GEP = dyn_cast<GEPOperator>(V))
|
if (GEPOperator *GEP = dyn_cast<GEPOperator>(V))
|
||||||
if (isGEPKnownNonNull(GEP, TD, Depth))
|
if (isGEPKnownNonNull(GEP, TD, Depth))
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -682,3 +682,14 @@ define zeroext i1 @external_compare(i32* noalias %x) {
|
||||||
; CHECK: external_compare
|
; CHECK: external_compare
|
||||||
; CHECK: ret i1 %cmp
|
; 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