forked from OSchip/llvm-project
ThinLTO: do not import function whose linkage prevents inlining.
There is not point in importing a "weak" or a "linkonce" function since we won't be able to inline it anyway. We already had a targeted check for WeakAny, this is using the same check on GlobalValue as the inline, i.e. isMayBeOverriddenLinkage() From: Mehdi Amini <mehdi.amini@apple.com> llvm-svn: 268315
This commit is contained in:
parent
3ba6535096
commit
bda9b2ae9e
|
@ -124,26 +124,7 @@ private:
|
||||||
/// non-equivalent at link time. For example, if a function has weak linkage
|
/// non-equivalent at link time. For example, if a function has weak linkage
|
||||||
/// then the code defining it may be replaced by different code.
|
/// then the code defining it may be replaced by different code.
|
||||||
bool mayBeOverridden() const {
|
bool mayBeOverridden() const {
|
||||||
switch (getLinkage()) {
|
return isMayBeOverriddenLinkage(getLinkage());
|
||||||
case WeakAnyLinkage:
|
|
||||||
case LinkOnceAnyLinkage:
|
|
||||||
case CommonLinkage:
|
|
||||||
case ExternalWeakLinkage:
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case AvailableExternallyLinkage:
|
|
||||||
case LinkOnceODRLinkage:
|
|
||||||
case WeakODRLinkage:
|
|
||||||
// The above three cannot be overridden but can be de-refined.
|
|
||||||
|
|
||||||
case ExternalLinkage:
|
|
||||||
case AppendingLinkage:
|
|
||||||
case InternalLinkage:
|
|
||||||
case PrivateLinkage:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
llvm_unreachable("Fully covered switch above!");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -285,6 +266,31 @@ public:
|
||||||
return Linkage == CommonLinkage;
|
return Linkage == CommonLinkage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Whether the definition of this global may be replaced by something
|
||||||
|
/// non-equivalent at link time. For example, if a function has weak linkage
|
||||||
|
/// then the code defining it may be replaced by different code.
|
||||||
|
static bool isMayBeOverriddenLinkage(LinkageTypes Linkage) {
|
||||||
|
switch (Linkage) {
|
||||||
|
case WeakAnyLinkage:
|
||||||
|
case LinkOnceAnyLinkage:
|
||||||
|
case CommonLinkage:
|
||||||
|
case ExternalWeakLinkage:
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case AvailableExternallyLinkage:
|
||||||
|
case LinkOnceODRLinkage:
|
||||||
|
case WeakODRLinkage:
|
||||||
|
// The above three cannot be overridden but can be de-refined.
|
||||||
|
|
||||||
|
case ExternalLinkage:
|
||||||
|
case AppendingLinkage:
|
||||||
|
case InternalLinkage:
|
||||||
|
case PrivateLinkage:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
llvm_unreachable("Fully covered switch above!");
|
||||||
|
}
|
||||||
|
|
||||||
/// Whether the definition of this global may be discarded if it is not used
|
/// Whether the definition of this global may be discarded if it is not used
|
||||||
/// in its compilation unit.
|
/// in its compilation unit.
|
||||||
static bool isDiscardableIfUnused(LinkageTypes Linkage) {
|
static bool isDiscardableIfUnused(LinkageTypes Linkage) {
|
||||||
|
|
|
@ -156,8 +156,8 @@ selectCallee(const ModuleSummaryIndex &Index,
|
||||||
CalleeSummaryList,
|
CalleeSummaryList,
|
||||||
[&](const std::unique_ptr<GlobalValueSummary> &SummaryPtr) {
|
[&](const std::unique_ptr<GlobalValueSummary> &SummaryPtr) {
|
||||||
auto *GVSummary = SummaryPtr.get();
|
auto *GVSummary = SummaryPtr.get();
|
||||||
if (GlobalValue::isWeakAnyLinkage(GVSummary->linkage()))
|
if (GlobalValue::isMayBeOverriddenLinkage(GVSummary->linkage()))
|
||||||
// There is no point in importing weak symbols, we can't inline them
|
// There is no point in importing these, we can't inline them
|
||||||
return false;
|
return false;
|
||||||
if (auto *AS = dyn_cast<AliasSummary>(GVSummary)) {
|
if (auto *AS = dyn_cast<AliasSummary>(GVSummary)) {
|
||||||
GVSummary = &AS->getAliasee();
|
GVSummary = &AS->getAliasee();
|
||||||
|
|
|
@ -75,6 +75,11 @@ entry:
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define linkonce void @linkoncefunc2() #0 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
define internal i32 @staticfunc() #0 {
|
define internal i32 @staticfunc() #0 {
|
||||||
entry:
|
entry:
|
||||||
ret i32 1
|
ret i32 1
|
||||||
|
|
|
@ -28,6 +28,7 @@ entry:
|
||||||
call void (...) @setfuncptr()
|
call void (...) @setfuncptr()
|
||||||
call void (...) @callfuncptr()
|
call void (...) @callfuncptr()
|
||||||
call void (...) @weakfunc()
|
call void (...) @weakfunc()
|
||||||
|
call void (...) @linkoncefunc2()
|
||||||
call void (...) @referencelargelinkonce()
|
call void (...) @referencelargelinkonce()
|
||||||
ret i32 0
|
ret i32 0
|
||||||
}
|
}
|
||||||
|
@ -94,6 +95,10 @@ declare void @referencelargelinkonce(...)
|
||||||
; CHECK-DAG: declare void @weakfunc(...)
|
; CHECK-DAG: declare void @weakfunc(...)
|
||||||
declare void @weakfunc(...) #1
|
declare void @weakfunc(...) #1
|
||||||
|
|
||||||
|
; Won't import linkonce func
|
||||||
|
; CHECK-DAG: declare void @linkoncefunc2(...)
|
||||||
|
declare void @linkoncefunc2(...) #1
|
||||||
|
|
||||||
; INSTLIMDEF-DAG: Import funcwithpersonality
|
; INSTLIMDEF-DAG: Import funcwithpersonality
|
||||||
; INSTLIMDEF-DAG: define available_externally hidden void @funcwithpersonality.llvm.{{.*}}() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
; INSTLIMDEF-DAG: define available_externally hidden void @funcwithpersonality.llvm.{{.*}}() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
||||||
; INSTLIM5-DAG: declare hidden void @funcwithpersonality.llvm.{{.*}}()
|
; INSTLIM5-DAG: declare hidden void @funcwithpersonality.llvm.{{.*}}()
|
||||||
|
|
Loading…
Reference in New Issue