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