summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Laevsky <igmyrj@gmail.com>2015-10-28 16:42:00 +0000
committerIgor Laevsky <igmyrj@gmail.com>2015-10-28 16:42:00 +0000
commit36e84c0fc73afbf0c0ec40bfc53c24a590715f3a (patch)
tree7e4d964c7e598bb3adfbc0de670099b232d61c5f
parent5d381bc775a6f3e088176670dbfae469126fdfbb (diff)
downloadbcm5719-llvm-36e84c0fc73afbf0c0ec40bfc53c24a590715f3a.tar.gz
bcm5719-llvm-36e84c0fc73afbf0c0ec40bfc53c24a590715f3a.zip
[AliasAnalysis] Take into account readonly attribute for the function arguments
In getArgModRefInfo we consider all arguments as having MRI_ModRef. However for arguments marked with readonly attribute we can return more precise answer - MRI_Ref. Differential Revision: http://reviews.llvm.org/D13992 llvm-svn: 251525
-rw-r--r--llvm/lib/Analysis/BasicAliasAnalysis.cpp3
-rw-r--r--llvm/test/Analysis/BasicAA/modref.ll26
2 files changed, 29 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
index 2e27f75441a..26578b83c8b 100644
--- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp
+++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
@@ -616,6 +616,9 @@ ModRefInfo BasicAAResult::getArgModRefInfo(ImmutableCallSite CS,
}
// FIXME: Handle memset_pattern4 and memset_pattern8 also.
+ if (CS.paramHasAttr(ArgIdx + 1, Attribute::ReadOnly))
+ return MRI_Ref;
+
return AAResultBase::getArgModRefInfo(CS, ArgIdx);
}
diff --git a/llvm/test/Analysis/BasicAA/modref.ll b/llvm/test/Analysis/BasicAA/modref.ll
index 3084f809c37..342d3fc23cd 100644
--- a/llvm/test/Analysis/BasicAA/modref.ll
+++ b/llvm/test/Analysis/BasicAA/modref.ll
@@ -190,6 +190,32 @@ define i32 @test10(i32* %P, i32* %P2) {
; CHECK: ret i32 %Diff
}
+; CHECK-LABEL: @test11(
+define i32 @test11(i32* %P, i32* %P2) {
+ %V1 = load i32, i32* %P
+ call i32 @func_argmemonly(i32* readonly %P2)
+ %V2 = load i32, i32* %P
+ %Diff = sub i32 %V1, %V2
+ ret i32 %Diff
+ ; CHECK-NOT: load
+ ; CHECK: ret i32 0
+}
+
+declare i32 @func_argmemonly_two_args(i32* %P, i32* %P2) argmemonly
+
+; CHECK-LABEL: @test12(
+define i32 @test12(i32* %P, i32* %P2, i32* %P3) {
+ %V1 = load i32, i32* %P
+ call i32 @func_argmemonly_two_args(i32* readonly %P2, i32* %P3)
+ %V2 = load i32, i32* %P
+ %Diff = sub i32 %V1, %V2
+ ret i32 %Diff
+ ; CHECK: load
+ ; CHECK: load
+ ; CHECK: sub
+ ; CHECK: ret i32 %Diff
+}
+
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @llvm.memset.p0i8.i8(i8* nocapture, i8, i8, i32, i1) nounwind
declare void @llvm.memcpy.p0i8.p0i8.i8(i8* nocapture, i8* nocapture, i8, i32, i1) nounwind
OpenPOWER on IntegriCloud