[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