From: Jan Hubicka Date: Thu, 9 Nov 2017 14:05:14 +0000 (+0100) Subject: re PR ipa/82879 (ICE in max, at profile-count.h:889) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e4373d41d67060e14bab0c984fb9f7cbc4c93f1b;p=gcc.git re PR ipa/82879 (ICE in max, at profile-count.h:889) PR ipa/82879 * ipa-inline-transform.c (update_noncloned_frequencies): Use profile_count::adjust_for_ipa_scaling. * tree-inline.c (copy_bb, copy_cfg_body): Likewise. * profile-count.c (profile_count::adjust_for_ipa_scaling): New member function. * profile-count.h (profile_count::adjust_for_ipa_scaling): Declare. From-SVN: r254582 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index df371fd5391..0953b4a3681 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2017-11-09 Jan Hubicka + + PR ipa/82879 + * ipa-inline-transform.c (update_noncloned_frequencies): Use + profile_count::adjust_for_ipa_scaling. + * tree-inline.c (copy_bb, copy_cfg_body): Likewise. + * profile-count.c (profile_count::adjust_for_ipa_scaling): New member + function. + * profile-count.h (profile_count::adjust_for_ipa_scaling): Declare. + 2017-11-09 Jakub Jelinek * gimple-ssa-store-merging.c (count_multiple_uses): New function. diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c index e367df7df0e..b2363e23043 100644 --- a/gcc/ipa-inline-transform.c +++ b/gcc/ipa-inline-transform.c @@ -60,17 +60,7 @@ update_noncloned_frequencies (struct cgraph_node *node, { struct cgraph_edge *e; - /* We always must scale to be sure counters end up compatible. - If den is zero, just force it nonzero and hope for reasonable - approximation. - When num is forced nonzero, also update den, so we do not scale profile - to 0. */ - if (!(num == den) - && !(den.force_nonzero () == den)) - { - den = den.force_nonzero (); - num = num.force_nonzero (); - } + profile_count::adjust_for_ipa_scaling (&num, &den); /* We do not want to ignore high loop nest after freq drops to 0. */ if (!freq_scale) diff --git a/gcc/profile-count.c b/gcc/profile-count.c index d7031404645..9c57323db6e 100644 --- a/gcc/profile-count.c +++ b/gcc/profile-count.c @@ -255,3 +255,29 @@ profile_count::to_cgraph_frequency (profile_count entry_bb_count) const return CGRAPH_FREQ_MAX; return MIN (scale, CGRAPH_FREQ_MAX); } + +/* We want to scale profile across function boundary from NUM to DEN. + Take care of the side case when DEN is zeros. We still want to behave + sanely here which means + - scale to profile_count::zero () if NUM is profile_count::zero + - do not affect anything if NUM == DEN + - preserve counter value but adjust quality in other cases. */ + +void +profile_count::adjust_for_ipa_scaling (profile_count *num, + profile_count *den) +{ + /* Scaling is no-op if NUM and DEN are the same. */ + if (*num == *den) + return; + /* Scaling to zero is always zeor. */ + if (*num == profile_count::zero ()) + return; + /* If den is non-zero we are safe. */ + if (den->force_nonzero () == *den) + return; + /* Force both to non-zero so we do not push profiles to 0 when + both num == 0 and den == 0. */ + *den = den->force_nonzero (); + *num = num->force_nonzero (); +} diff --git a/gcc/profile-count.h b/gcc/profile-count.h index f16bbcb2b9f..aa42b4e2397 100644 --- a/gcc/profile-count.h +++ b/gcc/profile-count.h @@ -1044,6 +1044,11 @@ public: /* Return true if THIS is known to differ significantly from OTHER. */ bool differs_from_p (profile_count other) const; + /* We want to scale profile across function boundary from NUM to DEN. + Take care of the side case when NUM and DEN are zeros of incompatible + kinds. */ + static void adjust_for_ipa_scaling (profile_count *num, profile_count *den); + /* LTO streaming support. */ static profile_count stream_in (struct lto_input_block *); void stream_out (struct output_block *); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e7867ec6b85..7741f7fd7b3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-11-09 Jan Hubicka + + * gcc.c-torture/compile/pr82879.c: New testcase. + 2017-11-09 Richard Biener PR tree-optimization/82902 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr82879.c b/gcc/testsuite/gcc.c-torture/compile/pr82879.c new file mode 100644 index 00000000000..fad3fed8de9 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr82879.c @@ -0,0 +1,11 @@ +int a, b; +static __attribute__((cold)) void fn1() { + for (;;) + for (; a;) + ; +} +void fn2() { + if (b) + fn1(); +} + diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 7ef107247b5..fc5d2c703ab 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1771,17 +1771,7 @@ copy_bb (copy_body_data *id, basic_block bb, tree decl; basic_block prev; - /* We always must scale to be sure counters end up compatible. - If den is zero, just force it nonzero and hope for reasonable - approximation. - When num is forced nonzero, also update den, so we do not scale profile - to 0. */ - if (!(num == den) - && !(den.force_nonzero () == den)) - { - den = den.force_nonzero (); - num = num.force_nonzero (); - } + profile_count::adjust_for_ipa_scaling (&num, &den); /* Search for previous copied basic block. */ prev = bb->prev_bb; @@ -2698,17 +2688,7 @@ copy_cfg_body (copy_body_data * id, profile_count, profile_count den = ENTRY_BLOCK_PTR_FOR_FN (src_cfun)->count; profile_count num = entry_block_map->count; - /* We always must scale to be sure counters end up compatible. - If den is zero, just force it nonzero and hope for reasonable - approximation. - When num is forced nonzero, also update den, so we do not scale profile - to 0. */ - if (!(num == den) - && !(den.force_nonzero () == den)) - { - den = den.force_nonzero (); - num = num.force_nonzero (); - } + profile_count::adjust_for_ipa_scaling (&num, &den); cfun_to_copy = id->src_cfun = DECL_STRUCT_FUNCTION (callee_fndecl);