From f160cd13fb44be3f63a2f43d68befa76f797578f Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 28 Nov 2019 08:31:26 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/profile-count.c | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7c7ff3f0300..4ee1806b5ab 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-11-28 Jan Hubicka + + * profile-count.c (profile_count::to_sreal_scale): Handle correctly + combination of globa0 and global counters.. + 2019-11-28 Kewen Lin PR target/92566 diff --git a/gcc/profile-count.c b/gcc/profile-count.c index 49467481d47..e8602a025f0 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) -- 2.30.2