libstdc++: Minor codegen improvement for atomic wait spinloop
authorThomas Rodgers <trodgers@redhat.com>
Wed, 6 Jul 2022 00:42:42 +0000 (17:42 -0700)
committerThomas Rodgers <trodgers@redhat.com>
Tue, 26 Jul 2022 22:28:02 +0000 (15:28 -0700)
This patch merges the spin loops in the atomic wait implementation which is a
minor codegen improvement.

libstdc++-v3/ChangeLog:
* include/bits/atomic_wait.h (__atomic_spin): Merge spin loops.

(cherry picked from commit e75da2ace6b6f634237259ef62cfb2d3d34adb10)

libstdc++-v3/include/bits/atomic_wait.h

index 125b1ca..a6d55d3 100644 (file)
@@ -142,8 +142,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif
     }
 
-    constexpr auto __atomic_spin_count_1 = 12;
-    constexpr auto __atomic_spin_count_2 = 4;
+    constexpr auto __atomic_spin_count_relax = 12;
+    constexpr auto __atomic_spin_count = 16;
 
     struct __default_spin_policy
     {
@@ -157,18 +157,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       bool
       __atomic_spin(_Pred& __pred, _Spin __spin = _Spin{ }) noexcept
       {
-       for (auto __i = 0; __i < __atomic_spin_count_1; ++__i)
+       for (auto __i = 0; __i < __atomic_spin_count; ++__i)
          {
            if (__pred())
              return true;
-           __detail::__thread_relax();
-         }
 
-       for (auto __i = 0; __i < __atomic_spin_count_2; ++__i)
-         {
-           if (__pred())
-             return true;
-           __detail::__thread_yield();
+           if (__i < __atomic_spin_count_relax)
+             __detail::__thread_relax();
+           else
+             __detail::__thread_yield();
          }
 
        while (__spin())