https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102566
--- Comment #37 from H.J. Lu <hjl.tools at gmail dot com> --- It is if ((__atomic_fetch_xor_4 ((volatile void *) a, (unsigned int) (1 << bit), 0) & (unsigned int) (1 << bit)) != 0) vs if ((__atomic_fetch_xor_4 ((volatile void *) a, 1 << bit, 0) >> bit & 1) != 0) Why does GCC generate the second one?