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; }