diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2025-06-05 15:24:36 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@ucw.cz> | 2025-06-05 15:24:36 +0200 |
commit | 9399a3b5f512af6dbbe05be076e726efc91413f1 (patch) | |
tree | 26e10fab99fbe864def0817dee0c944249999de4 | |
parent | 8cf31de8c8fec295c5f627b399d9e015df266297 (diff) | |
download | gcc-9399a3b5f512af6dbbe05be076e726efc91413f1.zip gcc-9399a3b5f512af6dbbe05be076e726efc91413f1.tar.gz gcc-9399a3b5f512af6dbbe05be076e726efc91413f1.tar.bz2 |
Fix handling of GUESSED_LOCAL in auto-fdo and preserve more static profile
This patch fixes ICE where GUESSED_LOCAL was kept in autofdo profile.
It may make more sense to turn GESSED_LOCAL 0 to GUESSED 0 since it seems
bit more informative then autofdo 0 (which really means that count is below
the 2% threshold or that info was lost due to some code transformation).
The patch also modifies code setting probabilities of edge to keep reliable
predictions of 0 or 1.
gcc/ChangeLog:
* auto-profile.cc (update_count_by_afdo_count): Fix handling
of GUESSED_LOCAL.
(afdo_calculate_branch_prob): Preserve static profile for
probabilities 0 and 1.
-rw-r--r-- | gcc/auto-profile.cc | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/gcc/auto-profile.cc b/gcc/auto-profile.cc index 215dadf..91b1e97 100644 --- a/gcc/auto-profile.cc +++ b/gcc/auto-profile.cc @@ -1120,7 +1120,8 @@ update_count_by_afdo_count (profile_count *count, gcov_type c) /* In case we have guessed profile which is already zero, preserve quality info. */ else if (count->nonzero_p () - || count->quality () == GUESSED) + || count->quality () == GUESSED + || count->quality () == GUESSED_LOCAL) *count = profile_count::zero ().afdo (); } @@ -1515,8 +1516,21 @@ afdo_calculate_branch_prob (bb_set *annotated_bb) if (num_unknown_succ == 0 && total_count.nonzero_p ()) { FOR_EACH_EDGE (e, ei, bb->succs) - e->probability - = AFDO_EINFO (e)->get_count ().probability_in (total_count); + { + /* If probability is 1, preserve reliable static prediction + (This is, for example the case of single fallthru edge + or single fallthru plus unlikely EH edge.) */ + if (AFDO_EINFO (e)->get_count () == total_count () + && e->probability == profile_probability::always ()) + ; + else if (AFDO_EINFO (e)->get_count ().nonzero_p ()) + e->probability + = AFDO_EINFO (e)->get_count ().probability_in (total_count); + /* If probability is zero, preserve reliable static prediction. */ + else if (e->probability.nonzero_p () + || e->probability.quality () == GUESSED) + e->probability = profile_probability::never ().afdo (); + } } } FOR_ALL_BB_FN (bb, cfun) |