aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2019-11-28 08:31:26 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2019-11-28 07:31:26 +0000
commitf160cd13fb44be3f63a2f43d68befa76f797578f (patch)
treebdce7cac8176db8648be979e0c1243c12b793c09 /gcc
parent34b7ae1dd5f0c01036b2a9308baf15329280733e (diff)
downloadgcc-f160cd13fb44be3f63a2f43d68befa76f797578f.zip
gcc-f160cd13fb44be3f63a2f43d68befa76f797578f.tar.gz
gcc-f160cd13fb44be3f63a2f43d68befa76f797578f.tar.bz2
Handle correctly global0 and global counters in profile_count::to_sreal_scale
This patch fixes problem in profile_count::to_sreal_scale. We our porfile counters can be function local, global (ipa) or function local but globally 0. The last is used to hold static estimates for functions executed 0 times in profile. Now only one 64bit value is stored and if we compute frequency of global0 counter in global counter we mix them up and return non-zero value incorrectly. I also implemented unit test, but will commit sanity checking separately from fixes: there are multiple bugs in this area I tracked down. * profile-count.c (profile_count::to_sreal_scale): Handle correctly combination of globa0 and global counters.. From-SVN: r278801
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/profile-count.c14
2 files changed, 19 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7c7ff3f..4ee1806 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2019-11-28 Jan Hubicka <hubicka@ucw.cz>
+
+ * profile-count.c (profile_count::to_sreal_scale): Handle correctly
+ combination of globa0 and global counters..
+
2019-11-28 Kewen Lin <linkw@gcc.gnu.org>
PR target/92566
diff --git a/gcc/profile-count.c b/gcc/profile-count.c
index 4946748..e8602a0 100644
--- a/gcc/profile-count.c
+++ b/gcc/profile-count.c
@@ -310,6 +310,20 @@ profile_count::to_sreal_scale (profile_count in, bool *known) const
}
if (known)
*known = true;
+ /* Watch for cases where one count is IPA and other is not. */
+ if (in.ipa ().initialized_p ())
+ {
+ gcc_checking_assert (ipa ().initialized_p ());
+ /* If current count is inter-procedurally 0 and IN is inter-procedurally
+ non-zero, return 0. */
+ if (in.ipa ().nonzero_p ()
+ && !ipa().nonzero_p ())
+ return 0;
+ }
+ else
+ /* We can handle correctly 0 IPA count within locally estimated
+ profile, but otherwise we are lost and this should not happen. */
+ gcc_checking_assert (!ipa ().initialized_p () || !ipa ().nonzero_p ());
if (*this == zero ())
return 0;
if (m_val == in.m_val)