https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121148
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |uros at gcc dot gnu.org --- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- Similarly, the i386 code in config/cpu/i386/atomicity.h uses assembly for a spinlock, but does a plain signed addition, so needs a fix: register _Atomic_word __result, __tmp = 1; // Obtain the atomic exchange/add spin lock. do { __asm__ __volatile__ ("xchg{l} {%0,%1|%1,%0}" : "=m" (_Atomicity_lock<0>::_S_atomicity_lock), "+r" (__tmp) : "m" (_Atomicity_lock<0>::_S_atomicity_lock)); } while (__tmp); __result = *__mem; *__mem += __val; // Release spin lock. _Atomicity_lock<0>::_S_atomicity_lock = 0; The i486 code in config/cpu/i486/atomicity.h looks OK already, XADD should wrap with no UB: register _Atomic_word __result; __asm__ __volatile__ ("lock; xadd{l} {%0,%1|%1,%0}" : "=r" (__result), "=m" (*__mem) : "0" (__val), "m" (*__mem));