This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix computation of min_size in ipa-fnsummary.c
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 9 Nov 2019 18:44:05 +0100
- Subject: Fix computation of min_size in ipa-fnsummary.c
Hi,
this patch fixes two different bugs in computation of min_size in
ipa-fnsummary.c. This computes minimal size of any clone or version
of given function and is used to avoid some harder work to compute
actual size for given context in the inlining heuristics.
In estimate_size_and_time we mistakely reset min_size to size of first
entry of size/time table (which is only unconditional entry) forgetting
that it already cumulated info about calls sizes.
In update_overall_fn_summary we forgot to account the size/time table
and then divide result by size scale.
Bootstrapped/regtested x86_64-linux, comitted.
Honza
* ipa-fnsummary.c (ipa_call_context::estimate_size_and_time): Fix
calculation of min_size.
(ipa_update_overall_fn_summary): Likewise.
Index: ipa-fnsummary.c
===================================================================
--- ipa-fnsummary.c (revision 278005)
+++ ipa-fnsummary.c (working copy)
@@ -3243,6 +3243,7 @@ ipa_call_context::estimate_size_and_time
sreal nonspecialized_time = time;
+ min_size += (*info->size_time_table)[0].size;
for (i = 0; vec_safe_iterate (info->size_time_table, i, &e); i++)
{
bool exec = e->exec_predicate.evaluate (m_nonspec_possible_truths);
@@ -3288,7 +3289,7 @@ ipa_call_context::estimate_size_and_time
}
gcc_checking_assert ((*info->size_time_table)[0].exec_predicate == true);
gcc_checking_assert ((*info->size_time_table)[0].nonconst_predicate == true);
- min_size = (*info->size_time_table)[0].size;
+ gcc_checking_assert (min_size >= 0);
gcc_checking_assert (size >= 0);
gcc_checking_assert (time >= 0);
/* nonspecialized_time should be always bigger than specialized time.
@@ -3685,12 +3686,13 @@ ipa_update_overall_fn_summary (struct cg
size_info->size += e->size;
info->time += e->time;
}
+ info->min_size = (*info->size_time_table)[0].size;
estimate_calls_size_and_time (node, &size_info->size, &info->min_size,
&info->time, NULL,
~(clause_t) (1 << predicate::false_condition),
vNULL, vNULL, vNULL);
- size_info->size = (size_info->size + ipa_fn_summary::size_scale / 2)
- / ipa_fn_summary::size_scale;
+ size_info->size = RDIV (size_info->size, ipa_fn_summary::size_scale);
+ info->min_size = RDIV (info->min_size, ipa_fn_summary::size_scale);
}