Inline should return failure either (newsize > param_large_function_insns) OR (newsize > limit). Sometimes newsize is larger than param_large_function_insns, but smaller than limit, inline doesn't return failure even if the new function is a large function. Therefore, param_large_function_insns and param_large_function_growth should be OR instead of AND, otherwise --param large-function-growth won't work correctly with --param large-function-insns.
gcc/ChangeLog: 2020-01-06 Luo Xiong Hu <luo...@linux.ibm.com> ipa-inline-analysis.c (estimate_growth): Fix typo. ipa-inline.c (caller_growth_limits): Use OR instead of AND. --- gcc/ipa-inline-analysis.c | 2 +- gcc/ipa-inline.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index 711b85bd1a9..0e584a5a401 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -462,7 +462,7 @@ offline_size (struct cgraph_node *node, ipa_size_summary *info) return 0; } -/* Estimate the growth caused by inlining NODE into all callees. */ +/* Estimate the growth caused by inlining NODE into all callers. */ int estimate_growth (struct cgraph_node *node) diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 0f87c476dde..33945538def 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -184,8 +184,8 @@ caller_growth_limits (struct cgraph_edge *e) the function to shrink if it went over the limits by forced inlining. */ newsize = estimate_size_after_inlining (to, e); if (newsize >= ipa_size_summaries->get (what)->size - && newsize > opt_for_fn (to->decl, param_large_function_insns) - && newsize > limit) + && (newsize > opt_for_fn (to->decl, param_large_function_insns) + || newsize > limit)) { e->inline_failed = CIF_LARGE_FUNCTION_GROWTH_LIMIT; return false; -- 2.21.0.777.g83232e3864