[LazyValueInfo] Report nonnull range for nonnull pointers

Currently LazyValueInfo will report only alloca's as having nonnull range. 
For loads with !nonnull metadata it will bailout with no additional information. 
Same is true for calls returning nonnull pointers.

This change extends LazyValueInfo to handle additional nonnull instructions.

Differential Revision: http://reviews.llvm.org/D12932



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247985 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Igor Laevsky 2015-09-18 13:01:48 +00:00
parent 0c5094b419
commit ef40e27a13
2 changed files with 25 additions and 2 deletions

View File

@ -531,8 +531,10 @@ bool LazyValueInfoCache::solveBlockValue(Value *Val, BasicBlock *BB) {
return true;
}
if (AllocaInst *AI = dyn_cast<AllocaInst>(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<PointerType>(BBI->getType());
if (PT && isKnownNonNull(BBI)) {
Res = LVILatticeVal::getNot(ConstantPointerNull::get(PT));
insertResult(Val, BB, Res);
return true;
}

View File

@ -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
}