diff --git a/lib/Analysis/LazyValueInfo.cpp b/lib/Analysis/LazyValueInfo.cpp index 7fc3e5afe48..795e3987c0d 100644 --- a/lib/Analysis/LazyValueInfo.cpp +++ b/lib/Analysis/LazyValueInfo.cpp @@ -531,8 +531,10 @@ bool LazyValueInfoCache::solveBlockValue(Value *Val, BasicBlock *BB) { return true; } - if (AllocaInst *AI = dyn_cast(BBI)) { - Res = LVILatticeVal::getNot(ConstantPointerNull::get(AI->getType())); + // If this value is a nonnull pointer, record it's range and bailout. + PointerType *PT = dyn_cast(BBI->getType()); + if (PT && isKnownNonNull(BBI)) { + Res = LVILatticeVal::getNot(ConstantPointerNull::get(PT)); insertResult(Val, BB, Res); return true; } diff --git a/test/Transforms/CorrelatedValuePropagation/non-null.ll b/test/Transforms/CorrelatedValuePropagation/non-null.ll index a24dfb67ca1..6fb4cb6e358 100644 --- a/test/Transforms/CorrelatedValuePropagation/non-null.ll +++ b/test/Transforms/CorrelatedValuePropagation/non-null.ll @@ -140,3 +140,24 @@ merge: ; CHECK: call void @test11_helper(i8* nonnull %merged_arg) ret void } + +declare void @test12_helper(i8* %arg) +define void @test12(i8* %arg1, i8** %arg2) { +; CHECK-LABEL: @test12 +entry: + %is_null = icmp eq i8* %arg1, null + br i1 %is_null, label %null, label %non_null + +non_null: + br label %merge + +null: + %another_arg = load i8*, i8** %arg2, !nonnull !{} + br label %merge + +merge: + %merged_arg = phi i8* [%another_arg, %null], [%arg1, %non_null] + call void @test12_helper(i8* %merged_arg) + ; CHECK: call void @test12_helper(i8* nonnull %merged_arg) + ret void +}