LTO: Include dso-local bit in ThinLTO cache key.

Differential Revision: https://reviews.llvm.org/D42713

llvm-svn: 324253
This commit is contained in:
Peter Collingbourne 2018-02-05 17:17:51 +00:00
parent 2329fcd293
commit b4edfb9af9
5 changed files with 38 additions and 11 deletions

View File

@ -158,6 +158,8 @@ struct ValueInfo {
const GlobalValueSummaryMapTy::value_type *getRef() const {
return RefAndFlag.getPointer();
}
bool isDSOLocal() const;
};
template <> struct DenseMapInfo<ValueInfo> {

View File

@ -17,6 +17,15 @@
#include "llvm/Support/Path.h"
using namespace llvm;
bool ValueInfo::isDSOLocal() const {
// Need to check all summaries are local in case of hash collisions.
return getSummaryList().size() &&
llvm::all_of(getSummaryList(),
[](const std::unique_ptr<GlobalValueSummary> &Summary) {
return Summary->isDSOLocal();
});
}
// Collect for the given module the list of function it defines
// (GUID -> Summary).
void ModuleSummaryIndex::collectDefinedFunctionsForModule(

View File

@ -177,8 +177,10 @@ static void computeCacheKey(
auto AddUsedThings = [&](GlobalValueSummary *GS) {
if (!GS) return;
for (const ValueInfo &VI : GS->refs())
for (const ValueInfo &VI : GS->refs()) {
AddUnsigned(VI.isDSOLocal());
AddUsedCfiGlobal(VI.getGUID());
}
if (auto *FS = dyn_cast<FunctionSummary>(GS)) {
for (auto &TT : FS->type_tests())
UsedTypeIds.insert(TT);

View File

@ -206,16 +206,8 @@ void FunctionImportGlobalProcessing::processGlobalForThinLTO(GlobalValue &GV) {
// definition.
if (GV.hasName()) {
ValueInfo VI = ImportIndex.getValueInfo(GV.getGUID());
if (VI) {
// Need to check all summaries are local in case of hash collisions.
bool IsLocal = VI.getSummaryList().size() &&
llvm::all_of(VI.getSummaryList(),
[](const std::unique_ptr<GlobalValueSummary> &Summary) {
return Summary->isDSOLocal();
});
if (IsLocal)
GV.setDSOLocal(true);
}
if (VI && VI.isDSOLocal())
GV.setDSOLocal(true);
}
bool DoPromote = false;

View File

@ -0,0 +1,22 @@
; Tests whether the cache is sensitive to the dso-local bit on referenced
; globals.
; RUN: rm -rf %t.cache
; RUN: opt -module-hash -module-summary -o %t.bc %s
; RUN: llvm-lto2 run -o %t.o %t.bc -cache-dir %t.cache \
; RUN: -r %t.bc,foo,px \
; RUN: -r %t.bc,bar,px
; RUN: llvm-lto2 run -o %t.o %t.bc -cache-dir %t.cache \
; RUN: -r %t.bc,foo,plx \
; RUN: -r %t.bc,bar,px
; RUN: ls %t.cache | count 2
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define weak void @foo() {
ret void
}
define weak void()* @bar() {
ret void()* @foo
}