Handle correctly global0 and global counters in profile_count::to_sreal_scale
authorJan Hubicka <hubicka@ucw.cz>
Thu, 28 Nov 2019 07:31:26 +0000 (08:31 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 28 Nov 2019 07:31:26 +0000 (07:31 +0000)
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
gcc/profile-count.c

index 7c7ff3f03004ca6f2d54533809351e5bd3f9b9ea..4ee1806b5abaea7106a7dee23cbd65f9a60af1cc 100644 (file)
@@ -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
index 49467481d47a9194efb14c8df67c2df50de2cf60..e8602a025f026e8925860d414c67590bb0dca9a8 100644 (file)
@@ -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)