[ThinLTO] Reduce the number of renaming due to promotions (#183793)
Currently for thin-lto, the imported static global values (functions, variables, etc) will be promoted/renamed from e.g., foo() to foo.llvm.(). Such a renaming caused difficulties in live patching since function name is changed ([1]). It is possible that some global value names have to be promoted to avoid name collision and linker failure. But in practice, majority of name promotions can be avoided. In [2], the suggestion is that thin-lto pre-link decides whether a particular global value needs name promotion or not. If yes, later on in thinBackend() the name will be promoted. I compiled a particular linux kernel version (latest bpf-next tree) and found 1216 global values with suffix .llvm.. With this patch, the number of promoted functions is 2, 98% reduction from the original kernel build. If some native objects are not participating with LTO, name promotions have to be done to avoid potential linker issues. So the current implementation cannot be on by default. But in certain cases, e.g., linux kernel build, people can enable lld flag --lto-whole-program-visibility to reduce the number of functions like foo.llvm.(). For ThinLTOCodeGenerator.cpp which is used by llvm-lto tool and a few other rare cases, reducing the number of renaming due to promotion, is not implemented as lld flag '-lto-whole-program-visibility' is not supported in ThinLTOCodeGenerator.cpp for now. In summary, this pull request only supports llvm-lto2 style workflow. The feature is off by default. To enable the future, lld flag '-lto-whole-program-visibility' and llvm flag '-always-rename-promoted-locals=false' are needed. The link [3] has more context for the pull request discussions. [1] https://lpc.events/event/19/contributions/2212 [2] https://discourse.llvm.org/t/rfc-avoid-functions-like-foo-llvm-for-kernel-live-patch/89400 [3] https://github.com/llvm/llvm-project/pull/178587
This commit is contained in:
parent
e317f42455
commit
3e05ab6322
@ -34,7 +34,7 @@
|
||||
; Round trip it through llvm-as
|
||||
; RUN: llvm-dis %t.o.thinlto.bc -o - | llvm-as -o - | llvm-dis -o - | FileCheck %s --check-prefix=CHECK-DIS
|
||||
; CHECK-DIS: ^0 = module: (path: "{{.*}}cfi-devirt.ll.tmp.o", hash: ({{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}}))
|
||||
; CHECK-DIS: ^1 = gv: (guid: 8346051122425466633, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 18, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTests: (^2), typeCheckedLoadVCalls: (vFuncId: (^2, offset: 8), vFuncId: (^2, offset: 0))))))
|
||||
; CHECK-DIS: ^1 = gv: (guid: 8346051122425466633, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 18, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTests: (^2), typeCheckedLoadVCalls: (vFuncId: (^2, offset: 8), vFuncId: (^2, offset: 0))))))
|
||||
; CHECK-DIS: ^2 = typeid: (name: "_ZTS1A", summary: (typeTestRes: (kind: allOnes, sizeM1BitWidth: 7), wpdResolutions: ((offset: 0, wpdRes: (kind: branchFunnel)), (offset: 8, wpdRes: (kind: singleImpl, singleImplName: "_ZN1A1nEi"))))) ; guid = 7004155349499253778
|
||||
|
||||
; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu \
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
; Round trip it through llvm-as
|
||||
; RUN: llvm-dis %t.o.thinlto.bc -o - | llvm-as -o - | llvm-dis -o - | FileCheck %s --check-prefix=CHECK-DIS
|
||||
; CHECK-DIS: ^0 = module: (path: "{{.*}}cfi.ll.tmp.o", hash: ({{.*}}, {{.*}}, {{.*}}, {{.*}}, {{.*}}))
|
||||
; CHECK-DIS: ^1 = gv: (guid: 8346051122425466633, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 7, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 1, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), typeIdInfo: (typeTests: (^2)))))
|
||||
; CHECK-DIS: ^1 = gv: (guid: 8346051122425466633, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 7, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 1, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), typeIdInfo: (typeTests: (^2)))))
|
||||
; CHECK-DIS: ^2 = typeid: (name: "_ZTS1A", summary: (typeTestRes: (kind: single, sizeM1BitWidth: 0))) ; guid = 7004155349499253778
|
||||
|
||||
; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu \
|
||||
|
||||
@ -15,9 +15,9 @@
|
||||
; RUN: llvm-dis %t1.o.1.1.promote.bc -o - | FileCheck %s --check-prefix=CHECK-IR
|
||||
|
||||
;; Summary for call_extern. Note that llvm-lto2 writes out the index before propagation occurs so call_extern doesn't have its flags updated.
|
||||
; CHECK-INDEX: ^2 = gv: (guid: 13959900437860518209, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 2, calls: ((callee: ^3)))))
|
||||
; CHECK-INDEX: ^2 = gv: (guid: 13959900437860518209, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, calls: ((callee: ^3)))))
|
||||
;; Summary for extern
|
||||
; CHECK-INDEX: ^3 = gv: (guid: 14959766916849974397, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 1, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0))))
|
||||
; CHECK-INDEX: ^3 = gv: (guid: 14959766916849974397, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 1, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0))))
|
||||
|
||||
;--- a.ll
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
@ -62,15 +62,15 @@
|
||||
; IR_AB-DAG: gv: (name: "__profc_foo", {{.*}} guid = [[PROFC:[0-9]+]]
|
||||
|
||||
;; Check extra attributes. b.bc:__profc_foo is prevailing, so it can be internalized.
|
||||
; IR_AB-DAG: gv: (guid: [[PROFD]], summaries: (variable: (module: ^0, flags: (linkage: private, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), varFlags: (readonly: 0, writeonly: 0, constant: 0),
|
||||
; IR_AB-DAG: gv: (guid: [[PROFC]], summaries: (variable: (module: ^0, flags: (linkage: internal, visibility: hidden, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition), varFlags: (readonly: 0, writeonly: 0, constant: 0))))
|
||||
; IR_AB-DAG: gv: (guid: [[PROFD]], summaries: (variable: (module: ^0, flags: (linkage: private, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0),
|
||||
; IR_AB-DAG: gv: (guid: [[PROFC]], summaries: (variable: (module: ^0, flags: (linkage: internal, visibility: hidden, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0))))
|
||||
|
||||
; IR_ABC-DAG: gv: (name: "__profd_foo", {{.*}} guid = [[PROFD:[0-9]+]]
|
||||
; IR_ABC-DAG: gv: (name: "__profc_foo", {{.*}} guid = [[PROFC:[0-9]+]]
|
||||
|
||||
;; b.bc:__profc_foo prevails c.bc:__profc_foo, so it is exported and therefore not internalized.
|
||||
; IR_ABC-DAG: gv: (guid: [[PROFD]], summaries: (variable: (module: ^0, flags: (linkage: private, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), varFlags: (readonly: 0, writeonly: 0, constant: 0),
|
||||
; IR_ABC-DAG: gv: (guid: [[PROFC]], summaries: (variable: (module: ^0, flags: (linkage: weak, visibility: hidden, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition), varFlags: (readonly: 0, writeonly: 0, constant: 0))))
|
||||
; IR_ABC-DAG: gv: (guid: [[PROFD]], summaries: (variable: (module: ^0, flags: (linkage: private, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0),
|
||||
; IR_ABC-DAG: gv: (guid: [[PROFC]], summaries: (variable: (module: ^0, flags: (linkage: weak, visibility: hidden, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0))))
|
||||
|
||||
;--- a.ll
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
@ -404,6 +404,7 @@ enum Kind {
|
||||
kw_importType,
|
||||
kw_definition,
|
||||
kw_declaration,
|
||||
kw_noRenameOnPromotion,
|
||||
kw_function,
|
||||
kw_insts,
|
||||
kw_funcFlags,
|
||||
|
||||
@ -269,6 +269,8 @@ struct ValueInfo {
|
||||
|
||||
/// Checks if all copies are eligible for auto-hiding (have flag set).
|
||||
LLVM_ABI bool canAutoHide() const;
|
||||
|
||||
LLVM_ABI bool noRenameOnPromotion() const;
|
||||
};
|
||||
|
||||
inline raw_ostream &operator<<(raw_ostream &OS, const ValueInfo &VI) {
|
||||
@ -513,15 +515,21 @@ public:
|
||||
/// transition
|
||||
unsigned Promoted : 1;
|
||||
|
||||
/// This field is written by the ThinLTO prelink stage to decide whether
|
||||
/// a particular static global value should be promoted or not.
|
||||
unsigned NoRenameOnPromotion : 1;
|
||||
|
||||
/// Convenience Constructors
|
||||
explicit GVFlags(GlobalValue::LinkageTypes Linkage,
|
||||
GlobalValue::VisibilityTypes Visibility,
|
||||
bool NotEligibleToImport, bool Live, bool IsLocal,
|
||||
bool CanAutoHide, ImportKind ImportType)
|
||||
bool CanAutoHide, ImportKind ImportType,
|
||||
bool NoRenameOnPromotion)
|
||||
: Linkage(Linkage), Visibility(Visibility),
|
||||
NotEligibleToImport(NotEligibleToImport), Live(Live),
|
||||
DSOLocal(IsLocal), CanAutoHide(CanAutoHide),
|
||||
ImportType(static_cast<unsigned>(ImportType)), Promoted(false) {}
|
||||
ImportType(static_cast<unsigned>(ImportType)), Promoted(false),
|
||||
NoRenameOnPromotion(NoRenameOnPromotion) {}
|
||||
};
|
||||
|
||||
private:
|
||||
@ -631,6 +639,12 @@ public:
|
||||
|
||||
void setImportKind(ImportKind IK) { Flags.ImportType = IK; }
|
||||
|
||||
void setNoRenameOnPromotion(bool NoRenameOnPromotion) {
|
||||
Flags.NoRenameOnPromotion = NoRenameOnPromotion;
|
||||
}
|
||||
|
||||
bool noRenameOnPromotion() const { return Flags.NoRenameOnPromotion; }
|
||||
|
||||
GlobalValueSummary::ImportKind importType() const {
|
||||
return static_cast<ImportKind>(Flags.ImportType);
|
||||
}
|
||||
@ -899,7 +913,8 @@ public:
|
||||
GlobalValue::LinkageTypes::AvailableExternallyLinkage,
|
||||
GlobalValue::DefaultVisibility,
|
||||
/*NotEligibleToImport=*/true, /*Live=*/true, /*IsLocal=*/false,
|
||||
/*CanAutoHide=*/false, GlobalValueSummary::ImportKind::Definition),
|
||||
/*CanAutoHide=*/false, GlobalValueSummary::ImportKind::Definition,
|
||||
/*NoRenameOnPromotion=*/false),
|
||||
/*NumInsts=*/0, FunctionSummary::FFlags{}, SmallVector<ValueInfo, 0>(),
|
||||
std::move(Edges), std::vector<GlobalValue::GUID>(),
|
||||
std::vector<FunctionSummary::VFuncId>(),
|
||||
|
||||
@ -142,6 +142,7 @@ struct GlobalValueSummaryYaml {
|
||||
unsigned Linkage, Visibility;
|
||||
bool NotEligibleToImport, Live, IsLocal, CanAutoHide;
|
||||
unsigned ImportType;
|
||||
bool NoRenameOnPromotion;
|
||||
// Fields for AliasSummary
|
||||
std::optional<uint64_t> Aliasee;
|
||||
// Fields for FunctionSummary
|
||||
@ -191,6 +192,7 @@ template <> struct MappingTraits<GlobalValueSummaryYaml> {
|
||||
io.mapOptional("Local", summary.IsLocal);
|
||||
io.mapOptional("CanAutoHide", summary.CanAutoHide);
|
||||
io.mapOptional("ImportType", summary.ImportType);
|
||||
io.mapOptional("NoRenameOnPromotion", summary.NoRenameOnPromotion);
|
||||
io.mapOptional("Aliasee", summary.Aliasee);
|
||||
io.mapOptional("Refs", summary.Refs);
|
||||
io.mapOptional("TypeTests", summary.TypeTests);
|
||||
@ -228,7 +230,8 @@ template <> struct CustomMappingTraits<GlobalValueSummaryMapTy> {
|
||||
static_cast<GlobalValue::VisibilityTypes>(GVSum.Visibility),
|
||||
GVSum.NotEligibleToImport, GVSum.Live, GVSum.IsLocal,
|
||||
GVSum.CanAutoHide,
|
||||
static_cast<GlobalValueSummary::ImportKind>(GVSum.ImportType));
|
||||
static_cast<GlobalValueSummary::ImportKind>(GVSum.ImportType),
|
||||
GVSum.NoRenameOnPromotion);
|
||||
if (GVSum.Aliasee) {
|
||||
auto ASum = std::make_unique<AliasSummary>(GVFlags);
|
||||
V.try_emplace(*GVSum.Aliasee, /*IsAnalysis=*/false);
|
||||
@ -272,9 +275,10 @@ template <> struct CustomMappingTraits<GlobalValueSummaryMapTy> {
|
||||
static_cast<bool>(FSum->flags().Live),
|
||||
static_cast<bool>(FSum->flags().DSOLocal),
|
||||
static_cast<bool>(FSum->flags().CanAutoHide),
|
||||
FSum->flags().ImportType, /*Aliasee=*/std::nullopt, Refs,
|
||||
FSum->type_tests(), FSum->type_test_assume_vcalls(),
|
||||
FSum->type_checked_load_vcalls(),
|
||||
FSum->flags().ImportType,
|
||||
static_cast<bool>(FSum->flags().NoRenameOnPromotion),
|
||||
/*Aliasee=*/std::nullopt, Refs, FSum->type_tests(),
|
||||
FSum->type_test_assume_vcalls(), FSum->type_checked_load_vcalls(),
|
||||
FSum->type_test_assume_const_vcalls(),
|
||||
FSum->type_checked_load_const_vcalls()});
|
||||
} else if (auto *ASum = dyn_cast<AliasSummary>(Sum.get());
|
||||
@ -286,6 +290,7 @@ template <> struct CustomMappingTraits<GlobalValueSummaryMapTy> {
|
||||
static_cast<bool>(ASum->flags().DSOLocal),
|
||||
static_cast<bool>(ASum->flags().CanAutoHide),
|
||||
ASum->flags().ImportType,
|
||||
static_cast<bool>(ASum->flags().NoRenameOnPromotion),
|
||||
/*Aliasee=*/ASum->getAliaseeGUID()});
|
||||
}
|
||||
}
|
||||
|
||||
@ -65,7 +65,8 @@ LLVM_ABI void thinLTOInternalizeAndPromoteInIndex(
|
||||
ModuleSummaryIndex &Index,
|
||||
function_ref<bool(StringRef, ValueInfo)> isExported,
|
||||
function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
|
||||
isPrevailing);
|
||||
isPrevailing,
|
||||
DenseSet<StringRef> *ExternallyVisibleSymbolNamesPtr = nullptr);
|
||||
|
||||
/// Computes a unique hash for the Module considering the current list of
|
||||
/// export/import and other global analysis results.
|
||||
|
||||
@ -271,14 +271,16 @@ LLVM_ABI void getVisibleToRegularObjVtableGUIDs(
|
||||
/// devirtualized target name will need adjustment).
|
||||
LLVM_ABI void runWholeProgramDevirtOnIndex(
|
||||
ModuleSummaryIndex &Summary, std::set<GlobalValue::GUID> &ExportedGUIDs,
|
||||
std::map<ValueInfo, std::vector<VTableSlotSummary>> &LocalWPDTargetsMap);
|
||||
std::map<ValueInfo, std::vector<VTableSlotSummary>> &LocalWPDTargetsMap,
|
||||
DenseSet<StringRef> *ExternallyVisibleSymbolNamesPtr = nullptr);
|
||||
|
||||
/// Call after cross-module importing to update the recorded single impl
|
||||
/// devirt target names for any locals that were exported.
|
||||
LLVM_ABI void updateIndexWPDForExports(
|
||||
ModuleSummaryIndex &Summary,
|
||||
function_ref<bool(StringRef, ValueInfo)> isExported,
|
||||
std::map<ValueInfo, std::vector<VTableSlotSummary>> &LocalWPDTargetsMap);
|
||||
std::map<ValueInfo, std::vector<VTableSlotSummary>> &LocalWPDTargetsMap,
|
||||
DenseSet<StringRef> *ExternallyVisibleSymbolNamesPtr = nullptr);
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
|
||||
@ -63,7 +63,8 @@ class FunctionImportGlobalProcessing {
|
||||
DenseMap<const Comdat *, Comdat *> RenamedComdats;
|
||||
|
||||
/// Check if we should promote the given local value to global scope.
|
||||
bool shouldPromoteLocalToGlobal(const GlobalValue *SGV, ValueInfo VI);
|
||||
bool shouldPromoteLocalToGlobal(const GlobalValue *SGV,
|
||||
GlobalValueSummary *Summary);
|
||||
|
||||
#ifndef NDEBUG
|
||||
/// Check if the given value is a local that can't be renamed (promoted).
|
||||
|
||||
@ -712,7 +712,8 @@ static void computeFunctionSummary(
|
||||
GlobalValueSummary::GVFlags Flags(
|
||||
F.getLinkage(), F.getVisibility(), NotEligibleForImport,
|
||||
/* Live = */ false, F.isDSOLocal(), F.canBeOmittedFromSymbolTable(),
|
||||
GlobalValueSummary::ImportKind::Definition);
|
||||
GlobalValueSummary::ImportKind::Definition,
|
||||
/* NoRenameOnPromotion = */ false);
|
||||
FunctionSummary::FFlags FunFlags{
|
||||
F.doesNotAccessMemory(), F.onlyReadsMemory() && !F.doesNotAccessMemory(),
|
||||
F.hasFnAttribute(Attribute::NoRecurse), F.returnDoesNotAlias(),
|
||||
@ -870,7 +871,7 @@ static void computeVariableSummary(ModuleSummaryIndex &Index,
|
||||
GlobalValueSummary::GVFlags Flags(
|
||||
V.getLinkage(), V.getVisibility(), NonRenamableLocal,
|
||||
/* Live = */ false, V.isDSOLocal(), V.canBeOmittedFromSymbolTable(),
|
||||
GlobalValueSummary::Definition);
|
||||
GlobalValueSummary::Definition, /* NoRenameOnPromotion = */ false);
|
||||
|
||||
VTableFuncList VTableFuncs;
|
||||
// If splitting is not enabled, then we compute the summary information
|
||||
@ -917,7 +918,7 @@ static void computeAliasSummary(ModuleSummaryIndex &Index, const GlobalAlias &A,
|
||||
GlobalValueSummary::GVFlags Flags(
|
||||
A.getLinkage(), A.getVisibility(), NonRenamableLocal,
|
||||
/* Live = */ false, A.isDSOLocal(), A.canBeOmittedFromSymbolTable(),
|
||||
GlobalValueSummary::Definition);
|
||||
GlobalValueSummary::Definition, /* NoRenameOnPromotion = */ false);
|
||||
auto AS = std::make_unique<AliasSummary>(Flags);
|
||||
auto AliaseeVI = Index.getValueInfo(Aliasee->getGUID());
|
||||
assert(AliaseeVI && "Alias expects aliasee summary to be available");
|
||||
@ -999,7 +1000,8 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(
|
||||
/* NotEligibleToImport = */ true,
|
||||
/* Live = */ true,
|
||||
/* Local */ GV->isDSOLocal(), GV->canBeOmittedFromSymbolTable(),
|
||||
GlobalValueSummary::Definition);
|
||||
GlobalValueSummary::Definition,
|
||||
/* NoRenameOnPromotion = */ false);
|
||||
CantBePromoted.insert(GV->getGUID());
|
||||
// Create the appropriate summary type.
|
||||
if (Function *F = dyn_cast<Function>(GV)) {
|
||||
|
||||
@ -809,6 +809,7 @@ lltok::Kind LLLexer::LexIdentifier() {
|
||||
KEYWORD(importType);
|
||||
KEYWORD(definition);
|
||||
KEYWORD(declaration);
|
||||
KEYWORD(noRenameOnPromotion);
|
||||
KEYWORD(function);
|
||||
KEYWORD(insts);
|
||||
KEYWORD(funcFlags);
|
||||
|
||||
@ -10023,7 +10023,7 @@ bool LLParser::parseFunctionSummary(std::string Name, GlobalValue::GUID GUID,
|
||||
GlobalValue::ExternalLinkage, GlobalValue::DefaultVisibility,
|
||||
/*NotEligibleToImport=*/false,
|
||||
/*Live=*/false, /*IsLocal=*/false, /*CanAutoHide=*/false,
|
||||
GlobalValueSummary::Definition);
|
||||
GlobalValueSummary::Definition, /*NoRenameOnPromotion=*/false);
|
||||
unsigned InstCount;
|
||||
SmallVector<FunctionSummary::EdgeTy, 0> Calls;
|
||||
FunctionSummary::TypeIdInfo TypeIdInfo;
|
||||
@ -10111,7 +10111,7 @@ bool LLParser::parseVariableSummary(std::string Name, GlobalValue::GUID GUID,
|
||||
GlobalValue::ExternalLinkage, GlobalValue::DefaultVisibility,
|
||||
/*NotEligibleToImport=*/false,
|
||||
/*Live=*/false, /*IsLocal=*/false, /*CanAutoHide=*/false,
|
||||
GlobalValueSummary::Definition);
|
||||
GlobalValueSummary::Definition, /*NoRenameOnPromotion=*/false);
|
||||
GlobalVarSummary::GVarFlags GVarFlags(/*ReadOnly*/ false,
|
||||
/* WriteOnly */ false,
|
||||
/* Constant */ false,
|
||||
@ -10170,7 +10170,7 @@ bool LLParser::parseAliasSummary(std::string Name, GlobalValue::GUID GUID,
|
||||
GlobalValue::ExternalLinkage, GlobalValue::DefaultVisibility,
|
||||
/*NotEligibleToImport=*/false,
|
||||
/*Live=*/false, /*IsLocal=*/false, /*CanAutoHide=*/false,
|
||||
GlobalValueSummary::Definition);
|
||||
GlobalValueSummary::Definition, /*NoRenameOnPromotion=*/false);
|
||||
if (parseToken(lltok::colon, "expected ':' here") ||
|
||||
parseToken(lltok::lparen, "expected '(' here") ||
|
||||
parseModuleReference(ModulePath) ||
|
||||
@ -10967,6 +10967,12 @@ bool LLParser::parseGVFlags(GlobalValueSummary::GVFlags &GVFlags) {
|
||||
GVFlags.ImportType = static_cast<unsigned>(IK);
|
||||
Lex.Lex();
|
||||
break;
|
||||
case lltok::kw_noRenameOnPromotion:
|
||||
Lex.Lex();
|
||||
if (parseToken(lltok::colon, "expected ':'") || parseFlag(Flag))
|
||||
return true;
|
||||
GVFlags.NoRenameOnPromotion = Flag;
|
||||
break;
|
||||
default:
|
||||
return error(Lex.getLoc(), "expected gv flag type");
|
||||
}
|
||||
|
||||
@ -1175,6 +1175,7 @@ static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags(uint64_t RawFlags,
|
||||
auto Linkage = GlobalValue::LinkageTypes(RawFlags & 0xF); // 4 bits
|
||||
auto Visibility = GlobalValue::VisibilityTypes((RawFlags >> 8) & 3); // 2 bits
|
||||
auto IK = GlobalValueSummary::ImportKind((RawFlags >> 10) & 1); // 1 bit
|
||||
bool NoRenameOnPromotion = ((RawFlags >> 11) & 1); // 1 bit
|
||||
RawFlags = RawFlags >> 4;
|
||||
bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
|
||||
// The Live flag wasn't introduced until version 3. For dead stripping
|
||||
@ -1185,7 +1186,8 @@ static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags(uint64_t RawFlags,
|
||||
bool AutoHide = (RawFlags & 0x8);
|
||||
|
||||
return GlobalValueSummary::GVFlags(Linkage, Visibility, NotEligibleToImport,
|
||||
Live, Local, AutoHide, IK);
|
||||
Live, Local, AutoHide, IK,
|
||||
NoRenameOnPromotion);
|
||||
}
|
||||
|
||||
// Decode the flags for GlobalVariable in the summary
|
||||
|
||||
@ -1337,6 +1337,8 @@ static uint64_t getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags,
|
||||
unsigned ImportType = Flags.ImportType | ImportAsDecl;
|
||||
RawFlags |= (ImportType << 10); // 1 bit
|
||||
|
||||
RawFlags |= (Flags.NoRenameOnPromotion << 11); // 1 bit
|
||||
|
||||
return RawFlags;
|
||||
}
|
||||
|
||||
|
||||
@ -3730,6 +3730,7 @@ void AssemblyWriter::printSummary(const GlobalValueSummary &Summary) {
|
||||
Out << ", canAutoHide: " << GVFlags.CanAutoHide;
|
||||
Out << ", importType: "
|
||||
<< getImportTypeName(GlobalValueSummary::ImportKind(GVFlags.ImportType));
|
||||
Out << ", noRenameOnPromotion: " << GVFlags.NoRenameOnPromotion;
|
||||
Out << ")";
|
||||
|
||||
if (Summary.getSummaryKind() == GlobalValueSummary::AliasKind)
|
||||
|
||||
@ -686,6 +686,8 @@ void ModuleSummaryIndex::exportToDot(
|
||||
A.addComment("definition");
|
||||
else if (Flags.ImportType == GlobalValueSummary::ImportKind::Declaration)
|
||||
A.addComment("declaration");
|
||||
if (Flags.NoRenameOnPromotion)
|
||||
A.addComment("noRenameOnPromotion");
|
||||
if (GUIDPreservedSymbols.count(SummaryIt.first))
|
||||
A.addComment("preserved");
|
||||
|
||||
|
||||
@ -110,6 +110,7 @@ static cl::opt<bool>
|
||||
namespace llvm {
|
||||
extern cl::opt<bool> CodeGenDataThinLTOTwoRounds;
|
||||
extern cl::opt<bool> ForceImportAll;
|
||||
extern cl::opt<bool> AlwaysRenamePromotedLocals;
|
||||
} // end namespace llvm
|
||||
|
||||
namespace llvm {
|
||||
@ -509,7 +510,8 @@ void llvm::thinLTOResolvePrevailingInIndex(
|
||||
static void thinLTOInternalizeAndPromoteGUID(
|
||||
ValueInfo VI, function_ref<bool(StringRef, ValueInfo)> isExported,
|
||||
function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
|
||||
isPrevailing) {
|
||||
isPrevailing,
|
||||
DenseSet<StringRef> *ExternallyVisibleSymbolNamesPtr) {
|
||||
// Before performing index-based internalization and promotion for this GUID,
|
||||
// the local flag should be consistent with the summary list linkage types.
|
||||
VI.verifyLocal();
|
||||
@ -518,12 +520,24 @@ static void thinLTOInternalizeAndPromoteGUID(
|
||||
VI.getSummaryList().size() == 1 &&
|
||||
!GlobalValue::isLocalLinkage(VI.getSummaryList().front()->linkage());
|
||||
|
||||
bool NameRecorded = false;
|
||||
for (auto &S : VI.getSummaryList()) {
|
||||
// First see if we need to promote an internal value because it is not
|
||||
// exported.
|
||||
if (isExported(S->modulePath(), VI)) {
|
||||
if (GlobalValue::isLocalLinkage(S->linkage()))
|
||||
if (GlobalValue::isLocalLinkage(S->linkage())) {
|
||||
// Only the first local GlobalValue in a list of summaries does not
|
||||
// need renaming. In rare cases if there exist more than one summaries
|
||||
// in the list, the rest of them must have renaming (through promotion)
|
||||
// to avoid conflict.
|
||||
if (ExternallyVisibleSymbolNamesPtr && !NameRecorded) {
|
||||
NameRecorded = true;
|
||||
if (ExternallyVisibleSymbolNamesPtr->insert(VI.name()).second)
|
||||
S->setNoRenameOnPromotion(true);
|
||||
}
|
||||
|
||||
S->promote();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -593,11 +607,14 @@ void llvm::thinLTOInternalizeAndPromoteInIndex(
|
||||
ModuleSummaryIndex &Index,
|
||||
function_ref<bool(StringRef, ValueInfo)> isExported,
|
||||
function_ref<bool(GlobalValue::GUID, const GlobalValueSummary *)>
|
||||
isPrevailing) {
|
||||
isPrevailing,
|
||||
DenseSet<StringRef> *ExternallyVisibleSymbolNamesPtr) {
|
||||
assert(!Index.withInternalizeAndPromote());
|
||||
|
||||
for (auto &I : Index)
|
||||
thinLTOInternalizeAndPromoteGUID(Index.getValueInfo(I), isExported,
|
||||
isPrevailing);
|
||||
isPrevailing,
|
||||
ExternallyVisibleSymbolNamesPtr);
|
||||
Index.setWithInternalizeAndPromote();
|
||||
}
|
||||
|
||||
@ -2047,8 +2064,19 @@ Error LTO::runThinLTO(AddStreamFn AddStream, FileCache Cache,
|
||||
// no index entries in the typeIdMetadata map (e.g. if we are instead
|
||||
// performing IR-based WPD in hybrid regular/thin LTO mode).
|
||||
std::map<ValueInfo, std::vector<VTableSlotSummary>> LocalWPDTargetsMap;
|
||||
DenseSet<StringRef> ExternallyVisibleSymbolNames;
|
||||
|
||||
// Used by the promotion-time renaming logic. When non-null, this set
|
||||
// identifies symbols that should not be renamed during promotion.
|
||||
// It is non-null only when whole-program visibility is enabled and
|
||||
// renaming is not forced. Otherwise, the default renaming behavior applies.
|
||||
DenseSet<StringRef> *ExternallyVisibleSymbolNamesPtr =
|
||||
(WholeProgramVisibilityEnabledInLTO && !AlwaysRenamePromotedLocals)
|
||||
? &ExternallyVisibleSymbolNames
|
||||
: nullptr;
|
||||
runWholeProgramDevirtOnIndex(ThinLTO.CombinedIndex, ExportedGUIDs,
|
||||
LocalWPDTargetsMap);
|
||||
LocalWPDTargetsMap,
|
||||
ExternallyVisibleSymbolNamesPtr);
|
||||
|
||||
auto isPrevailing = [&](GlobalValue::GUID GUID, const GlobalValueSummary *S) {
|
||||
return ThinLTO.isPrevailingModuleForGUID(GUID, S->modulePath());
|
||||
@ -2108,10 +2136,27 @@ Error LTO::runThinLTO(AddStreamFn AddStream, FileCache Cache,
|
||||
// Update local devirtualized targets that were exported by cross-module
|
||||
// importing or by other devirtualizations marked in the ExportedGUIDs set.
|
||||
updateIndexWPDForExports(ThinLTO.CombinedIndex, isExported,
|
||||
LocalWPDTargetsMap);
|
||||
LocalWPDTargetsMap, ExternallyVisibleSymbolNamesPtr);
|
||||
|
||||
if (ExternallyVisibleSymbolNamesPtr) {
|
||||
// Add to ExternallyVisibleSymbolNames the set of unique names used by all
|
||||
// externally visible symbols in the index.
|
||||
for (auto &I : ThinLTO.CombinedIndex) {
|
||||
ValueInfo VI = ThinLTO.CombinedIndex.getValueInfo(I);
|
||||
for (const auto &Summary : VI.getSummaryList()) {
|
||||
const GlobalValueSummary *Base = Summary->getBaseObject();
|
||||
if (GlobalValue::isLocalLinkage(Base->linkage()))
|
||||
continue;
|
||||
|
||||
ExternallyVisibleSymbolNamesPtr->insert(VI.name());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
thinLTOInternalizeAndPromoteInIndex(ThinLTO.CombinedIndex, isExported,
|
||||
isPrevailing);
|
||||
isPrevailing,
|
||||
ExternallyVisibleSymbolNamesPtr);
|
||||
|
||||
auto recordNewLinkage = [&](StringRef ModuleIdentifier,
|
||||
GlobalValue::GUID GUID,
|
||||
|
||||
@ -773,6 +773,11 @@ struct DevirtIndex {
|
||||
// resolution for local targets in case they are exported by cross module
|
||||
// importing.
|
||||
std::map<ValueInfo, std::vector<VTableSlotSummary>> &LocalWPDTargetsMap;
|
||||
// We have hardcoded the promoted and renamed function name in the WPD
|
||||
// summary, so we need to ensure that they will be renamed. Note this and
|
||||
// that adding the current names to this set ensures we continue to rename
|
||||
// them.
|
||||
DenseSet<StringRef> *ExternallyVisibleSymbolNamesPtr;
|
||||
|
||||
MapVector<VTableSlotSummary, VTableSlotInfo> CallSlots;
|
||||
|
||||
@ -781,9 +786,11 @@ struct DevirtIndex {
|
||||
DevirtIndex(
|
||||
ModuleSummaryIndex &ExportSummary,
|
||||
std::set<GlobalValue::GUID> &ExportedGUIDs,
|
||||
std::map<ValueInfo, std::vector<VTableSlotSummary>> &LocalWPDTargetsMap)
|
||||
std::map<ValueInfo, std::vector<VTableSlotSummary>> &LocalWPDTargetsMap,
|
||||
DenseSet<StringRef> *ExternallyVisibleSymbolNamesPtr)
|
||||
: ExportSummary(ExportSummary), ExportedGUIDs(ExportedGUIDs),
|
||||
LocalWPDTargetsMap(LocalWPDTargetsMap) {
|
||||
LocalWPDTargetsMap(LocalWPDTargetsMap),
|
||||
ExternallyVisibleSymbolNamesPtr(ExternallyVisibleSymbolNamesPtr) {
|
||||
FunctionsToSkip.init(SkipFunctionNames);
|
||||
}
|
||||
|
||||
@ -973,14 +980,18 @@ void llvm::updateVCallVisibilityInIndex(
|
||||
|
||||
void llvm::runWholeProgramDevirtOnIndex(
|
||||
ModuleSummaryIndex &Summary, std::set<GlobalValue::GUID> &ExportedGUIDs,
|
||||
std::map<ValueInfo, std::vector<VTableSlotSummary>> &LocalWPDTargetsMap) {
|
||||
DevirtIndex(Summary, ExportedGUIDs, LocalWPDTargetsMap).run();
|
||||
std::map<ValueInfo, std::vector<VTableSlotSummary>> &LocalWPDTargetsMap,
|
||||
DenseSet<StringRef> *ExternallyVisibleSymbolNamesPtr) {
|
||||
DevirtIndex(Summary, ExportedGUIDs, LocalWPDTargetsMap,
|
||||
ExternallyVisibleSymbolNamesPtr)
|
||||
.run();
|
||||
}
|
||||
|
||||
void llvm::updateIndexWPDForExports(
|
||||
ModuleSummaryIndex &Summary,
|
||||
function_ref<bool(StringRef, ValueInfo)> IsExported,
|
||||
std::map<ValueInfo, std::vector<VTableSlotSummary>> &LocalWPDTargetsMap) {
|
||||
std::map<ValueInfo, std::vector<VTableSlotSummary>> &LocalWPDTargetsMap,
|
||||
DenseSet<StringRef> *ExternallyVisibleSymbolNamesPtr) {
|
||||
for (auto &T : LocalWPDTargetsMap) {
|
||||
auto &VI = T.first;
|
||||
// This was enforced earlier during trySingleImplDevirt.
|
||||
@ -996,6 +1007,8 @@ void llvm::updateIndexWPDForExports(
|
||||
assert(TIdSum);
|
||||
auto WPDRes = TIdSum->WPDRes.find(SlotSummary.ByteOffset);
|
||||
assert(WPDRes != TIdSum->WPDRes.end());
|
||||
if (ExternallyVisibleSymbolNamesPtr)
|
||||
ExternallyVisibleSymbolNamesPtr->insert(WPDRes->second.SingleImplName);
|
||||
WPDRes->second.SingleImplName = ModuleSummaryIndex::getGlobalNameForLocal(
|
||||
WPDRes->second.SingleImplName,
|
||||
Summary.getModuleHash(S->modulePath()));
|
||||
@ -1429,13 +1442,15 @@ bool DevirtIndex::trySingleImplDevirt(MutableArrayRef<ValueInfo> TargetsForSlot,
|
||||
// step.
|
||||
Res->TheKind = WholeProgramDevirtResolution::SingleImpl;
|
||||
if (GlobalValue::isLocalLinkage(S->linkage())) {
|
||||
if (IsExported)
|
||||
if (IsExported) {
|
||||
// If target is a local function and we are exporting it by
|
||||
// devirtualizing a call in another module, we need to record the
|
||||
// promoted name.
|
||||
if (ExternallyVisibleSymbolNamesPtr)
|
||||
ExternallyVisibleSymbolNamesPtr->insert(TheFn.name());
|
||||
Res->SingleImplName = ModuleSummaryIndex::getGlobalNameForLocal(
|
||||
TheFn.name(), ExportSummary.getModuleHash(S->modulePath()));
|
||||
else {
|
||||
} else {
|
||||
LocalWPDTargetsMap[TheFn].push_back(SlotSummary);
|
||||
Res->SingleImplName = std::string(TheFn.name());
|
||||
}
|
||||
|
||||
@ -28,6 +28,14 @@ static cl::opt<bool> UseSourceFilenameForPromotedLocals(
|
||||
"This requires that the source filename has a unique name / "
|
||||
"path to avoid name collisions."));
|
||||
|
||||
/// FIXME: The current optimization that avoids unnecessary renaming of
|
||||
/// promoted locals is incompatible with distributed ThinLTO and therefore
|
||||
/// must be enabled by default.
|
||||
cl::opt<bool>
|
||||
AlwaysRenamePromotedLocals("always-rename-promoted-locals", cl::init(true),
|
||||
cl::Hidden,
|
||||
cl::desc("Always rename promoted locals."));
|
||||
|
||||
cl::list<GlobalValue::GUID> MoveSymbolGUID(
|
||||
"thinlto-move-symbols",
|
||||
cl::desc(
|
||||
@ -81,7 +89,7 @@ bool FunctionImportGlobalProcessing::doImportAsDefinition(
|
||||
}
|
||||
|
||||
bool FunctionImportGlobalProcessing::shouldPromoteLocalToGlobal(
|
||||
const GlobalValue *SGV, ValueInfo VI) {
|
||||
const GlobalValue *SGV, GlobalValueSummary *Summary) {
|
||||
assert(SGV->hasLocalLinkage());
|
||||
|
||||
// Ifuncs and ifunc alias does not have summary.
|
||||
@ -112,8 +120,6 @@ bool FunctionImportGlobalProcessing::shouldPromoteLocalToGlobal(
|
||||
// same-named source files that were compiled in their respective directories
|
||||
// (so the source file name and resulting GUID is the same). Find the one
|
||||
// in this module.
|
||||
auto Summary = ImportIndex.findSummaryInModule(
|
||||
VI, SGV->getParent()->getModuleIdentifier());
|
||||
assert(Summary && "Missing summary for global value when exporting");
|
||||
auto Linkage = Summary->linkage();
|
||||
if (!GlobalValue::isLocalLinkage(Linkage)) {
|
||||
@ -306,10 +312,18 @@ void FunctionImportGlobalProcessing::processGlobalForThinLTO(GlobalValue &GV) {
|
||||
}
|
||||
}
|
||||
|
||||
if (GV.hasLocalLinkage() && shouldPromoteLocalToGlobal(&GV, VI)) {
|
||||
GlobalValueSummary *Summary = nullptr;
|
||||
if (VI && GV.hasLocalLinkage())
|
||||
Summary = ImportIndex.findSummaryInModule(
|
||||
VI, GV.getParent()->getModuleIdentifier());
|
||||
|
||||
if (GV.hasLocalLinkage() && shouldPromoteLocalToGlobal(&GV, Summary)) {
|
||||
// Save the original name string before we rename GV below.
|
||||
auto Name = GV.getName().str();
|
||||
GV.setName(getPromotedName(&GV));
|
||||
if (AlwaysRenamePromotedLocals || !Summary ||
|
||||
!Summary->noRenameOnPromotion())
|
||||
GV.setName(getPromotedName(&GV));
|
||||
|
||||
GV.setLinkage(getLinkage(&GV, /* DoPromote */ true));
|
||||
assert(!GV.hasLocalLinkage());
|
||||
GV.setVisibility(GlobalValue::HiddenVisibility);
|
||||
|
||||
@ -12,22 +12,22 @@
|
||||
|
||||
^0 = module: (path: "thinlto-memprof-summary.o", hash: (1369602428, 2747878711, 259090915, 2507395659, 1141468049))
|
||||
;; Function with single alloc, multiple memprof MIBs, no versioning
|
||||
^1 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (none), memProf: ((type: notcold, stackIds: (8632435727821051414)), (type: cold, stackIds: (15025054523792398438, 12345678)), (type: hot, stackIds: (987654321))))))))
|
||||
^1 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (none), memProf: ((type: notcold, stackIds: (8632435727821051414)), (type: cold, stackIds: (15025054523792398438, 12345678)), (type: hot, stackIds: (987654321))))))))
|
||||
;; Function with callsite stack ids calling above function, no versioning
|
||||
^2 = gv: (guid: 25, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^1)), callsites: ((callee: ^1, clones: (0), stackIds: (8632435727821051414)), (callee: ^1, clones: (0), stackIds: (15025054523792398438, 12345678)), (callee: ^1, clones: (0), stackIds: (23456789))))))
|
||||
^2 = gv: (guid: 25, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^1)), callsites: ((callee: ^1, clones: (0), stackIds: (8632435727821051414)), (callee: ^1, clones: (0), stackIds: (15025054523792398438, 12345678)), (callee: ^1, clones: (0), stackIds: (23456789))))))
|
||||
;; Function with multiple allocs, multiple memprof MIBs, multiple versions
|
||||
^3 = gv: (guid: 26, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (cold, notcold), memProf: ((type: notcold, stackIds: (3456789)), (type: cold, stackIds: (456789)))), (versions: (notcold, cold), memProf: ((type: cold, stackIds: (3456789)), (type: notcold, stackIds: (456789))))))))
|
||||
^3 = gv: (guid: 26, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (cold, notcold), memProf: ((type: notcold, stackIds: (3456789)), (type: cold, stackIds: (456789)))), (versions: (notcold, cold), memProf: ((type: cold, stackIds: (3456789)), (type: notcold, stackIds: (456789))))))))
|
||||
;; Function with callsite stack ids calling above function, multiple versions
|
||||
^4 = gv: (guid: 27, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^3)), callsites: ((callee: ^3, clones: (0, 1), stackIds: (3456789)), (callee: ^3, clones: (1, 1), stackIds: (456789))))))
|
||||
^4 = gv: (guid: 27, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^3)), callsites: ((callee: ^3, clones: (0, 1), stackIds: (3456789)), (callee: ^3, clones: (1, 1), stackIds: (456789))))))
|
||||
;; Function with null callsite stack id (can happen in distributed indexes if callsite not imported)
|
||||
^5 = gv: (guid: 28, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), callsites: ((callee: null, clones: (0), stackIds: (8632435727821051414))))))
|
||||
^5 = gv: (guid: 28, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), callsites: ((callee: null, clones: (0), stackIds: (8632435727821051414))))))
|
||||
|
||||
; Make sure we get back from llvm-dis what we put in via llvm-as.
|
||||
; CHECK: ^0 = module: (path: "thinlto-memprof-summary.o", hash: (1369602428, 2747878711, 259090915, 2507395659, 1141468049))
|
||||
; CONTEXT: ^1 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (none), memProf: ((type: notcold, stackIds: (8632435727821051414)), (type: cold, stackIds: (15025054523792398438, 12345678)), (type: hot, stackIds: (987654321))))))))
|
||||
; NOCONTEXT: ^1 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (none), memProf: ((type: notcold, stackIds: ()), (type: cold, stackIds: ()), (type: hot, stackIds: ())))))))
|
||||
; CHECK: ^2 = gv: (guid: 25, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^1)), callsites: ((callee: ^1, clones: (0), stackIds: (8632435727821051414)), (callee: ^1, clones: (0), stackIds: (15025054523792398438, 12345678)), (callee: ^1, clones: (0), stackIds: (23456789))))))
|
||||
; CONTEXT: ^3 = gv: (guid: 26, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (cold, notcold), memProf: ((type: notcold, stackIds: (3456789)), (type: cold, stackIds: (456789)))), (versions: (notcold, cold), memProf: ((type: cold, stackIds: (3456789)), (type: notcold, stackIds: (456789))))))))
|
||||
; NOCONTEXT: ^3 = gv: (guid: 26, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (cold, notcold), memProf: ((type: notcold, stackIds: ()), (type: cold, stackIds: ()))), (versions: (notcold, cold), memProf: ((type: cold, stackIds: ()), (type: notcold, stackIds: ())))))))
|
||||
; CHECK: ^4 = gv: (guid: 27, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^3)), callsites: ((callee: ^3, clones: (0, 1), stackIds: (3456789)), (callee: ^3, clones: (1, 1), stackIds: (456789))))))
|
||||
; CHECK: ^5 = gv: (guid: 28, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), callsites: ((callee: null, clones: (0), stackIds: (8632435727821051414))))))
|
||||
; CONTEXT: ^1 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (none), memProf: ((type: notcold, stackIds: (8632435727821051414)), (type: cold, stackIds: (15025054523792398438, 12345678)), (type: hot, stackIds: (987654321))))))))
|
||||
; NOCONTEXT: ^1 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (none), memProf: ((type: notcold, stackIds: ()), (type: cold, stackIds: ()), (type: hot, stackIds: ())))))))
|
||||
; CHECK: ^2 = gv: (guid: 25, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^1)), callsites: ((callee: ^1, clones: (0), stackIds: (8632435727821051414)), (callee: ^1, clones: (0), stackIds: (15025054523792398438, 12345678)), (callee: ^1, clones: (0), stackIds: (23456789))))))
|
||||
; CONTEXT: ^3 = gv: (guid: 26, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (cold, notcold), memProf: ((type: notcold, stackIds: (3456789)), (type: cold, stackIds: (456789)))), (versions: (notcold, cold), memProf: ((type: cold, stackIds: (3456789)), (type: notcold, stackIds: (456789))))))))
|
||||
; NOCONTEXT: ^3 = gv: (guid: 26, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), allocs: ((versions: (cold, notcold), memProf: ((type: notcold, stackIds: ()), (type: cold, stackIds: ()))), (versions: (notcold, cold), memProf: ((type: cold, stackIds: ()), (type: notcold, stackIds: ())))))))
|
||||
; CHECK: ^4 = gv: (guid: 27, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^3)), callsites: ((callee: ^3, clones: (0, 1), stackIds: (3456789)), (callee: ^3, clones: (1, 1), stackIds: (456789))))))
|
||||
; CHECK: ^5 = gv: (guid: 28, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 22, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0), callsites: ((callee: null, clones: (0), stackIds: (8632435727821051414))))))
|
||||
|
||||
@ -8,5 +8,5 @@ source_filename = "index.bc"
|
||||
; CHECK: ^0 = module: (path: "[Regular LTO]", hash: (0, 0, 0, 0, 0))
|
||||
^1 = module: (path: "main.bc", hash: (3499594384, 1671013073, 3271036935, 1830411232, 59290952))
|
||||
; CHECK-NEXT: ^1 = module: (path: "main.bc", hash: (3499594384, 1671013073, 3271036935, 1830411232, 59290952))
|
||||
^2 = gv: (guid: 13351721993301222997, summaries: (function: (module: ^1, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 1), function: (module: ^1, flags: (linkage: available_externally, notEligibleToImport: 1, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; CHECK-NEXT: ^2 = gv: (guid: 13351721993301222997, summaries: (function: (module: ^1, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 1), function: (module: ^1, flags: (linkage: available_externally, visibility: default, notEligibleToImport: 1, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
^2 = gv: (guid: 13351721993301222997, summaries: (function: (module: ^1, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1), function: (module: ^1, flags: (linkage: available_externally, notEligibleToImport: 1, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; CHECK-NEXT: ^2 = gv: (guid: 13351721993301222997, summaries: (function: (module: ^1, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1), function: (module: ^1, flags: (linkage: available_externally, visibility: default, notEligibleToImport: 1, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
|
||||
@ -4,9 +4,9 @@
|
||||
^0 = module: (path: "thinlto-summary-visibility1.o", hash: (1369602428, 2747878711, 259090915, 2507395659, 1141468049))
|
||||
^1 = module: (path: "thinlto-summary-visibility2.o", hash: (2998369023, 4283347029, 1195487472, 2757298015, 1852134156))
|
||||
|
||||
; CHECK: ^2 = gv: (guid: 2, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 10)))
|
||||
; CHECK-NEXT: ^3 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: external, visibility: protected, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 10)))
|
||||
; CHECK-NEXT: ^4 = gv: (guid: 4, summaries: (function: (module: ^0, flags: (linkage: external, visibility: hidden, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 10)))
|
||||
; CHECK: ^2 = gv: (guid: 2, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 10)))
|
||||
; CHECK-NEXT: ^3 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: external, visibility: protected, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 10)))
|
||||
; CHECK-NEXT: ^4 = gv: (guid: 4, summaries: (function: (module: ^0, flags: (linkage: external, visibility: hidden, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 10)))
|
||||
|
||||
^2 = gv: (guid: 2, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default), insts: 10)))
|
||||
^3 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: external, visibility: protected), insts: 10)))
|
||||
|
||||
@ -17,13 +17,13 @@
|
||||
^3 = gv: (guid: 2, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 10, calls: ((callee: ^15, relbf: 256, tail: 1)))))
|
||||
|
||||
; Summaries with different linkage types.
|
||||
^4 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: internal, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, importType: definition), insts: 1)))
|
||||
^4 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: internal, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; Make this one an alias with a forward reference to aliasee.
|
||||
^5 = gv: (guid: 4, summaries: (alias: (module: ^0, flags: (linkage: private, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, importType: definition), aliasee: ^14)))
|
||||
^5 = gv: (guid: 4, summaries: (alias: (module: ^0, flags: (linkage: private, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, importType: definition, noRenameOnPromotion: 0), aliasee: ^14)))
|
||||
^6 = gv: (guid: 5, summaries: (function: (module: ^0, flags: (linkage: available_externally, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^7 = gv: (guid: 6, summaries: (function: (module: ^0, flags: (linkage: linkonce, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^8 = gv: (guid: 7, summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^9 = gv: (guid: 8, summaries: (function: (module: ^0, flags: (linkage: weak_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 1, importType: definition), insts: 1)))
|
||||
^9 = gv: (guid: 8, summaries: (function: (module: ^0, flags: (linkage: weak_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 1, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
^10 = gv: (guid: 9, summaries: (function: (module: ^0, flags: (linkage: weak, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 1)))
|
||||
^11 = gv: (guid: 10, summaries: (variable: (module: ^0, flags: (linkage: common, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), varFlags: (readonly: 0))))
|
||||
; Test appending globel variable with reference (tests backward reference on
|
||||
@ -54,14 +54,14 @@
|
||||
^23 = gv: (guid: 22, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (^31, offset: 16), args: (42)))))))
|
||||
|
||||
; Function summary with an import type of declaration
|
||||
^24 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, importType: declaration), insts: 5)))
|
||||
^24 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, importType: declaration, noRenameOnPromotion: 0), insts: 5)))
|
||||
|
||||
; Alias summary with null aliasee.
|
||||
^25 = gv: (guid: 24, summaries: (alias: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1), aliasee: null)))
|
||||
|
||||
; GUID that are 64-bit
|
||||
|
||||
^26 = gv: (guid: 9123456789101112131, summaries: (function: (module: ^0, flags: (linkage: internal, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, importType: definition), insts: 1)))
|
||||
^26 = gv: (guid: 9123456789101112131, summaries: (function: (module: ^0, flags: (linkage: internal, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
|
||||
; Test TypeId summaries:
|
||||
|
||||
@ -80,33 +80,33 @@
|
||||
; Make sure we get back from llvm-dis essentially what we put in via llvm-as.
|
||||
; CHECK: ^0 = module: (path: "thinlto-summary1.o", hash: (1369602428, 2747878711, 259090915, 2507395659, 1141468049))
|
||||
; CHECK: ^1 = module: (path: "thinlto-summary2.o", hash: (2998369023, 4283347029, 1195487472, 2757298015, 1852134156))
|
||||
; CHECK: ^2 = gv: (guid: 1, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 10, calls: ((callee: ^15, hotness: hot), (callee: ^17, hotness: cold), (callee: ^16, hotness: none, tail: 1)), refs: (^11, readonly ^13, writeonly ^14))))
|
||||
; CHECK: ^2 = gv: (guid: 1, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 10, calls: ((callee: ^15, hotness: hot), (callee: ^17, hotness: cold), (callee: ^16, hotness: none, tail: 1)), refs: (^11, readonly ^13, writeonly ^14))))
|
||||
;; relbf is not emitted since this is a combined summary, and that is only
|
||||
;; emitted for per-module summaries. Additionally, it is now deprecated.
|
||||
; CHECK: ^3 = gv: (guid: 2, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 10, calls: ((callee: ^15, tail: 1)))))
|
||||
; CHECK: ^4 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: internal, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; CHECK: ^5 = gv: (guid: 4, summaries: (alias: (module: ^0, flags: (linkage: private, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), aliasee: ^14)))
|
||||
; CHECK: ^6 = gv: (guid: 5, summaries: (function: (module: ^0, flags: (linkage: available_externally, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; CHECK: ^7 = gv: (guid: 6, summaries: (function: (module: ^0, flags: (linkage: linkonce, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; CHECK: ^8 = gv: (guid: 7, summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; CHECK: ^9 = gv: (guid: 8, summaries: (function: (module: ^0, flags: (linkage: weak_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 1, importType: definition), insts: 1)))
|
||||
; CHECK: ^10 = gv: (guid: 9, summaries: (function: (module: ^0, flags: (linkage: weak, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; CHECK: ^11 = gv: (guid: 10, summaries: (variable: (module: ^0, flags: (linkage: common, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), varFlags: (readonly: 0, writeonly: 0, constant: 0))))
|
||||
; CHECK: ^12 = gv: (guid: 11, summaries: (variable: (module: ^0, flags: (linkage: appending, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), varFlags: (readonly: 0, writeonly: 0, constant: 0), refs: (^4))))
|
||||
; CHECK: ^13 = gv: (guid: 12, summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), varFlags: (readonly: 1, writeonly: 0, constant: 0))))
|
||||
; CHECK: ^14 = gv: (guid: 13, summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), varFlags: (readonly: 0, writeonly: 0, constant: 0))))
|
||||
; CHECK: ^15 = gv: (guid: 14, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 1, live: 1, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0))))
|
||||
; CHECK: ^16 = gv: (guid: 15, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1, funcFlags: (readNone: 1, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 1, noUnwind: 1, mayThrow: 1, hasUnknownCall: 1, mustBeUnreachable: 0))))
|
||||
; CHECK: ^17 = gv: (guid: 16, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1, funcFlags: (readNone: 0, readOnly: 1, noRecurse: 0, returnDoesNotAlias: 1, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 1), calls: ((callee: ^15)))))
|
||||
; CHECK: ^18 = gv: (guid: 17, summaries: (alias: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), aliasee: ^14)))
|
||||
; CHECK: ^19 = gv: (guid: 18, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 4, typeIdInfo: (typeTests: (^27, ^29)))))
|
||||
; CHECK: ^20 = gv: (guid: 19, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 8, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (^30, offset: 16))))))
|
||||
; CHECK: ^21 = gv: (guid: 20, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 5, typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (^28, offset: 16))))))
|
||||
; CHECK: ^22 = gv: (guid: 21, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 15, typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (^30, offset: 16), args: (42)), (vFuncId: (^30, offset: 24)))))))
|
||||
; CHECK: ^23 = gv: (guid: 22, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (^31, offset: 16), args: (42)))))))
|
||||
; CHECK: ^24 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: declaration), insts: 5)))
|
||||
; CHECK: ^25 = gv: (guid: 24, summaries: (alias: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), aliasee: null)))
|
||||
; CHECK: ^26 = gv: (guid: 9123456789101112131, summaries: (function: (module: ^0, flags: (linkage: internal, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; CHECK: ^3 = gv: (guid: 2, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 10, calls: ((callee: ^15, tail: 1)))))
|
||||
; CHECK: ^4 = gv: (guid: 3, summaries: (function: (module: ^0, flags: (linkage: internal, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; CHECK: ^5 = gv: (guid: 4, summaries: (alias: (module: ^0, flags: (linkage: private, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), aliasee: ^14)))
|
||||
; CHECK: ^6 = gv: (guid: 5, summaries: (function: (module: ^0, flags: (linkage: available_externally, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; CHECK: ^7 = gv: (guid: 6, summaries: (function: (module: ^0, flags: (linkage: linkonce, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; CHECK: ^8 = gv: (guid: 7, summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; CHECK: ^9 = gv: (guid: 8, summaries: (function: (module: ^0, flags: (linkage: weak_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 1, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; CHECK: ^10 = gv: (guid: 9, summaries: (function: (module: ^0, flags: (linkage: weak, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; CHECK: ^11 = gv: (guid: 10, summaries: (variable: (module: ^0, flags: (linkage: common, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0))))
|
||||
; CHECK: ^12 = gv: (guid: 11, summaries: (variable: (module: ^0, flags: (linkage: appending, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0), refs: (^4))))
|
||||
; CHECK: ^13 = gv: (guid: 12, summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 1, writeonly: 0, constant: 0))))
|
||||
; CHECK: ^14 = gv: (guid: 13, summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0))))
|
||||
; CHECK: ^15 = gv: (guid: 14, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 1, live: 1, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 1, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0))))
|
||||
; CHECK: ^16 = gv: (guid: 15, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1, funcFlags: (readNone: 1, readOnly: 0, noRecurse: 1, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 1, noUnwind: 1, mayThrow: 1, hasUnknownCall: 1, mustBeUnreachable: 0))))
|
||||
; CHECK: ^17 = gv: (guid: 16, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1, funcFlags: (readNone: 0, readOnly: 1, noRecurse: 0, returnDoesNotAlias: 1, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 1), calls: ((callee: ^15)))))
|
||||
; CHECK: ^18 = gv: (guid: 17, summaries: (alias: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), aliasee: ^14)))
|
||||
; CHECK: ^19 = gv: (guid: 18, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 4, typeIdInfo: (typeTests: (^27, ^29)))))
|
||||
; CHECK: ^20 = gv: (guid: 19, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 8, typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (^30, offset: 16))))))
|
||||
; CHECK: ^21 = gv: (guid: 20, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 5, typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (^28, offset: 16))))))
|
||||
; CHECK: ^22 = gv: (guid: 21, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 15, typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (^30, offset: 16), args: (42)), (vFuncId: (^30, offset: 24)))))))
|
||||
; CHECK: ^23 = gv: (guid: 22, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 5, typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (^31, offset: 16), args: (42)))))))
|
||||
; CHECK: ^24 = gv: (guid: 23, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: declaration, noRenameOnPromotion: 0), insts: 5)))
|
||||
; CHECK: ^25 = gv: (guid: 24, summaries: (alias: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), aliasee: null)))
|
||||
; CHECK: ^26 = gv: (guid: 9123456789101112131, summaries: (function: (module: ^0, flags: (linkage: internal, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; CHECK: ^27 = typeid: (name: "_ZTS1C", summary: (typeTestRes: (kind: single, sizeM1BitWidth: 0))) ; guid = 1884921850105019584
|
||||
; CHECK: ^28 = typeid: (name: "_ZTS1B", summary: (typeTestRes: (kind: inline, sizeM1BitWidth: 0, alignLog2: 1, sizeM1: 2, bitMask: 3, inlineBits: 4))) ; guid = 6203814149063363976
|
||||
; CHECK: ^29 = typeid: (name: "_ZTS1A", summary: (typeTestRes: (kind: allOnes, sizeM1BitWidth: 7), wpdResolutions: ((offset: 0, wpdRes: (kind: branchFunnel)), (offset: 8, wpdRes: (kind: singleImpl, singleImplName: "_ZN1A1nEi")), (offset: 16, wpdRes: (kind: indir, resByArg: (args: (1, 2), byArg: (kind: indir, byte: 2, bit: 3), args: (3), byArg: (kind: uniformRetVal, info: 1), args: (4), byArg: (kind: uniqueRetVal, info: 1), args: (5), byArg: (kind: virtualConstProp))))))) ; guid = 7004155349499253778
|
||||
|
||||
@ -29,9 +29,9 @@ declare i32 @_ZN1C1fEi(ptr, i32)
|
||||
|
||||
^0 = module: (path: "<stdin>", hash: (0, 0, 0, 0, 0))
|
||||
^1 = gv: (name: "_ZN1A1nEi") ; guid = 1621563287929432257
|
||||
^2 = gv: (name: "_ZTV1B", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), varFlags: (readonly: 0, writeonly: 0, constant: 0, vcall_visibility: 0), vTableFuncs: ((virtFunc: ^3, offset: 16), (virtFunc: ^1, offset: 24)), refs: (^3, ^1)))) ; guid = 5283576821522790367
|
||||
^2 = gv: (name: "_ZTV1B", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0, vcall_visibility: 0), vTableFuncs: ((virtFunc: ^3, offset: 16), (virtFunc: ^1, offset: 24)), refs: (^3, ^1)))) ; guid = 5283576821522790367
|
||||
^3 = gv: (name: "_ZN1B1fEi") ; guid = 7162046368816414394
|
||||
^4 = gv: (name: "_ZTV1C", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), varFlags: (readonly: 0, writeonly: 0, constant: 0, vcall_visibility: 0), vTableFuncs: ((virtFunc: ^5, offset: 16), (virtFunc: ^1, offset: 24)), refs: (^1, ^5)))) ; guid = 13624023785555846296
|
||||
^4 = gv: (name: "_ZTV1C", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 0, writeonly: 0, constant: 0, vcall_visibility: 0), vTableFuncs: ((virtFunc: ^5, offset: 16), (virtFunc: ^1, offset: 24)), refs: (^1, ^5)))) ; guid = 13624023785555846296
|
||||
^5 = gv: (name: "_ZN1C1fEi") ; guid = 14876272565662207556
|
||||
^6 = typeidCompatibleVTable: (name: "_ZTS1A", summary: ((offset: 16, ^2), (offset: 16, ^4))) ; guid = 7004155349499253778
|
||||
^7 = typeidCompatibleVTable: (name: "_ZTS1B", summary: ((offset: 16, ^2))) ; guid = 6203814149063363976
|
||||
|
||||
@ -53,11 +53,11 @@ entry:
|
||||
declare void @analias(...)
|
||||
|
||||
; DIS: ^0 = module: (path: "{{.*}}", hash: (0, 0, 0, 0, 0))
|
||||
; DIS: ^1 = gv: (name: "analias", summaries: (alias: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), aliasee: ^2))) ; guid = 12695095382722328222
|
||||
; DIS: ^2 = gv: (name: "aliasee", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1))) ; guid = 17407585008595848568
|
||||
; DIS: ^1 = gv: (name: "analias", summaries: (alias: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), aliasee: ^2))) ; guid = 12695095382722328222
|
||||
; DIS: ^2 = gv: (name: "aliasee", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1))) ; guid = 17407585008595848568
|
||||
|
||||
; COMBINED-DIS: ^0 = module: (path: "{{.*}}thinlto-alias.ll.tmp.o", hash: (0, 0, 0, 0, 0))
|
||||
; COMBINED-DIS: ^1 = module: (path: "{{.*}}thinlto-alias.ll.tmp2.o", hash: (0, 0, 0, 0, 0))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 12695095382722328222, summaries: (alias: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), aliasee: ^4)))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 15822663052811949562, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 2, calls: ((callee: ^2)))))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 17407585008595848568, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 12695095382722328222, summaries: (alias: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), aliasee: ^4)))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 15822663052811949562, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, calls: ((callee: ^2)))))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 17407585008595848568, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
|
||||
@ -150,16 +150,16 @@ declare void @none3() #1
|
||||
; DIS: ^6 = gv: (name: "cold") ; guid = 11668175513417606517
|
||||
; DIS: ^7 = gv: (name: "hot4") ; guid = 13161834114071272798
|
||||
; DIS: ^8 = gv: (name: "none3") ; guid = 16213681105727317812
|
||||
; DIS: ^9 = gv: (name: "hot_function", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 16, calls: ((callee: ^5, hotness: hot), (callee: ^6, hotness: cold), (callee: ^4, hotness: hot), (callee: ^7, hotness: cold), (callee: ^10, hotness: none), (callee: ^3, hotness: hot), (callee: ^2, hotness: none), (callee: ^8, hotness: none), (callee: ^1, hotness: critical))))) ; guid = 17381606045411660303
|
||||
; DIS: ^9 = gv: (name: "hot_function", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 16, calls: ((callee: ^5, hotness: hot), (callee: ^6, hotness: cold), (callee: ^4, hotness: hot), (callee: ^7, hotness: cold), (callee: ^10, hotness: none), (callee: ^3, hotness: hot), (callee: ^2, hotness: none), (callee: ^8, hotness: none), (callee: ^1, hotness: critical))))) ; guid = 17381606045411660303
|
||||
; DIS: ^10 = gv: (name: "none1") ; guid = 17712061229457633252
|
||||
|
||||
; COMBINED-DIS: ^0 = module: (path: "{{.*}}thinlto-function-summary-callgraph-profile-summary.ll.tmp.o", hash: (0, 0, 0, 0, 0))
|
||||
; COMBINED-DIS: ^1 = module: (path: "{{.*}}thinlto-function-summary-callgraph-profile-summary.ll.tmp2.o", hash: (0, 0, 0, 0, 0))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 3741006263754194003, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 5026609803865204483, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 8117347573235780485, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; COMBINED-DIS: ^5 = gv: (guid: 9453975128311291976, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; COMBINED-DIS: ^6 = gv: (guid: 11668175513417606517, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; COMBINED-DIS: ^7 = gv: (guid: 16213681105727317812, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; COMBINED-DIS: ^8 = gv: (guid: 17381606045411660303, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 16, calls: ((callee: ^5, hotness: hot), (callee: ^6, hotness: cold), (callee: ^4, hotness: hot), (callee: ^9, hotness: none), (callee: ^3, hotness: hot), (callee: ^2, hotness: none), (callee: ^7, hotness: none)))))
|
||||
; COMBINED-DIS: ^9 = gv: (guid: 17712061229457633252, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 1)))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 3741006263754194003, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 5026609803865204483, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 8117347573235780485, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^5 = gv: (guid: 9453975128311291976, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^6 = gv: (guid: 11668175513417606517, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^7 = gv: (guid: 16213681105727317812, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
; COMBINED-DIS: ^8 = gv: (guid: 17381606045411660303, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 16, calls: ((callee: ^5, hotness: hot), (callee: ^6, hotness: cold), (callee: ^4, hotness: hot), (callee: ^9, hotness: none), (callee: ^3, hotness: hot), (callee: ^2, hotness: none), (callee: ^7, hotness: none)))))
|
||||
; COMBINED-DIS: ^9 = gv: (guid: 17712061229457633252, summaries: (function: (module: ^1, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1)))
|
||||
|
||||
@ -39,5 +39,5 @@ declare void @func(...) #1
|
||||
; DIS: ^1 = gv: (name: "func") ; guid = 7289175272376759421
|
||||
;; We should have ignored the relbf in the old bitcode, and it no longer shows
|
||||
;; up in the summary.
|
||||
; DIS: ^2 = gv: (name: "main", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 3, calls: ((callee: ^1)), refs: (readonly ^3)))) ; guid = 15822663052811949562
|
||||
; DIS: ^2 = gv: (name: "main", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 3, calls: ((callee: ^1)), refs: (readonly ^3)))) ; guid = 15822663052811949562
|
||||
; DIS: ^3 = gv: (name: "undefinedglob") ; guid = 18036901804029949403
|
||||
|
||||
@ -148,18 +148,18 @@ entry:
|
||||
; order, which depends on GUID, and the private function Y GUID will depend
|
||||
; on the path to the test.
|
||||
; DIS: ^0 = module: (path: "{{.*}}", hash: (0, 0, 0, 0, 0))
|
||||
; DIS-DAG: = gv: (name: "Z", summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 2, calls: ((callee: ^{{.*}}, tail: 1))))) ; guid = 104084381700047393
|
||||
; DIS-DAG: = gv: (name: "X", summaries: (function: (module: ^0, flags: (linkage: available_externally, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 2, calls: ((callee: ^{{.*}})), refs: (^{{.*}})))) ; guid = 1881667236089500162
|
||||
; DIS-DAG: = gv: (name: "W", summaries: (function: (module: ^0, flags: (linkage: weak_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 2, calls: ((callee: ^{{.*}}, tail: 1)), refs: (^{{.*}})))) ; guid = 5790125716599269729
|
||||
; DIS-DAG: = gv: (name: "Z", summaries: (function: (module: ^0, flags: (linkage: linkonce_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, calls: ((callee: ^{{.*}}, tail: 1))))) ; guid = 104084381700047393
|
||||
; DIS-DAG: = gv: (name: "X", summaries: (function: (module: ^0, flags: (linkage: available_externally, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, calls: ((callee: ^{{.*}})), refs: (^{{.*}})))) ; guid = 1881667236089500162
|
||||
; DIS-DAG: = gv: (name: "W", summaries: (function: (module: ^0, flags: (linkage: weak_odr, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, calls: ((callee: ^{{.*}}, tail: 1)), refs: (^{{.*}})))) ; guid = 5790125716599269729
|
||||
; DIS-DAG: = gv: (name: "foo") ; guid = 6699318081062747564
|
||||
; DIS-DAG: = gv: (name: "func") ; guid = 7289175272376759421
|
||||
; DIS-DAG: = gv: (name: "func3") ; guid = 11517462787082255043
|
||||
; Check that default value of writeonly attribute is zero for constant variables
|
||||
; DIS-DAG: = gv: (name: "globalvar", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), varFlags: (readonly: 1, writeonly: 0, constant: 1)))) ; guid = 12887606300320728018
|
||||
; DIS-DAG: = gv: (name: "globalvar", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 1, writeonly: 0, constant: 1)))) ; guid = 12887606300320728018
|
||||
; DIS-DAG: = gv: (name: "func2") ; guid = 14069196320850861797
|
||||
; DIS-DAG: = gv: (name: "llvm.ctpop.i8") ; guid = 15254915475081819833
|
||||
; DIS-DAG: = gv: (name: "main", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 9, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), calls: ((callee: ^{{.*}})), refs: (^{{.*}})))) ; guid = 15822663052811949562
|
||||
; DIS-DAG: = gv: (name: "bar", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), varFlags: (readonly: 1, writeonly: 1, constant: 0), refs: (^{{.*}})))) ; guid = 16434608426314478903
|
||||
; DIS-DAG: = gv: (name: "main", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 9, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), calls: ((callee: ^{{.*}})), refs: (^{{.*}})))) ; guid = 15822663052811949562
|
||||
; DIS-DAG: = gv: (name: "bar", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 1, writeonly: 1, constant: 0), refs: (^{{.*}})))) ; guid = 16434608426314478903
|
||||
; Don't try to match the exact GUID. Since it is private, the file path
|
||||
; will get hashed, and that will be test dependent.
|
||||
; DIS-DAG: = gv: (name: "Y", summaries: (function: (module: ^0, flags: (linkage: private, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 14, calls: ((callee: ^{{.*}}, tail: 1))))) ; guid =
|
||||
; DIS-DAG: = gv: (name: "Y", summaries: (function: (module: ^0, flags: (linkage: private, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 14, calls: ((callee: ^{{.*}}, tail: 1))))) ; guid =
|
||||
|
||||
@ -18,7 +18,7 @@
|
||||
; RUN: llvm-dis --print-thinlto-index-only %t.o -o - | FileCheck %s --check-prefix=DIS
|
||||
|
||||
; DIS: ^0 = module: (path: "{{.*}}thinlto-index-disassembled-by-llvm-dis.ll.tmp
|
||||
; DIS: ^1 = gv: (name: "aplusb", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 2))) ; guid =
|
||||
; DIS: ^1 = gv: (name: "aplusb", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2))) ; guid =
|
||||
|
||||
source_filename = "add.cpp"
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
@ -37,11 +37,11 @@ declare i1 @llvm.type.test(i8*, metadata) nounwind readnone
|
||||
|
||||
; DIS: ^0 = module: (path: "{{.*}}", hash: (0, 0, 0, 0, 0))
|
||||
; DIS: ^1 = gv: (name: "llvm.type.test") ; guid = 608142985856744218
|
||||
; DIS: ^2 = gv: (name: "h", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 2, typeIdInfo: (typeTests: (16434608426314478903))))) ; guid = 8124147457056772133
|
||||
; DIS: ^3 = gv: (name: "g", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 4, typeIdInfo: (typeTests: (6699318081062747564, 16434608426314478903))))) ; guid = 13146401226427987378
|
||||
; DIS: ^4 = gv: (name: "f", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 2, typeIdInfo: (typeTests: (6699318081062747564))))) ; guid = 14740650423002898831
|
||||
; DIS: ^2 = gv: (name: "h", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, typeIdInfo: (typeTests: (16434608426314478903))))) ; guid = 8124147457056772133
|
||||
; DIS: ^3 = gv: (name: "g", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 4, typeIdInfo: (typeTests: (6699318081062747564, 16434608426314478903))))) ; guid = 13146401226427987378
|
||||
; DIS: ^4 = gv: (name: "f", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, typeIdInfo: (typeTests: (6699318081062747564))))) ; guid = 14740650423002898831
|
||||
|
||||
; COMBINED-DIS: ^0 = module: (path: "{{.*}}thinlto-type-tests.ll.tmp.o", hash: (0, 0, 0, 0, 0))
|
||||
; COMBINED-DIS: ^1 = gv: (guid: 8124147457056772133, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 2, typeIdInfo: (typeTests: (16434608426314478903)))))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 13146401226427987378, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 4, typeIdInfo: (typeTests: (6699318081062747564, 16434608426314478903)))))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 14740650423002898831, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 2, typeIdInfo: (typeTests: (6699318081062747564)))))
|
||||
; COMBINED-DIS: ^1 = gv: (guid: 8124147457056772133, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, typeIdInfo: (typeTests: (16434608426314478903)))))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 13146401226427987378, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 4, typeIdInfo: (typeTests: (6699318081062747564, 16434608426314478903)))))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 14740650423002898831, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, typeIdInfo: (typeTests: (6699318081062747564)))))
|
||||
|
||||
@ -112,19 +112,19 @@ declare {i8*, i1} @llvm.type.checked.load(i8*, i32, metadata)
|
||||
|
||||
; DIS: ^0 = module: (path: "{{.*}}", hash: (0, 0, 0, 0, 0))
|
||||
; DIS: ^1 = gv: (name: "llvm.type.test") ; guid = 608142985856744218
|
||||
; DIS: ^2 = gv: (name: "f1", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 8, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16)))))) ; guid = 2072045998141807037
|
||||
; DIS: ^3 = gv: (name: "f3", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 5, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16)))))) ; guid = 4197650231481825559
|
||||
; DIS: ^2 = gv: (name: "f1", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 8, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16)))))) ; guid = 2072045998141807037
|
||||
; DIS: ^3 = gv: (name: "f3", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 5, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16)))))) ; guid = 4197650231481825559
|
||||
; DIS: ^4 = gv: (name: "llvm.type.checked.load") ; guid = 5568222536364573403
|
||||
; DIS: ^5 = gv: (name: "llvm.assume") ; guid = 6385187066495850096
|
||||
; DIS: ^6 = gv: (name: "f2", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 15, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 24), vFuncId: (guid: 16434608426314478903, offset: 32)))))) ; guid = 8471399308421654326
|
||||
; DIS: ^7 = gv: (name: "f4", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 15, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42)), (vFuncId: (guid: 6699318081062747564, offset: 24), args: (43))))))) ; guid = 10064745020953272174
|
||||
; DIS: ^8 = gv: (name: "f5", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 5, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42))))))) ; guid = 11686717102184386164
|
||||
; DIS: ^9 = gv: (name: "f6", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 2, typeIdInfo: (typeTests: (7546896869197086323))))) ; guid = 11834966808443348068
|
||||
; DIS: ^6 = gv: (name: "f2", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 15, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 24), vFuncId: (guid: 16434608426314478903, offset: 32)))))) ; guid = 8471399308421654326
|
||||
; DIS: ^7 = gv: (name: "f4", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 15, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42)), (vFuncId: (guid: 6699318081062747564, offset: 24), args: (43))))))) ; guid = 10064745020953272174
|
||||
; DIS: ^8 = gv: (name: "f5", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 5, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42))))))) ; guid = 11686717102184386164
|
||||
; DIS: ^9 = gv: (name: "f6", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, typeIdInfo: (typeTests: (7546896869197086323))))) ; guid = 11834966808443348068
|
||||
|
||||
; COMBINED-DIS: ^0 = module: (path: "{{.*}}thinlto-type-vcalls.ll.tmp.o", hash: (0, 0, 0, 0, 0))
|
||||
; COMBINED-DIS: ^1 = gv: (guid: 2072045998141807037, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 8, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16))))))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 4197650231481825559, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 5, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16))))))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 8471399308421654326, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 15, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 24), vFuncId: (guid: 16434608426314478903, offset: 32))))))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 10064745020953272174, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 15, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42)), (vFuncId: (guid: 6699318081062747564, offset: 24), args: (43)))))))
|
||||
; COMBINED-DIS: ^5 = gv: (guid: 11686717102184386164, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 5, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42)))))))
|
||||
; COMBINED-DIS: ^6 = gv: (guid: 11834966808443348068, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 2, typeIdInfo: (typeTests: (7546896869197086323)))))
|
||||
; COMBINED-DIS: ^1 = gv: (guid: 2072045998141807037, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 8, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16))))))
|
||||
; COMBINED-DIS: ^2 = gv: (guid: 4197650231481825559, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 5, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeCheckedLoadVCalls: (vFuncId: (guid: 6699318081062747564, offset: 16))))))
|
||||
; COMBINED-DIS: ^3 = gv: (guid: 8471399308421654326, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 15, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTestAssumeVCalls: (vFuncId: (guid: 6699318081062747564, offset: 24), vFuncId: (guid: 16434608426314478903, offset: 32))))))
|
||||
; COMBINED-DIS: ^4 = gv: (guid: 10064745020953272174, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 15, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeTestAssumeConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42)), (vFuncId: (guid: 6699318081062747564, offset: 24), args: (43)))))))
|
||||
; COMBINED-DIS: ^5 = gv: (guid: 11686717102184386164, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 5, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 0, hasUnknownCall: 1, mustBeUnreachable: 0), typeIdInfo: (typeCheckedLoadConstVCalls: ((vFuncId: (guid: 6699318081062747564, offset: 16), args: (42)))))))
|
||||
; COMBINED-DIS: ^6 = gv: (guid: 11834966808443348068, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 2, typeIdInfo: (typeTests: (7546896869197086323)))))
|
||||
|
||||
@ -0,0 +1,20 @@
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-linux-gnu"
|
||||
|
||||
source_filename = "foo.c"
|
||||
|
||||
define dso_local i32 @m2(i32 noundef %0) local_unnamed_addr {
|
||||
%2 = tail call fastcc i32 @foo(i32 noundef %0)
|
||||
%3 = shl nsw i32 %0, 1
|
||||
%4 = tail call fastcc i32 @foo(i32 noundef %3)
|
||||
%5 = add nsw i32 %4, %2
|
||||
ret i32 %5
|
||||
}
|
||||
|
||||
define internal fastcc range(i32 -2147483647, -2147483648) i32 @foo(i32 noundef %0) unnamed_addr #1 {
|
||||
%2 = add nsw i32 %0, 5
|
||||
%3 = sdiv i32 %2, %0
|
||||
ret i32 %3
|
||||
}
|
||||
|
||||
attributes #1 = { noinline }
|
||||
@ -48,9 +48,9 @@ define void @caller_nounwind() {
|
||||
; CHECK-DAG: attributes [[ATTR_NOUNWIND]] = { norecurse nounwind }
|
||||
; CHECK-DAG: attributes [[ATTR_MAYTHROW]] = { norecurse }
|
||||
|
||||
; SUMMARY-DAG: = gv: (name: "cleanupret", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 4, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 1, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^{{.*}})), refs: (^{{.*}}))))
|
||||
; SUMMARY-DAG: = gv: (name: "resume", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 4, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 1, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^{{.*}})), refs: (^{{.*}}))))
|
||||
; SUMMARY-DAG: = gv: (name: "catchret", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition), insts: 5, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 1, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^{{.*}})), refs: (^{{.*}}))))
|
||||
; SUMMARY-DAG: = gv: (name: "cleanupret", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 4, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 1, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^{{.*}})), refs: (^{{.*}}))))
|
||||
; SUMMARY-DAG: = gv: (name: "resume", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 4, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 1, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^{{.*}})), refs: (^{{.*}}))))
|
||||
; SUMMARY-DAG: = gv: (name: "catchret", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 0, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 5, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 0, noUnwind: 0, mayThrow: 1, hasUnknownCall: 0, mustBeUnreachable: 0), calls: ((callee: ^{{.*}})), refs: (^{{.*}}))))
|
||||
|
||||
;--- callees.ll
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
@ -23,4 +23,4 @@ entry:
|
||||
}
|
||||
|
||||
attributes #0 = { alwaysinline nounwind uwtable }
|
||||
; CHECK2: ^2 = gv: (guid: {{.*}}, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 1, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 1, noUnwind: 1, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0))))
|
||||
; CHECK2: ^2 = gv: (guid: {{.*}}, summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 1, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 1, funcFlags: (readNone: 0, readOnly: 0, noRecurse: 0, returnDoesNotAlias: 0, noInline: 0, alwaysInline: 1, noUnwind: 1, mayThrow: 0, hasUnknownCall: 0, mustBeUnreachable: 0))))
|
||||
|
||||
@ -67,12 +67,12 @@
|
||||
; RUN: llvm-dis main.bc.thinlto.bc -o - | FileCheck %s --check-prefix=MAIN-DIS
|
||||
;
|
||||
; MAIN-DIS: [[LIBMOD:\^[0-9]+]] = module: (path: "lib.bc", hash: (0, 0, 0, 0, 0))
|
||||
; MAIN-DIS: gv: (guid: 2418497564662708935, summaries: (function: (module: [[LIBMOD]], flags: ({{.*}} importType: declaration), insts: 8, {{.*}})))
|
||||
; MAIN-DIS: gv: (guid: 2418497564662708935, summaries: (function: (module: [[LIBMOD]], flags: ({{.*}} importType: declaration, noRenameOnPromotion: 0), insts: 8, {{.*}})))
|
||||
; When alias is imported as a copy of the aliasee, but the aliasee is not being
|
||||
; imported by itself, the aliasee should be null.
|
||||
; MAIN-DIS: gv: (guid: 13590951773474913315, summaries: (alias: (module: [[LIBMOD]], flags: ({{.*}} importType: declaration), aliasee: null)))
|
||||
; MAIN-DIS: [[LARGEINDIRECT:\^[0-9]+]] = gv: (guid: 14343440786664691134, summaries: (function: (module: [[LIBMOD]], flags: ({{.*}} importType: declaration), insts: 8, {{.*}})))
|
||||
; MAIN-DIS: gv: (guid: 16730173943625350469, summaries: (alias: (module: [[LIBMOD]], flags: ({{.*}} importType: declaration), aliasee: [[LARGEINDIRECT]])))
|
||||
; MAIN-DIS: gv: (guid: 13590951773474913315, summaries: (alias: (module: [[LIBMOD]], flags: ({{.*}} importType: declaration, noRenameOnPromotion: 0), aliasee: null)))
|
||||
; MAIN-DIS: [[LARGEINDIRECT:\^[0-9]+]] = gv: (guid: 14343440786664691134, summaries: (function: (module: [[LIBMOD]], flags: ({{.*}} importType: declaration, noRenameOnPromotion: 0), insts: 8, {{.*}})))
|
||||
; MAIN-DIS: gv: (guid: 16730173943625350469, summaries: (alias: (module: [[LIBMOD]], flags: ({{.*}} importType: declaration, noRenameOnPromotion: 0), aliasee: [[LARGEINDIRECT]])))
|
||||
|
||||
; RUN: opt -passes=function-import -import-all-index -summary-file=main.bc.thinlto.bc main.bc -o main-after-import.bc
|
||||
; RUN: llvm-dis -o - main-after-import.bc | FileCheck %s --check-prefix=MAIN-IMPORT
|
||||
|
||||
@ -22,5 +22,5 @@ entry:
|
||||
}
|
||||
|
||||
; CHECK: ^0 = module:
|
||||
; CHECK-NEXT: ^1 = gv: (name: "obj", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), varFlags: (readonly: 1, writeonly: 1, constant: 0)))) ; guid =
|
||||
; CHECK-NEXT: ^2 = gv: (name: "foo", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition), insts: 3, refs: (^1)))) ; guid =
|
||||
; CHECK-NEXT: ^1 = gv: (name: "obj", summaries: (variable: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), varFlags: (readonly: 1, writeonly: 1, constant: 0)))) ; guid =
|
||||
; CHECK-NEXT: ^2 = gv: (name: "foo", summaries: (function: (module: ^0, flags: (linkage: external, visibility: default, notEligibleToImport: 0, live: 0, dsoLocal: 1, canAutoHide: 0, importType: definition, noRenameOnPromotion: 0), insts: 3, refs: (^1)))) ; guid =
|
||||
|
||||
99
llvm/test/ThinLTO/X86/reduce-promotion-devirt.ll
Normal file
99
llvm/test/ThinLTO/X86/reduce-promotion-devirt.ll
Normal file
@ -0,0 +1,99 @@
|
||||
; Test that renaming is still performed even when we try to avoid always renaming
|
||||
; on promotion. The devirtualization promotes an internal virtual target to a
|
||||
; uniqued hidden symbol from a static function, and later on the static funciton
|
||||
; is promoted to the same hidden symbol.
|
||||
|
||||
; Set up
|
||||
; RUN: rm -rf %t
|
||||
; RUN: mkdir -p %t
|
||||
; RUN: split-file %s %t
|
||||
|
||||
; RUN: opt -thinlto-bc %t/a.ll -o %t/a.bc
|
||||
; RUN: opt -thinlto-bc %t/b.ll -o %t/b.bc
|
||||
|
||||
; RUN: llvm-lto2 run %t/a.bc %t/b.bc \
|
||||
; RUN: --whole-program-visibility-enabled-in-lto=true \
|
||||
; RUN: -always-rename-promoted-locals=false \
|
||||
; RUN: -save-temps -o %t/lto-out \
|
||||
; RUN: -r %t/a.bc,test,px \
|
||||
; RUN: -r %t/b.bc,_ZN1B1fEi,p \
|
||||
; RUN: -r %t/b.bc,test2,px \
|
||||
; RUN: -r %t/b.bc,_ZTV1B,px
|
||||
|
||||
; RUN: llvm-nm %t/lto-out.1 | FileCheck %s --check-prefix=NM-INDEX1
|
||||
; RUN: llvm-nm %t/lto-out.2 | FileCheck %s --check-prefix=NM-INDEX2
|
||||
|
||||
; NM-INDEX1: U _ZN1A1nEi.llvm.
|
||||
; NM-INDEX2-NOT: U _ZN1A1nEi
|
||||
; NM-INDEX2: T _ZN1A1nEi.llvm.
|
||||
; NM-INDEX2-NOT: U _ZN1A1nEi
|
||||
|
||||
; RUN: llvm-dis %t/lto-out.1.4.opt.bc -o - | FileCheck %s --check-prefix=OPT-INDEX1
|
||||
; RUN: llvm-dis %t/lto-out.2.4.opt.bc -o - | FileCheck %s --check-prefix=OPT-INDEX2
|
||||
|
||||
; OPT-INDEX1: %call = tail call i32 @_ZN1A1nEi.llvm.
|
||||
; OPT-INDEX1: declare void @_ZN1A1nEi.llvm.
|
||||
|
||||
; OPT-INDEX2: ptr @_ZN1A1nEi.llvm.
|
||||
; OPT-INDEX2: define hidden i32 @_ZN1A1nEi.llvm.
|
||||
; OPT-INDEX2: tail call i32 @_ZN1A1nEi.llvm.
|
||||
|
||||
;--- a.ll
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-linux-gnu"
|
||||
|
||||
%struct.A = type { ptr }
|
||||
|
||||
define i32 @test(ptr %obj, i32 %a) {
|
||||
entry:
|
||||
%vtable = load ptr, ptr %obj
|
||||
%p = call i1 @llvm.type.test(ptr %vtable, metadata !"_ZTS1A")
|
||||
call void @llvm.assume(i1 %p)
|
||||
%fptrptr = getelementptr ptr, ptr %vtable, i32 1
|
||||
%fptr1 = load ptr, ptr %fptrptr, align 8
|
||||
|
||||
; the call was devirtualized.
|
||||
%call = tail call i32 %fptr1(ptr nonnull %obj, i32 %a)
|
||||
ret i32 %call
|
||||
}
|
||||
|
||||
declare i1 @llvm.type.test(ptr, metadata)
|
||||
declare void @llvm.assume(i1)
|
||||
|
||||
;--- b.ll
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-linux-gnu"
|
||||
|
||||
%struct.A = type { ptr }
|
||||
%struct.B = type { %struct.A }
|
||||
|
||||
@_ZTV1B = constant { [4 x ptr] } { [4 x ptr] [ptr null, ptr poison, ptr @_ZN1B1fEi, ptr @_ZN1A1nEi] }, !type !0, !type !1
|
||||
|
||||
define i32 @_ZN1B1fEi(ptr %this, i32 %a) #0 {
|
||||
ret i32 0;
|
||||
}
|
||||
|
||||
define internal i32 @_ZN1A1nEi(ptr %this, i32 %a) #0 {
|
||||
ret i32 0;
|
||||
}
|
||||
|
||||
define i32 @test2(ptr %obj, i32 %a) {
|
||||
entry:
|
||||
%vtable2 = load ptr, ptr %obj
|
||||
%p2 = call i1 @llvm.type.test(ptr %vtable2, metadata !"_ZTS1B")
|
||||
call void @llvm.assume(i1 %p2)
|
||||
|
||||
%fptrptr = getelementptr ptr, ptr %vtable2, i32 1
|
||||
%fptr33 = load ptr, ptr %fptrptr, align 8
|
||||
|
||||
%call4 = tail call i32 %fptr33(ptr nonnull %obj, i32 %a)
|
||||
ret i32 %call4
|
||||
}
|
||||
|
||||
attributes #0 = { noinline optnone }
|
||||
|
||||
declare i1 @llvm.type.test(ptr, metadata)
|
||||
declare void @llvm.assume(i1)
|
||||
|
||||
!0 = !{i64 16, !"_ZTS1A"}
|
||||
!1 = !{i64 16, !"_ZTS1B"}
|
||||
@ -0,0 +1,46 @@
|
||||
; Two same-name same-file static functions, meaning that they have the same GUID,
|
||||
; are in both modules respectively.
|
||||
; This is to test the support for avoiding always renaming, and ensure that
|
||||
; one copy is still renamed despite the GUID conflict.
|
||||
|
||||
; RUN: opt -thinlto-bc %s -o %t1.bc
|
||||
; RUN: opt -thinlto-bc %p/Inputs/reduce-promotion-same-file-local-name.ll -o %t2.bc
|
||||
;
|
||||
; RUN: llvm-lto2 run %t1.bc %t2.bc \
|
||||
; RUN: --whole-program-visibility-enabled-in-lto=true \
|
||||
; RUN: -always-rename-promoted-locals=false \
|
||||
; RUN: -save-temps -o %t3 \
|
||||
; RUN: -r %t1.bc,m1,px \
|
||||
; RUN: -r %t2.bc,m2,p \
|
||||
; RUN: -r %t1.bc,m2,x
|
||||
; RUN: llvm-dis %t3.1.3.import.bc -o - | FileCheck %s --check-prefix=IMPORT1
|
||||
; RUN: llvm-dis %t3.2.3.import.bc -o - | FileCheck %s --check-prefix=IMPORT2
|
||||
;
|
||||
; IMPORT1: define dso_local i32 @m1(
|
||||
; IMPORT1: tail call fastcc i32 @foo.{{[0-9]+}}(
|
||||
; IMPORT1: define available_externally i32 @m2(
|
||||
; IMPORT1-NEXT: %2 = tail call fastcc i32 @foo(
|
||||
; IMPORT2: define hidden fastcc range(i32 -2147483647, -2147483648) i32 @foo(
|
||||
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-linux-gnu"
|
||||
|
||||
source_filename = "foo.c"
|
||||
|
||||
define dso_local i32 @m1(i32 noundef %0) local_unnamed_addr {
|
||||
%2 = shl nsw i32 %0, 1
|
||||
%3 = tail call fastcc i32 @foo(i32 noundef %2)
|
||||
%4 = tail call i32 @m2(i32 noundef %0)
|
||||
%5 = add nsw i32 %4, %3
|
||||
ret i32 %5
|
||||
}
|
||||
|
||||
define internal fastcc range(i32 -2147483647, -2147483648) i32 @foo(i32 noundef %0) unnamed_addr #1 {
|
||||
%2 = add nsw i32 %0, 5
|
||||
%3 = sdiv i32 %2, %0
|
||||
ret i32 %3
|
||||
}
|
||||
|
||||
declare i32 @m2(i32 noundef) local_unnamed_addr
|
||||
|
||||
attributes #1 = { noinline }
|
||||
69
llvm/test/ThinLTO/X86/reduce-promotion-same-local-name.ll
Normal file
69
llvm/test/ThinLTO/X86/reduce-promotion-same-local-name.ll
Normal file
@ -0,0 +1,69 @@
|
||||
; This is to test the support for avoiding always renaming, and ensure that
|
||||
; one copy is still renamed despite having different GUIDs.
|
||||
|
||||
; Set up
|
||||
; RUN: rm -rf %t
|
||||
; RUN: mkdir -p %t
|
||||
; RUN: split-file %s %t
|
||||
|
||||
; RUN: opt -thinlto-bc %t/a.ll -o %t/a.bc
|
||||
; RUN: opt -thinlto-bc %t/b.ll -o %t/b.bc
|
||||
;
|
||||
; RUN: llvm-lto2 run %t/a.bc %t/b.bc \
|
||||
; RUN: --whole-program-visibility-enabled-in-lto=true \
|
||||
; RUN: -always-rename-promoted-locals=false \
|
||||
; RUN: -save-temps -o %t/lto-out \
|
||||
; RUN: -r %t/a.bc,m1,px \
|
||||
; RUN: -r %t/b.bc,m2,p \
|
||||
; RUN: -r %t/a.bc,m2,x
|
||||
; RUN: llvm-dis %t/lto-out.1.3.import.bc -o - | FileCheck %s --check-prefix=IMPORT1
|
||||
; RUN: llvm-dis %t/lto-out.2.3.import.bc -o - | FileCheck %s --check-prefix=IMPORT2
|
||||
;
|
||||
; IMPORT1: define dso_local i32 @m1(
|
||||
; IMPORT1: tail call fastcc i32 @foo.{{[0-9]+}}(
|
||||
; IMPORT1: define available_externally i32 @m2(
|
||||
; IMPORT1-NEXT: %2 = tail call fastcc i32 @foo(
|
||||
; IMPORT2: define hidden fastcc range(i32 -2147483647, -2147483648) i32 @foo(
|
||||
|
||||
;--- a.ll
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-linux-gnu"
|
||||
|
||||
define dso_local i32 @m1(i32 noundef %0) local_unnamed_addr {
|
||||
%2 = shl nsw i32 %0, 1
|
||||
%3 = tail call fastcc i32 @foo(i32 noundef %2)
|
||||
%4 = tail call i32 @m2(i32 noundef %0)
|
||||
%5 = add nsw i32 %4, %3
|
||||
ret i32 %5
|
||||
}
|
||||
|
||||
define internal fastcc range(i32 -2147483647, -2147483648) i32 @foo(i32 noundef %0) unnamed_addr #1 {
|
||||
%2 = add nsw i32 %0, 5
|
||||
%3 = sdiv i32 %2, %0
|
||||
ret i32 %3
|
||||
}
|
||||
|
||||
declare i32 @m2(i32 noundef) local_unnamed_addr
|
||||
|
||||
attributes #1 = { noinline }
|
||||
|
||||
;--- b.ll
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-linux-gnu"
|
||||
|
||||
; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) uwtable
|
||||
define dso_local i32 @m2(i32 noundef %0) local_unnamed_addr {
|
||||
%2 = tail call fastcc i32 @foo(i32 noundef %0)
|
||||
%3 = shl nsw i32 %0, 1
|
||||
%4 = tail call fastcc i32 @foo(i32 noundef %3)
|
||||
%5 = add nsw i32 %4, %2
|
||||
ret i32 %5
|
||||
}
|
||||
|
||||
define internal fastcc range(i32 -2147483647, -2147483648) i32 @foo(i32 noundef %0) unnamed_addr #1 {
|
||||
%2 = add nsw i32 %0, 5
|
||||
%3 = sdiv i32 %2, %0
|
||||
ret i32 %3
|
||||
}
|
||||
|
||||
attributes #1 = { noinline }
|
||||
56
llvm/test/ThinLTO/X86/reduce-promotion.ll
Normal file
56
llvm/test/ThinLTO/X86/reduce-promotion.ll
Normal file
@ -0,0 +1,56 @@
|
||||
; Test a simple cross module promotion where the suffix '.llvm.<...>' is not needed
|
||||
; because when avoiding always renaming, we should detect that there is a single
|
||||
; version of local foo which doesn't need renaming.
|
||||
|
||||
; Set up
|
||||
; RUN: rm -rf %t
|
||||
; RUN: mkdir -p %t
|
||||
; RUN: split-file %s %t
|
||||
|
||||
; RUN: opt -thinlto-bc %t/a.ll -o %t/a.bc
|
||||
; RUN: opt -thinlto-bc %t/b.ll -o %t/b.bc
|
||||
;
|
||||
; RUN: llvm-lto2 run %t/a.bc %t/b.bc \
|
||||
; RUN: --whole-program-visibility-enabled-in-lto=true \
|
||||
; RUN: -always-rename-promoted-locals=false \
|
||||
; RUN: -save-temps -o %t/lto-out \
|
||||
; RUN: -r %t/a.bc,m1,px \
|
||||
; RUN: -r %t/b.bc,m2,p \
|
||||
; RUN: -r %t/a.bc,m2,x
|
||||
; RUN: llvm-dis %t/lto-out.1.3.import.bc -o - | FileCheck %s --check-prefix=IMPORT1
|
||||
; RUN: llvm-dis %t/lto-out.2.3.import.bc -o - | FileCheck %s --check-prefix=IMPORT2
|
||||
;
|
||||
; IMPORT1: define available_externally i32 @m2(
|
||||
; IMPORT1-NEXT: %2 = tail call fastcc i32 @foo(
|
||||
; IMPORT2: define hidden fastcc range(i32 -2147483647, -2147483648) i32 @foo(
|
||||
|
||||
;--- a.ll
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-linux-gnu"
|
||||
|
||||
define dso_local i32 @m1(i32 noundef %0) local_unnamed_addr {
|
||||
%2 = tail call i32 @m2(i32 noundef %0)
|
||||
ret i32 %2
|
||||
}
|
||||
|
||||
declare i32 @m2(i32 noundef) local_unnamed_addr
|
||||
|
||||
;--- b.ll
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-pc-linux-gnu"
|
||||
|
||||
define dso_local i32 @m2(i32 noundef %0) local_unnamed_addr {
|
||||
%2 = tail call fastcc i32 @foo(i32 noundef %0)
|
||||
%3 = shl nsw i32 %0, 1
|
||||
%4 = tail call fastcc i32 @foo(i32 noundef %3)
|
||||
%5 = add nsw i32 %4, %2
|
||||
ret i32 %5
|
||||
}
|
||||
|
||||
define internal fastcc range(i32 -2147483647, -2147483648) i32 @foo(i32 noundef %0) unnamed_addr #1 {
|
||||
%2 = add nsw i32 %0, 5
|
||||
%3 = sdiv i32 %2, %0
|
||||
ret i32 %3
|
||||
}
|
||||
|
||||
attributes #1 = { noinline }
|
||||
@ -11,6 +11,7 @@
|
||||
; SUMMARY-NEXT: Local: false
|
||||
; SUMMARY-NEXT: CanAutoHide: false
|
||||
; SUMMARY-NEXT: ImportType: 0
|
||||
; SUMMARY-NEXT: RenameOnPromotion: false
|
||||
; SUMMARY-NEXT: TypeTests: [ 123 ]
|
||||
; SUMMARY-NEXT: TypeIdMap:
|
||||
; SUMMARY-NEXT: typeid1:
|
||||
|
||||
@ -3,6 +3,7 @@ GlobalValueMap:
|
||||
42:
|
||||
- Live: true
|
||||
ImportType: 0
|
||||
NoRenameOnPromotion: true
|
||||
TypeTestAssumeVCalls:
|
||||
- GUID: 123
|
||||
Offset: 0
|
||||
@ -26,6 +27,7 @@ GlobalValueMap:
|
||||
43:
|
||||
- Live: true
|
||||
ImportType : 1
|
||||
NoRenameOnPromotion: false
|
||||
TypeIdMap:
|
||||
typeid1:
|
||||
WPDRes:
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
; SUMMARY-NEXT: Local: false
|
||||
; SUMMARY-NEXT: CanAutoHide: false
|
||||
; SUMMARY-NEXT: ImportType: 0
|
||||
; SUMMARY-NEXT: NoRenameOnPromotion: true
|
||||
; SUMMARY-NEXT: TypeTestAssumeVCalls:
|
||||
; SUMMARY-NEXT: - GUID: 123
|
||||
; SUMMARY-NEXT: Offset: 0
|
||||
@ -39,6 +40,7 @@
|
||||
; SUMMARY-NEXT: Local: false
|
||||
; SUMMARY-NEXT: CanAutoHide: false
|
||||
; SUMMARY-NEXT: ImportType: 1
|
||||
; SUMMARY-NEXT: NoRenameOnPromotion: false
|
||||
; SUMMARY-NEXT: TypeIdMap:
|
||||
; SUMMARY-NEXT: typeid1:
|
||||
; SUMMARY-NEXT: TTRes:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user