diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2019-11-28 08:31:26 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2019-11-28 07:31:26 +0000 |
commit | f160cd13fb44be3f63a2f43d68befa76f797578f (patch) | |
tree | bdce7cac8176db8648be979e0c1243c12b793c09 /gcc | |
parent | 34b7ae1dd5f0c01036b2a9308baf15329280733e (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/profile-count.c | 14 |
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) |