[PATCH] D21318: GlobalsAA: Functions with the argmemonly attribute won't read arbitrary globals

Tom Stellard via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 13 19:56:37 PDT 2016


tstellarAMD created this revision.
tstellarAMD added reviewers: hfinkel, jmolloy.
tstellarAMD added a subscriber: llvm-commits.

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

Unfortunately, I was unable to find a test case that this change fixes.  The
tests I added pass even without this change.

http://reviews.llvm.org/D21318

Files:
  lib/Analysis/GlobalsModRef.cpp
  test/Analysis/GlobalsModRef/func-memattributes.ll

Index: test/Analysis/GlobalsModRef/func-memattributes.ll
===================================================================
--- /dev/null
+++ test/Analysis/GlobalsModRef/func-memattributes.ll
@@ -0,0 +1,32 @@
+; RUN: opt < %s -basicaa -globals-aa -dse -S | FileCheck %s
+
+ at X = internal global i32 4
+ at Y = internal global i32 5
+
+define void @test0() {
+; CHECK-LABEL: @test0
+; CHECK: store i32 0, i32* @X
+; CHECK-NEXT: call void @func_readonly(i32* @Y) #0
+; CHECK-NEXT: store i32 1, i32* @X
+  store i32 0, i32* @X
+  call void @func_readonly(i32* @Y) #0
+  store i32 1, i32* @X
+  ret void
+}
+
+define void @test1(i32* %p) {
+; CHECK-LABEL: @test1
+; CHECK-NOT: store
+; CHECK: call void @func_read_argmem_only(i32* @Y) #1
+; CHECK-NEXT: store i32 3, i32* @X
+  store i32 2, i32* @X
+  call void @func_read_argmem_only(i32* @Y) #1
+  store i32 3, i32* @X
+  ret void
+}
+
+declare void @func_readonly(i32*) #0
+declare void @func_read_argmem_only(i32*) #1
+
+attributes #0 = { readonly }
+attributes #1 = { readonly argmemonly }
Index: lib/Analysis/GlobalsModRef.cpp
===================================================================
--- lib/Analysis/GlobalsModRef.cpp
+++ lib/Analysis/GlobalsModRef.cpp
@@ -498,7 +498,7 @@
           // 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();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21318.60643.patch
Type: text/x-patch
Size: 1655 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160614/4b954c7e/attachment.bin>


More information about the llvm-commits mailing list