summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2016-07-14 15:50:27 +0000
committerTom Stellard <thomas.stellard@amd.com>2016-07-14 15:50:27 +0000
commit1b5cf6217e8e829bd6af02dad408d30f553897b5 (patch)
treee8d4e44a8d84d53485409d3176c4934f756fa7a4
parent5bb284226be4556957832fbfed38700d06129639 (diff)
downloadbcm5719-llvm-1b5cf6217e8e829bd6af02dad408d30f553897b5.tar.gz
bcm5719-llvm-1b5cf6217e8e829bd6af02dad408d30f553897b5.zip
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 llvm-svn: 275433
-rw-r--r--llvm/lib/Analysis/GlobalsModRef.cpp2
-rw-r--r--llvm/test/Analysis/GlobalsModRef/func-memattributes.ll31
2 files changed, 32 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/GlobalsModRef.cpp b/llvm/lib/Analysis/GlobalsModRef.cpp
index 0dc00789f0f..a7d1e048e13 100644
--- a/llvm/lib/Analysis/GlobalsModRef.cpp
+++ b/llvm/lib/Analysis/GlobalsModRef.cpp
@@ -498,7 +498,7 @@ void GlobalsAAResult::AnalyzeCallGraph(CallGraph &CG, Module &M) {
// Can't do better than that!
} else if (F->onlyReadsMemory()) {
FI.addModRefInfo(MRI_Ref);
- if (!F->isIntrinsic())
+ if (!F->isIntrinsic() && !F->onlyAccessesArgMemory())
// This function might call back into the module and read a global -
// consider every global as possibly being read by this function.
FI.setMayReadAnyGlobal();
diff --git a/llvm/test/Analysis/GlobalsModRef/func-memattributes.ll b/llvm/test/Analysis/GlobalsModRef/func-memattributes.ll
new file mode 100644
index 00000000000..5494512592e
--- /dev/null
+++ b/llvm/test/Analysis/GlobalsModRef/func-memattributes.ll
@@ -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 }
OpenPOWER on IntegriCloud