https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85610
Bug ID: 85610 Summary: Unable to optimize away mov followed by compare into a cmpb in case of atomic_load Product: gcc Version: tree-ssa Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: hiraditya at msn dot com Target Milestone: --- $ cat test.cpp #include <atomic> std::atomic<bool> flag_atomic{false}; extern void f1(); extern void f2(); void foo() { bool b = flag_atomic.load(std::memory_order_relaxed); if (b == false) { f1(); } else { f2(); } } $ g++-7 -O3 -S -o - test.cpp -std=c++14 __Z3foov: LFB342: movzbl _flag_atomic(%rip), %eax testb %al, %al je L4 jmp __Z2f2v .align 4,0x90 L4: jmp __Z2f1v We could just use `cmpb $0, _flag_atomic(%rip)` and avoid a register in this case. When _flag_atomic is a scalar boolean global variable, that's what happens.