From: James Molloy Date: Tue, 13 Oct 2015 10:43:33 +0000 (+0000) Subject: [GlobalsAA] Don't assume anything about functions that may be overridden X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=62c17949c93bcad21afc1c64f71888e61c41bcce;p=oota-llvm.git [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@250156 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/GlobalsModRef.cpp b/lib/Analysis/GlobalsModRef.cpp index 40915f45dff..be5d384c435 100644 --- a/lib/Analysis/GlobalsModRef.cpp +++ b/lib/Analysis/GlobalsModRef.cpp @@ -480,8 +480,8 @@ void GlobalsAAResult::AnalyzeCallGraph(CallGraph &CG, Module &M) { const std::vector &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()); diff --git a/test/Analysis/GlobalsModRef/weak-interposition.ll b/test/Analysis/GlobalsModRef/weak-interposition.ll new file mode 100644 index 00000000000..091aa74d521 --- /dev/null +++ b/test/Analysis/GlobalsModRef/weak-interposition.ll @@ -0,0 +1,24 @@ +; RUN: opt -S -O1 -enable-non-lto-gmr=true < %s | FileCheck %s + +@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 +}