mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-28 06:00:28 +00:00
GlobalsAA: Functions with the argmemonly attribute won't read arbitrary globals
Summary: In preparation for changing GlobalsAA to stop assuming that intrinsics can't read arbitrary globals, we need to make sure GlobalsAA is querying function attributes rather than relying on this assumption. This patch was inspired by: http://reviews.llvm.org/D20206 Reviewers: jmolloy, hfinkel Subscribers: eli.friedman, llvm-commits Differential Revision: https://reviews.llvm.org/D21318 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275433 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3d6b13fb1d
commit
6e4b75df4f
@ -498,7 +498,7 @@ void GlobalsAAResult::AnalyzeCallGraph(CallGraph &CG, Module &M) {
|
|||||||
// Can't do better than that!
|
// Can't do better than that!
|
||||||
} else if (F->onlyReadsMemory()) {
|
} else if (F->onlyReadsMemory()) {
|
||||||
FI.addModRefInfo(MRI_Ref);
|
FI.addModRefInfo(MRI_Ref);
|
||||||
if (!F->isIntrinsic())
|
if (!F->isIntrinsic() && !F->onlyAccessesArgMemory())
|
||||||
// This function might call back into the module and read a global -
|
// This function might call back into the module and read a global -
|
||||||
// consider every global as possibly being read by this function.
|
// consider every global as possibly being read by this function.
|
||||||
FI.setMayReadAnyGlobal();
|
FI.setMayReadAnyGlobal();
|
||||||
|
31
test/Analysis/GlobalsModRef/func-memattributes.ll
Normal file
31
test/Analysis/GlobalsModRef/func-memattributes.ll
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
; RUN: opt < %s -disable-basicaa -globals-aa -dse -S | FileCheck %s
|
||||||
|
|
||||||
|
@X = internal global i32 4
|
||||||
|
|
||||||
|
define void @test0() {
|
||||||
|
; CHECK-LABEL: @test0
|
||||||
|
; CHECK: store i32 0, i32* @X
|
||||||
|
; CHECK-NEXT: call void @func_readonly() #0
|
||||||
|
; CHECK-NEXT: store i32 1, i32* @X
|
||||||
|
store i32 0, i32* @X
|
||||||
|
call void @func_readonly() #0
|
||||||
|
store i32 1, i32* @X
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
define void @test1() {
|
||||||
|
; CHECK-LABEL: @test1
|
||||||
|
; CHECK-NOT: store
|
||||||
|
; CHECK: call void @func_read_argmem_only() #1
|
||||||
|
; CHECK-NEXT: store i32 3, i32* @X
|
||||||
|
store i32 2, i32* @X
|
||||||
|
call void @func_read_argmem_only() #1
|
||||||
|
store i32 3, i32* @X
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
declare void @func_readonly() #0
|
||||||
|
declare void @func_read_argmem_only() #1
|
||||||
|
|
||||||
|
attributes #0 = { readonly }
|
||||||
|
attributes #1 = { readonly argmemonly }
|
Loading…
Reference in New Issue
Block a user