http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59194
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Because CPUs obviously don't have floating point atomic instructions, what the compiler does is just load it as an integer, view convert to floating point, perform arithmetics, view convert result back to integer, and compare and swap (if unsuccessful loop). I bet tsan complains because the load is not atomic, but does it really matter? If we read garbage there, compare and swap will fail and next time we'll have hopefully correct value already from what compare and swap said was the previous value.