[llvm] r250156 - [GlobalsAA] Don't assume anything about functions that may be overridden

James Molloy via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 13 03:43:34 PDT 2015


Author: jamesm
Date: Tue Oct 13 05:43:33 2015
New Revision: 250156

URL: http://llvm.org/viewvc/llvm-project?rev=250156&view=rev
Log:
[GlobalsAA] Don't assume anything about functions that may be overridden

Weak linkage and friends allow a symbol to be overriden outside the
code generator's model, so GlobalsAA shouldn't assume that anything it
can compute about such a symbol is valid.

Added:
    llvm/trunk/test/Analysis/GlobalsModRef/weak-interposition.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=250156&r1=250155&r2=250156&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/GlobalsModRef.cpp (original)
+++ llvm/trunk/lib/Analysis/GlobalsModRef.cpp Tue Oct 13 05:43:33 2015
@@ -480,8 +480,8 @@ void GlobalsAAResult::AnalyzeCallGraph(C
     const std::vector<CallGraphNode *> &SCC = *I;
     assert(!SCC.empty() && "SCC with no functions?");
 
-    if (!SCC[0]->getFunction()) {
-      // Calls externally - can't say anything useful.  Remove any existing
+    if (!SCC[0]->getFunction() || SCC[0]->getFunction()->mayBeOverridden()) {
+      // Calls externally or is weak - can't say anything useful. Remove any existing
       // function records (may have been created when scanning globals).
       for (auto *Node : SCC)
         FunctionInfos.erase(Node->getFunction());

Added: llvm/trunk/test/Analysis/GlobalsModRef/weak-interposition.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/GlobalsModRef/weak-interposition.ll?rev=250156&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/GlobalsModRef/weak-interposition.ll (added)
+++ llvm/trunk/test/Analysis/GlobalsModRef/weak-interposition.ll Tue Oct 13 05:43:33 2015
@@ -0,0 +1,24 @@
+; RUN: opt -S -O1 -enable-non-lto-gmr=true < %s | FileCheck %s
+
+ at a = common global i32 0, align 4
+
+; @hook_me is weak, so GMR must not eliminate the reload of @a in @f,
+; even though @hook_me doesn't mod or ref @a.
+
+; Function Attrs: nounwind ssp uwtable
+define weak i32 @hook_me() {
+  ret i32 0
+}
+
+; Function Attrs: nounwind ssp uwtable
+define i32 @f() {
+  %1 = alloca i32, align 4
+  store i32 4, i32* @a, align 4
+  %2 = call i32 @hook_me()
+  ; CHECK: load i32, i32* @a, align 4
+  %3 = load i32, i32* @a, align 4
+  %4 = add nsw i32 %3, %2
+  store i32 %4, i32* @a, align 4
+  %5 = load i32, i32* %1
+  ret i32 %5
+}




More information about the llvm-commits mailing list