[llvm] r251508 - [GlobalsAA] An indirect global that is initialized is not fair game

James Molloy via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 28 03:41:35 PDT 2015


Author: jamesm
Date: Wed Oct 28 05:41:29 2015
New Revision: 251508

URL: http://llvm.org/viewvc/llvm-project?rev=251508&view=rev
Log:
[GlobalsAA] An indirect global that is initialized is not fair game

When checking if an indirect global (a global with pointer type) is only assigned by allocation functions, first check if the global is itself initialized. If it is, it's not only assigned by allocation functions.

This fixes PR25309. Thanks to David Majnemer for reducing the test case!

Added:
    llvm/trunk/test/Analysis/GlobalsModRef/pr25309.ll
Modified:
    llvm/trunk/include/llvm/Analysis/GlobalsModRef.h
    llvm/trunk/lib/Analysis/GlobalsModRef.cpp

Modified: llvm/trunk/include/llvm/Analysis/GlobalsModRef.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/GlobalsModRef.h?rev=251508&r1=251507&r2=251508&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/GlobalsModRef.h (original)
+++ llvm/trunk/include/llvm/Analysis/GlobalsModRef.h Wed Oct 28 05:41:29 2015
@@ -107,7 +107,7 @@ private:
                             SmallPtrSetImpl<Function *> *Readers = nullptr,
                             SmallPtrSetImpl<Function *> *Writers = nullptr,
                             GlobalValue *OkayStoreDest = nullptr);
-  bool AnalyzeIndirectGlobalMemory(GlobalValue *GV);
+  bool AnalyzeIndirectGlobalMemory(GlobalVariable *GV);
   void CollectSCCMembership(CallGraph &CG);
 
   bool isNonEscapingGlobalNoAlias(const GlobalValue *GV, const Value *V);

Modified: llvm/trunk/lib/Analysis/GlobalsModRef.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/GlobalsModRef.cpp?rev=251508&r1=251507&r2=251508&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/GlobalsModRef.cpp (original)
+++ llvm/trunk/lib/Analysis/GlobalsModRef.cpp Wed Oct 28 05:41:29 2015
@@ -395,11 +395,16 @@ bool GlobalsAAResult::AnalyzeUsesOfPoint
 /// Further, all loads out of GV must directly use the memory, not store the
 /// pointer somewhere.  If this is true, we consider the memory pointed to by
 /// GV to be owned by GV and can disambiguate other pointers from it.
-bool GlobalsAAResult::AnalyzeIndirectGlobalMemory(GlobalValue *GV) {
+bool GlobalsAAResult::AnalyzeIndirectGlobalMemory(GlobalVariable *GV) {
   // Keep track of values related to the allocation of the memory, f.e. the
   // value produced by the malloc call and any casts.
   std::vector<Value *> AllocRelatedValues;
 
+  // If the initializer is a valid pointer, bail.
+  if (Constant *C = GV->getInitializer())
+    if (!C->isNullValue())
+      return false;
+    
   // Walk the user list of the global.  If we find anything other than a direct
   // load or store, bail out.
   for (User *U : GV->users()) {

Added: llvm/trunk/test/Analysis/GlobalsModRef/pr25309.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/GlobalsModRef/pr25309.ll?rev=251508&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/GlobalsModRef/pr25309.ll (added)
+++ llvm/trunk/test/Analysis/GlobalsModRef/pr25309.ll Wed Oct 28 05:41:29 2015
@@ -0,0 +1,27 @@
+; RUN: opt -globals-aa -gvn < %s -S | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; @o and @m are initialized to @i, so they should not be classed as
+; indirect globals referring only to allocation functions.
+ at o = internal global i32* @i, align 8
+ at m = internal global i32* @i, align 8
+ at i = internal global i32 0, align 4
+
+; CHECK-LABEL: @f
+define i1 @f() {
+entry:
+  %0 = load i32*, i32** @o, align 8
+  store i32 0, i32* %0, align 4
+  %1 = load volatile i32*, i32** @m, align 8
+  store i32 1, i32* %1, align 4
+  ; CHECK: %[[a:.*]] = load i32*
+  %2 = load i32*, i32** @o, align 8
+  ; CHECK: %[[b:.*]] = load i32, i32* %[[a]]
+  %3 = load i32, i32* %2, align 4
+  ; CHECK: %[[c:.*]] = icmp ne i32 %[[b]], 0
+  %tobool.i = icmp ne i32 %3, 0
+  ; CHECK: ret i1 %[[c]]
+  ret i1 %tobool.i
+}
\ No newline at end of file




More information about the llvm-commits mailing list