http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59968
--- Comment #12 from H.J. Lu <hjl.tools at gmail dot com> --- For int bar1; void __attribute__((noinline)) foo1 (int y) { int z; if (!(bar1 & (1 << y))) xxx1 (); z = bar1 & (1 << y); bar1 |= 1 << y; bar1 &= ~z; } we generate movl bar1(%rip), %edx pushq %rbx .cfi_def_cfa_offset 16 .cfi_offset 3, -16 movl %edi, %ebx btl %edi, %edx jc .L3 call xxx1 movl bar1(%rip), %edx .L3: movl %ebx, %ecx movl $1, %eax sall %cl, %eax movl %edx, %ecx andl %eax, %ecx orl %edx, %eax notl %ecx andl %ecx, %eax movl %eax, bar1(%rip) popq %rbx .cfi_def_cfa_offset 8 ret I expect btc %edi, bar2(%rip) jc .L7 jmp xxx2 .L8: .p2align 4,,10 .p2align 3 .L7: rep ret