From f160cd13fb44be3f63a2f43d68befa76f797578f Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 28 Nov 2019 08:31:26 +0100 Subject: 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/profile-count.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'gcc/profile-count.c') 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) -- cgit v1.1