fixes for correctly tracking which functions have been fully inlined

This commit is contained in:
Vern Paxson 2023-07-20 09:40:39 -07:00
parent 91d70e6dd4
commit 3f64858335
3 changed files with 17 additions and 7 deletions

View file

@ -218,6 +218,8 @@ ExprPtr Inliner::CheckForInlining(CallExprPtr c)
return nullptr; // signals "stop inlining" return nullptr; // signals "stop inlining"
} }
did_inline.insert(func_vf);
num_stmts += oi->num_stmts; num_stmts += oi->num_stmts;
num_exprs += oi->num_exprs; num_exprs += oi->num_exprs;
@ -265,9 +267,9 @@ ExprPtr Inliner::CheckForInlining(CallExprPtr c)
else else
max_inlined_frame_size = hold_max_inlined_frame_size; max_inlined_frame_size = hold_max_inlined_frame_size;
ListExprPtr args = {NewRef{}, c->Args()};
auto t = c->GetType(); auto t = c->GetType();
auto ie = make_intrusive<InlineExpr>(args, std::move(params), body_dup, curr_frame_size, t); auto ie = make_intrusive<InlineExpr>(c->ArgsPtr(), std::move(params), body_dup, curr_frame_size,
t);
ie->SetOriginal(c); ie->SetOriginal(c);
return ie; return ie;

View file

@ -31,10 +31,10 @@ public:
// or an InlineExpr if it is; or nil if further inlining should stop. // or an InlineExpr if it is; or nil if further inlining should stop.
ExprPtr CheckForInlining(CallExprPtr c); ExprPtr CheckForInlining(CallExprPtr c);
// True if the given function has been inlined. // True if every instance of the function was inlined.
bool WasInlined(const Func* f) bool WasFullyInlined(const Func* f)
{ {
return inline_ables.count(f) > 0 && skipped_inlining.count(f) == 0; return did_inline.count(f) > 0 && skipped_inlining.count(f) == 0;
} }
protected: protected:
@ -52,6 +52,9 @@ protected:
// Functions that we've determined to be suitable for inlining. // Functions that we've determined to be suitable for inlining.
std::unordered_set<const Func*> inline_ables; std::unordered_set<const Func*> inline_ables;
// Functions that we inlined.
std::unordered_set<const Func*> did_inline;
// Functions that we didn't fully inline, so require separate // Functions that we didn't fully inline, so require separate
// compilation. // compilation.
std::unordered_set<const Func*> skipped_inlining; std::unordered_set<const Func*> skipped_inlining;

View file

@ -517,10 +517,15 @@ static void analyze_scripts_for_ZAM(std::unique_ptr<ProfileFuncs>& pfs)
continue; continue;
} }
else if ( ! analysis_options.compile_all && ! is_lambda && inl && inl->WasInlined(func) && else if ( ! analysis_options.compile_all && ! is_lambda && inl &&
func_used_indirectly.count(func) == 0 ) inl->WasFullyInlined(func) && func_used_indirectly.count(func) == 0 )
{ {
// No need to compile as it won't be called directly. // No need to compile as it won't be called directly.
// We'd like to zero out the body to recover the
// memory, but a *few* such functions do get called,
// such as by the event engine reaching up, or
// BiFs looking for them, so we can't safely zero
// them.
continue; continue;
} }