https://gcc.gnu.org/g:bd0d3ba672870be1dfd5b58ddd0dbb95b4f80c04
commit r16-6528-gbd0d3ba672870be1dfd5b58ddd0dbb95b4f80c04 Author: Sebastian Huber <[email protected]> Date: Tue Dec 30 00:41:38 2025 +0100 gcov: Fix counter update method selection The counter update method selection had some issues. For PROFILE_UPDATE_ATOMIC, if atomic updates are not supported, then fallback to single mode, however, use partial atomic updates if available. Issue warnings. For PROFILE_UPDATE_PRFER_ATOMIC, if atomic updates are not supported, then fallback to single mode, however, use partial atomic updates if available. Do not issue warnings. gcc/ChangeLog: * tree-profile.cc (tree_profiling): Do not use atomic operations if they are not available. Try to use at least partial atomic updates as a fallback. Diff: --- gcc/tree-profile.cc | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/gcc/tree-profile.cc b/gcc/tree-profile.cc index b8d9c76e466f..885716535f1c 100644 --- a/gcc/tree-profile.cc +++ b/gcc/tree-profile.cc @@ -1847,19 +1847,32 @@ tree_profiling (void) can_support_atomic = have_atomic_8; } - if (flag_profile_update != PROFILE_UPDATE_SINGLE && needs_split) - counter_update = COUNTER_UPDATE_ATOMIC_PARTIAL; - if (flag_profile_update == PROFILE_UPDATE_ATOMIC && !can_support_atomic) { - warning (0, "target does not support atomic profile update, " - "single mode is selected"); + if (needs_split) + { + warning (0, "target does not fully support atomic profile " + "update, single mode is selected with partial " + "atomic updates"); + counter_update = COUNTER_UPDATE_ATOMIC_PARTIAL; + } + else + warning (0, "target does not support atomic profile update, " + "single mode is selected"); flag_profile_update = PROFILE_UPDATE_SINGLE; } else if (flag_profile_update == PROFILE_UPDATE_PREFER_ATOMIC) - flag_profile_update - = can_support_atomic ? PROFILE_UPDATE_ATOMIC : PROFILE_UPDATE_SINGLE; + { + if (can_support_atomic) + flag_profile_update = PROFILE_UPDATE_ATOMIC; + else + { + if (needs_split) + counter_update = COUNTER_UPDATE_ATOMIC_PARTIAL; + flag_profile_update = PROFILE_UPDATE_SINGLE; + } + } if (flag_profile_update == PROFILE_UPDATE_ATOMIC) {
