[mlgo] add 2 new features whether caller/callee is available_externally (#96585)

AvailableExternally linkage is interesting because, in ThinLTO cases, it
means the function may get elided if it survives inlining - see
`elim-avail-extern` pass.
This commit is contained in:
Mircea Trofin 2024-06-25 12:36:40 -07:00 committed by GitHub
parent a55dc1d3ca
commit 600ff28772
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 37 additions and 1 deletions

View File

@ -121,7 +121,15 @@ constexpr bool isHeuristicInlineCostFeature(InlineCostFeatureIndex Feature) {
"number of blocks reached from a conditional instruction, in the callee") \
M(int64_t, {1}, callee_users, \
"number of module-internal users of the callee, +1 if the callee is " \
"exposed externally")
"exposed externally") \
M(int64_t, {1}, is_callee_avail_external, \
"Is callee an available-externally linkage type (i.e. could be DCEd if " \
"not " \
"fully inlined by ElimAvailExtern)") \
M(int64_t, {1}, is_caller_avail_external, \
"Is caller an available-externally linkage type (i.e. could be DCEd if " \
"not " \
"fully inlined by ElimAvailExtern)")
// clang-format off
enum class FeatureIndex : size_t {

View File

@ -427,6 +427,10 @@ std::unique_ptr<InlineAdvice> MLInlineAdvisor::getAdviceImpl(CallBase &CB) {
*ModelRunner->getTensor<int64_t>(FeatureIndex::callee_users) =
CalleeBefore.Uses;
*ModelRunner->getTensor<int64_t>(FeatureIndex::cost_estimate) = CostEstimate;
*ModelRunner->getTensor<int64_t>(FeatureIndex::is_callee_avail_external) =
Callee.hasAvailableExternallyLinkage();
*ModelRunner->getTensor<int64_t>(FeatureIndex::is_caller_avail_external) =
Caller.hasAvailableExternallyLinkage();
// Add the cost features
for (size_t I = 0;

View File

@ -71,6 +71,8 @@ def get_input_signature():
"nested_inlines",
"nested_inline_cost_estimate",
"threshold",
"is_callee_avail_external",
"is_caller_avail_external",
]
]

View File

@ -0,0 +1,22 @@
; REQUIRES: x86_64-linux
; RUN: rm -rf %t.rundir
; RUN: rm -rf %t.channel-basename.*
; RUN: mkdir %t.rundir
; RUN: cp %S/../../../../lib/Analysis/models/log_reader.py %t.rundir
; RUN: cp %S/../../../../lib/Analysis/models/interactive_host.py %t.rundir
; RUN: cp %S/Inputs/interactive_main.py %t.rundir
; RUN: %python %t.rundir/interactive_main.py %t.channel-basename \
; RUN: opt -passes=scc-oz-module-inliner -interactive-model-runner-echo-reply \
; RUN: -enable-ml-inliner=release -inliner-interactive-channel-base=%t.channel-basename %s -S -o /dev/null | FileCheck %s
define available_externally void @g() {
ret void
}
define void @f(){
call void @g()
ret void
}
; CHECK: is_callee_avail_external: 1
; CHECK: is_caller_avail_external: 0