From: Igor Laevsky Date: Wed, 28 Oct 2015 16:42:00 +0000 (+0000) Subject: [AliasAnalysis] Take into account readonly attribute for the function arguments X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=0cacb9ef06ca2ddc111163d6c7cd17e6f74b7853;p=oota-llvm.git [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251525 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index 2e27f75441a..26578b83c8b 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/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/test/Analysis/BasicAA/modref.ll b/test/Analysis/BasicAA/modref.ll index 3084f809c37..342d3fc23cd 100644 --- a/test/Analysis/BasicAA/modref.ll +++ b/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