http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55561
--- Comment #29 from Dmitry Vyukov <dvyukov at google dot com> 2013-01-02 09:09:11 UTC --- (In reply to comment #28) > (In reply to comment #26) > > For config/linux/ptrlock the changes are: > > [...] > > Following your suggestions, I applied the following patch (mistakes are mine), > which allows me to run without warnings from libgomp: > > Index: config/linux/wait.h > =================================================================== > --- config/linux/wait.h (revision 194730) > +++ config/linux/wait.h (working copy) > @@ -51,7 +51,7 @@ > if (__builtin_expect (gomp_managed_threads > gomp_available_cpus, 0)) > count = gomp_throttled_spin_count_var; > for (i = 0; i < count; i++) > - if (__builtin_expect (*addr != val, 0)) > + if (__builtin_expect (__atomic_load_n(addr,MEMMODEL_RELAXED) != val, 0)) > return 0; > else > cpu_relax (); > Index: config/linux/ptrlock.c > =================================================================== > --- config/linux/ptrlock.c (revision 194730) > +++ config/linux/ptrlock.c (working copy) > @@ -50,9 +50,9 @@ > #endif > do > do_wait (intptr, 2); > - while (*intptr == 2); > + while (__atomic_load_n(intptr, MEMMODEL_RELAXED) == 2); > __asm volatile ("" : : : "memory"); > - return *ptrlock; > + return (void*)__atomic_load_n(ptrlock, MEMMODEL_ACQUIRE); > } > > void > Index: config/linux/ptrlock.h > =================================================================== > --- config/linux/ptrlock.h (revision 194730) > +++ config/linux/ptrlock.h (working copy) > @@ -48,8 +48,9 @@ > { > uintptr_t oldval; > > - if ((uintptr_t) *ptrlock > 2) > - return *ptrlock; > + uintptr_t v = (uintptr_t)__atomic_load_n(ptrlock, MEMMODEL_ACQUIRE); > + if (v > 2) > + return (void*)v; > > oldval = 0; > if (__atomic_compare_exchange_n (ptrlock, &oldval, 1, false, Great! Please post the patch to http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40362 I believe it is the correct fix for the bug.