https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91502
Bug ID: 91502 Summary: suboptimal atomic_fetch_sub and atomic_fetch_add Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: nruslan_devel at yahoo dot com Target Milestone: --- I have not specified the gcc version; it seems like it applies to any version. I have noticed that if I write code: #include <stdatomic.h> int func(_Atomic(int) *a) { return (atomic_fetch_sub(a, 1) - 1 == 0); } gcc generates optimized code (gcc -O2): func: .LFB0: .cfi_startproc xorl %eax, %eax lock subl $1, (%rdi) sete %al ret But when I change the condition to <= 0, it does not work. Correct me if I am wrong, but, I think, it should still be able to use sub: #include <stdatomic.h> int func(_Atomic(int) *a) { return (atomic_fetch_sub(a, 1) - 1 <= 0); } func: .LFB0: .cfi_startproc movl $-1, %eax lock xaddl %eax, (%rdi) cmpl $1, %eax setle %al movzbl %al, %eax ret Seems like the same problem exists for atomic_fetch_add as well.