mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[ThinLTO] Don't import GV which contains blockaddress
Differential revision: https://reviews.llvm.org/D53139 llvm-svn: 344325
This commit is contained in:
parent
5a36888d0c
commit
f9eb8c8de5
@ -74,9 +74,17 @@ cl::opt<FunctionSummary::ForceSummaryHotnessType, true> FSEC(
|
||||
// Walk through the operands of a given User via worklist iteration and populate
|
||||
// the set of GlobalValue references encountered. Invoked either on an
|
||||
// Instruction or a GlobalVariable (which walks its initializer).
|
||||
static void findRefEdges(ModuleSummaryIndex &Index, const User *CurUser,
|
||||
// Return true if any of the operands contains blockaddress. This is important
|
||||
// to know when computing summary for global var, because if global variable
|
||||
// references basic block address we can't import it separately from function
|
||||
// containing that basic block. For simplicity we currently don't import such
|
||||
// global vars at all. When importing function we aren't interested if any
|
||||
// instruction in it takes an address of any basic block, because instruction
|
||||
// can only take an address of basic block located in the same function.
|
||||
static bool findRefEdges(ModuleSummaryIndex &Index, const User *CurUser,
|
||||
SetVector<ValueInfo> &RefEdges,
|
||||
SmallPtrSet<const User *, 8> &Visited) {
|
||||
bool HasBlockAddress = false;
|
||||
SmallVector<const User *, 32> Worklist;
|
||||
Worklist.push_back(CurUser);
|
||||
|
||||
@ -92,8 +100,10 @@ static void findRefEdges(ModuleSummaryIndex &Index, const User *CurUser,
|
||||
const User *Operand = dyn_cast<User>(OI);
|
||||
if (!Operand)
|
||||
continue;
|
||||
if (isa<BlockAddress>(Operand))
|
||||
if (isa<BlockAddress>(Operand)) {
|
||||
HasBlockAddress = true;
|
||||
continue;
|
||||
}
|
||||
if (auto *GV = dyn_cast<GlobalValue>(Operand)) {
|
||||
// We have a reference to a global value. This should be added to
|
||||
// the reference set unless it is a callee. Callees are handled
|
||||
@ -105,6 +115,7 @@ static void findRefEdges(ModuleSummaryIndex &Index, const User *CurUser,
|
||||
Worklist.push_back(Operand);
|
||||
}
|
||||
}
|
||||
return HasBlockAddress;
|
||||
}
|
||||
|
||||
static CalleeInfo::HotnessType getHotness(uint64_t ProfileCount,
|
||||
@ -369,7 +380,7 @@ computeVariableSummary(ModuleSummaryIndex &Index, const GlobalVariable &V,
|
||||
DenseSet<GlobalValue::GUID> &CantBePromoted) {
|
||||
SetVector<ValueInfo> RefEdges;
|
||||
SmallPtrSet<const User *, 8> Visited;
|
||||
findRefEdges(Index, &V, RefEdges, Visited);
|
||||
bool HasBlockAddress = findRefEdges(Index, &V, RefEdges, Visited);
|
||||
bool NonRenamableLocal = isNonRenamableLocal(V);
|
||||
GlobalValueSummary::GVFlags Flags(V.getLinkage(), NonRenamableLocal,
|
||||
/* Live = */ false, V.isDSOLocal());
|
||||
@ -377,6 +388,8 @@ computeVariableSummary(ModuleSummaryIndex &Index, const GlobalVariable &V,
|
||||
llvm::make_unique<GlobalVarSummary>(Flags, RefEdges.takeVector());
|
||||
if (NonRenamableLocal)
|
||||
CantBePromoted.insert(V.getGUID());
|
||||
if (HasBlockAddress)
|
||||
GVarSummary->setNotEligibleToImport();
|
||||
Index.addGlobalValueSummary(V, std::move(GVarSummary));
|
||||
}
|
||||
|
||||
|
@ -278,8 +278,7 @@ static void computeImportForReferencedGlobals(
|
||||
|
||||
for (auto &RefSummary : VI.getSummaryList())
|
||||
if (RefSummary->getSummaryKind() == GlobalValueSummary::GlobalVarKind &&
|
||||
// Don't try to import regular LTO summaries added to dummy module.
|
||||
!RefSummary->modulePath().empty() &&
|
||||
!RefSummary->notEligibleToImport() &&
|
||||
!GlobalValue::isInterposableLinkage(RefSummary->linkage()) &&
|
||||
RefSummary->refs().empty()) {
|
||||
ImportList[RefSummary->modulePath()].insert(VI.getGUID());
|
||||
|
12
test/ThinLTO/X86/Inputs/globals-import-blockaddr.ll
Normal file
12
test/ThinLTO/X86/Inputs/globals-import-blockaddr.ll
Normal file
@ -0,0 +1,12 @@
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
@label_addr = internal constant [1 x i8*] [i8* blockaddress(@foo, %lb)], align 8
|
||||
|
||||
; Function Attrs: noinline norecurse nounwind optnone uwtable
|
||||
define dso_local [1 x i8*]* @foo() {
|
||||
br label %lb
|
||||
|
||||
lb:
|
||||
ret [1 x i8*]* @label_addr
|
||||
}
|
18
test/ThinLTO/X86/globals-import-blockaddr.ll
Normal file
18
test/ThinLTO/X86/globals-import-blockaddr.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; RUN: opt -module-summary %s -o %t1.bc
|
||||
; RUN: opt -module-summary %p/Inputs/globals-import-blockaddr.ll -o %t2.bc
|
||||
; RUN: llvm-lto2 run -save-temps %t1.bc -r=%t1.bc,foo,l -r=%t1.bc,main,pl %t2.bc -r=%t2.bc,foo,pl -o %t3
|
||||
; RUN: llvm-dis %t3.1.3.import.bc -o - | FileCheck %s
|
||||
|
||||
; Verify that we haven't imported GV containing blockaddress
|
||||
; CHECK: @label_addr.llvm.0 = external hidden constant
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
declare dso_local [1 x i8*]* @foo();
|
||||
|
||||
define dso_local i32 @main() {
|
||||
%p = call [1 x i8*]* @foo()
|
||||
%v = ptrtoint [1 x i8*]* %p to i32
|
||||
ret i32 %v
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user