Hi,
this fixes (minor) profile updating issue which was uncovered by
somewhat devilish testcase Jakub accidentally created for branch
prediction code.

When expanding if (cond) goto xxx; gimple stmt with probability
profile_count::one into mutliple conditionals, we may end up predicting
whole chain with "guessed" quality which is unnecesary downgrade of
information we already have in CFG.

Bootstrapped/regtested x86_64-linux, comitted.

Honza

        * profile-count.h (profile_count::split): Give better result when
        splitting profile_probability::always.
Index: profile-count.h
===================================================================
--- profile-count.h     (revision 266450)
+++ profile-count.h     (working copy)
@@ -447,8 +447,12 @@ public:
     {
       profile_probability ret = *this * cprob;
       /* The following is equivalent to:
-         *this = cprob.invert () * *this / ret.invert ();  */
-      *this = (*this - ret) / ret.invert ();
+         *this = cprob.invert () * *this / ret.invert ();
+        Avoid scaling when overall outcome is supposed to be always.
+        Without knowing that one is inverse of toher, the result would be
+        conservative.  */
+      if (!(*this == profile_probability::always ()))
+        *this = (*this - ret) / ret.invert ();
       return ret;
     }
 

Reply via email to