Skip to content

Commit 36e84c0

Browse files
committedOct 28, 2015
[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
1 parent 5d381bc commit 36e84c0

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed
 

Diff for: ‎llvm/lib/Analysis/BasicAliasAnalysis.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,9 @@ ModRefInfo BasicAAResult::getArgModRefInfo(ImmutableCallSite CS,
616616
}
617617
// FIXME: Handle memset_pattern4 and memset_pattern8 also.
618618

619+
if (CS.paramHasAttr(ArgIdx + 1, Attribute::ReadOnly))
620+
return MRI_Ref;
621+
619622
return AAResultBase::getArgModRefInfo(CS, ArgIdx);
620623
}
621624

Diff for: ‎llvm/test/Analysis/BasicAA/modref.ll

+26
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,32 @@ define i32 @test10(i32* %P, i32* %P2) {
190190
; CHECK: ret i32 %Diff
191191
}
192192

193+
; CHECK-LABEL: @test11(
194+
define i32 @test11(i32* %P, i32* %P2) {
195+
%V1 = load i32, i32* %P
196+
call i32 @func_argmemonly(i32* readonly %P2)
197+
%V2 = load i32, i32* %P
198+
%Diff = sub i32 %V1, %V2
199+
ret i32 %Diff
200+
; CHECK-NOT: load
201+
; CHECK: ret i32 0
202+
}
203+
204+
declare i32 @func_argmemonly_two_args(i32* %P, i32* %P2) argmemonly
205+
206+
; CHECK-LABEL: @test12(
207+
define i32 @test12(i32* %P, i32* %P2, i32* %P3) {
208+
%V1 = load i32, i32* %P
209+
call i32 @func_argmemonly_two_args(i32* readonly %P2, i32* %P3)
210+
%V2 = load i32, i32* %P
211+
%Diff = sub i32 %V1, %V2
212+
ret i32 %Diff
213+
; CHECK: load
214+
; CHECK: load
215+
; CHECK: sub
216+
; CHECK: ret i32 %Diff
217+
}
218+
193219
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
194220
declare void @llvm.memset.p0i8.i8(i8* nocapture, i8, i8, i32, i1) nounwind
195221
declare void @llvm.memcpy.p0i8.p0i8.i8(i8* nocapture, i8* nocapture, i8, i32, i1) nounwind

0 commit comments

Comments
 (0)
Please sign in to comment.