summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2016-07-11 03:08:49 +0000
committerHal Finkel <hfinkel@anl.gov>2016-07-11 03:08:49 +0000
commit0017f3683d7bcf83f7af2791dc3b2d9fbeaacbd9 (patch)
treeff0241acd407bdc184a35c3d17beb993716f2633
parent837551f8d61cbdbe2de999b295f2d48c4d0db02e (diff)
Teach isDereferenceablePointer to look through returned-argument functions
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
-rw-r--r--lib/Analysis/Loads.cpp5
-rw-r--r--test/Analysis/ValueTracking/memory-dereferenceable.ll5
2 files changed, 9 insertions, 1 deletions
diff --git a/lib/Analysis/Loads.cpp b/lib/Analysis/Loads.cpp
index 309a1d95efb..75426b54195 100644
--- a/lib/Analysis/Loads.cpp
+++ b/lib/Analysis/Loads.cpp
@@ -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;
}
diff --git a/test/Analysis/ValueTracking/memory-dereferenceable.ll b/test/Analysis/ValueTracking/memory-dereferenceable.ll
index 15a93328974..29c31b95b18 100644
--- a/test/Analysis/ValueTracking/memory-dereferenceable.ll
+++ b/test/Analysis/ValueTracking/memory-dereferenceable.ll
@@ -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 = !{}