]> granicus.if.org Git - llvm/commitdiff
Teach isDereferenceablePointer to look through returned-argument functions
authorHal Finkel <hfinkel@anl.gov>
Mon, 11 Jul 2016 03:08:49 +0000 (03:08 +0000)
committerHal Finkel <hfinkel@anl.gov>
Mon, 11 Jul 2016 03:08:49 +0000 (03:08 +0000)
For functions which are known to return their argument,
isDereferenceableAndAlignedPointer can examine the argument value.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275038 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/Loads.cpp
test/Analysis/ValueTracking/memory-dereferenceable.ll

index 309a1d95efb6ab655bc6443b2e80c1620f8242a6..75426b54195a36ea2a7ce014640d7ea6293ac160 100644 (file)
@@ -101,6 +101,11 @@ static bool isDereferenceableAndAlignedPointer(
     return isDereferenceableAndAlignedPointer(ASC->getOperand(0), Align, Size,
                                               DL, CtxI, DT, Visited);
 
+  if (auto CS = ImmutableCallSite(V))
+    if (const Value *RV = CS.getReturnedArgOperand())
+      return isDereferenceableAndAlignedPointer(RV, Align, Size, DL, CtxI, DT,
+                                                Visited);
+
   // If we don't know, assume the worst.
   return false;
 }
index 15a93328974b5dfe23472cd4ea4110323c1a2259..29c31b95b188ec196be60d6cf67e9e4297966938 100644 (file)
@@ -43,7 +43,8 @@ entry:
     %load4 = load i32, i32 addrspace(1)* %relocate
 
 ; CHECK-NOT: %nparam
-    %nparam = getelementptr i32, i32 addrspace(1)* %dparam, i32 5
+    %dpa = call i32 addrspace(1)* @func1(i32 addrspace(1)* %dparam)
+    %nparam = getelementptr i32, i32 addrspace(1)* %dpa, i32 5
     %load5 = load i32, i32 addrspace(1)* %nparam
 
     ; Load from a non-dereferenceable load
@@ -162,6 +163,8 @@ if.end:
 declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...)
 declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32)
 
+declare i32 addrspace(1)* @func1(i32 addrspace(1)* returned) nounwind argmemonly
+
 !0 = !{i64 4}
 !1 = !{i64 2}
 !2 = !{}