https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102566
--- Comment #36 from H.J. Lu <hjl.tools at gmail dot com> --- (1 << (x)) works, but (((unsigned int) 1) << (x)) doesn't work: [hjl@gnu-skx-1 gcc]$ cat bar.c void bar (void); #define MASK1(x) (1 << (x)) void f1 (unsigned int *a, unsigned int bit) { if ((__atomic_fetch_xor (a, MASK1 (bit), __ATOMIC_RELAXED) & MASK1 (bit))) bar (); } #define MASK2(x) (((unsigned int) 1) << (x)) void f2 (unsigned int *a, unsigned int bit) { if ((__atomic_fetch_xor (a, MASK2 (bit), __ATOMIC_RELAXED) & MASK2 (bit))) bar (); } [hjl@gnu-skx-1 gcc]$ ./xgcc -B./ -S -O2 bar.c [hjl@gnu-skx-1 gcc]$ cat bar.s .file "bar.c" .text .p2align 4 .globl f1 .type f1, @function f1: .LFB0: .cfi_startproc lock btcl %esi, (%rdi) jc .L4 ret .p2align 4,,10 .p2align 3 .L4: jmp bar .cfi_endproc .LFE0: .size f1, .-f1 .p2align 4 .globl f2 .type f2, @function f2: .LFB1: .cfi_startproc movl %esi, %ecx movl $1, %edx movl (%rdi), %eax sall %cl, %edx .L6: movl %eax, %r8d movl %eax, %esi xorl %edx, %r8d lock cmpxchgl %r8d, (%rdi) jne .L6 btl %ecx, %esi jc .L10 ret .p2align 4,,10 .p2align 3 .L10: jmp bar .cfi_endproc .LFE1: .size f2, .-f2 .ident "GCC: (GNU) 13.0.1 20230118 (experimental)" .section .note.GNU-stack,"",@progbits [hjl@gnu-skx-1 gcc]$