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.
---
 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 eac96d7b33d..4ec2bb399e8 100644
--- a/gcc/tree-profile.cc
+++ b/gcc/tree-profile.cc
@@ -1906,19 +1906,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)
     {
-- 
2.51.0

Reply via email to