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)
     {

Reply via email to