[llvm] r275433 - GlobalsAA: Functions with the argmemonly attribute won't read arbitrary globals
Tom Stellard via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 14 08:50:27 PDT 2016
Author: tstellar
Date: Thu Jul 14 10:50:27 2016
New Revision: 275433
URL: http://llvm.org/viewvc/llvm-project?rev=275433&view=rev
Log:
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
Added:
llvm/trunk/test/Analysis/GlobalsModRef/func-memattributes.ll
Modified:
llvm/trunk/lib/Analysis/GlobalsModRef.cpp
Modified: llvm/trunk/lib/Analysis/GlobalsModRef.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/GlobalsModRef.cpp?rev=275433&r1=275432&r2=275433&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/GlobalsModRef.cpp (original)
+++ llvm/trunk/lib/Analysis/GlobalsModRef.cpp Thu Jul 14 10:50:27 2016
@@ -498,7 +498,7 @@ void GlobalsAAResult::AnalyzeCallGraph(C
// 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();
Added: llvm/trunk/test/Analysis/GlobalsModRef/func-memattributes.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/GlobalsModRef/func-memattributes.ll?rev=275433&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/GlobalsModRef/func-memattributes.ll (added)
+++ llvm/trunk/test/Analysis/GlobalsModRef/func-memattributes.ll Thu Jul 14 10:50:27 2016
@@ -0,0 +1,31 @@
+; RUN: opt < %s -disable-basicaa -globals-aa -dse -S | FileCheck %s
+
+ at 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 }
More information about the llvm-commits
mailing list