diff options
author | Igor Laevsky <igmyrj@gmail.com> | 2015-10-28 16:42:00 +0000 |
---|---|---|
committer | Igor Laevsky <igmyrj@gmail.com> | 2015-10-28 16:42:00 +0000 |
commit | 36e84c0fc73afbf0c0ec40bfc53c24a590715f3a (patch) | |
tree | 7e4d964c7e598bb3adfbc0de670099b232d61c5f | |
parent | 5d381bc775a6f3e088176670dbfae469126fdfbb (diff) | |
download | bcm5719-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.cpp | 3 | ||||
-rw-r--r-- | llvm/test/Analysis/BasicAA/modref.ll | 26 |
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 |