https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103069

H.J. Lu <hjl.tools at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |REOPENED
     Ever confirmed|0                           |1
         Resolution|FIXED                       |---
   Last reconfirmed|                            |2022-01-24

--- Comment #6 from H.J. Lu <hjl.tools at gmail dot com> ---
nptl/pthread_rwlock_common.c in glibc has:

  unsigned int r = atomic_load_relaxed (&rwlock->__data.__readers);
  /* Release MO so that subsequent readers or writers synchronize with us.  */
  while (!atomic_compare_exchange_weak_release
         (&rwlock->__data.__readers, &r,
          ((r ^ PTHREAD_RWLOCK_WRLOCKED)
           ^ ((r >> PTHREAD_RWLOCK_READER_SHIFT) == 0 ? 0
              : PTHREAD_RWLOCK_WRPHASE))))
    {
      /* TODO Back-off.  */
    }   

-mrelax-cmpxchg-loop -O2 generates:

         9240e: 89 c1                   mov    %eax,%ecx
         92410: 31 d2                   xor    %edx,%edx
         92412: c1 e9 03                shr    $0x3,%ecx
         92415: 0f 95 c2                setne  %dl
         92418: 31 c2                   xor    %eax,%edx
         9241a: 83 f2 02                xor    $0x2,%edx
         9241d: f0 41 0f b1 10          lock cmpxchg %edx,(%r8)       
         92422: 75 ea                   jne    9240e
<__pthread_rwlock_unlock@GL
IBC_2.2.5+0x10e>

Reply via email to