[LazyValueInfo] Report nonnull range for nonnull pointers
authorIgor Laevsky <igmyrj@gmail.com>
Fri, 18 Sep 2015 13:01:48 +0000 (13:01 +0000)
committerIgor Laevsky <igmyrj@gmail.com>
Fri, 18 Sep 2015 13:01:48 +0000 (13:01 +0000)
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

lib/Analysis/LazyValueInfo.cpp
test/Transforms/CorrelatedValuePropagation/non-null.ll

index 7fc3e5afe48341cf11ac4aa5ed837edb34909e51..795e3987c0d7498176890ab3e4ac61157d5bce17 100644 (file)
@@ -531,8 +531,10 @@ bool LazyValueInfoCache::solveBlockValue(Value *Val, BasicBlock *BB) {
     return true;
   }
 
     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;
   }
     insertResult(Val, BB, Res);
     return true;
   }
index a24dfb67ca153db36aea711eb4bd6896a4cb07ac..6fb4cb6e35824c503ca63760325ebca9a64e785d 100644 (file)
@@ -140,3 +140,24 @@ merge:
   ; CHECK: call void @test11_helper(i8* nonnull %merged_arg)
   ret void
 }
   ; 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
+}