Commit f160cd13 by Jan Hubicka Committed by Jan Hubicka

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
parent 34b7ae1d
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
......@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment