aboutsummaryrefslogtreecommitdiff
path: root/gcc/profile-count.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2017-11-09 15:05:14 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2017-11-09 14:05:14 +0000
commite4373d41d67060e14bab0c984fb9f7cbc4c93f1b (patch)
treefb9d5143e4e5fd9e929fbb4c13e3bd4b71aaaa40 /gcc/profile-count.c
parenta3a6d41f4610c67b9905b3796e441397cc240178 (diff)
downloadgcc-e4373d41d67060e14bab0c984fb9f7cbc4c93f1b.zip
gcc-e4373d41d67060e14bab0c984fb9f7cbc4c93f1b.tar.gz
gcc-e4373d41d67060e14bab0c984fb9f7cbc4c93f1b.tar.bz2
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
Diffstat (limited to 'gcc/profile-count.c')
-rw-r--r--gcc/profile-count.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/profile-count.c b/gcc/profile-count.c
index d703140..9c57323 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 ();
+}