Hi,
this patch fixes similar issue in update_profile_after_ifcombine
(in Jakub's testcase the conditional is first combined and later split
again and in both cases we got update unnecesarily imprecise).
Bootstrapped/regtested x86_64-linux, comitted.
* tree-ssa-ifcombine.c (update_profile_after_ifcombine): Handle
profile_probability::always better.
Index: tree-ssa-ifcombine.c
===================================================================
--- tree-ssa-ifcombine.c (revision 266450)
+++ tree-ssa-ifcombine.c (working copy)
@@ -360,8 +360,15 @@ update_profile_after_ifcombine (basic_bl
inner_cond_bb->count = outer_cond_bb->count;
- inner_taken->probability = outer2->probability + outer_to_inner->probability
- * inner_taken->probability;
+ /* Handle special case where inner_taken probability is always. In this case
+ we know that the overall outcome will be always as well, but combining
+ probabilities will be conservative because it does not know that
+ outer2->probability is inverse of outer_to_inner->probability. */
+ if (inner_taken->probability == profile_probability::always ())
+ ;
+ else
+ inner_taken->probability = outer2->probability +
outer_to_inner->probability
+ * inner_taken->probability;
inner_not_taken->probability = profile_probability::always ()
- inner_taken->probability;