[Bug c++/103966] New: std::atomic relaxed load, inc, store sub-optimal codegen

witold.baryluk+gcc at gmail dot com gcc-bugzilla@gcc.gnu.org
Mon Jan 10 15:51:11 GMT 2022


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103966

            Bug ID: 103966
           Summary: std::atomic relaxed load, inc, store sub-optimal
                    codegen
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: witold.baryluk+gcc at gmail dot com
  Target Milestone: ---

Both functions below, should compile to the same assembly on x86:

#include <atomic>
#include <cstdint>

uint64_t x;
void inc_a() {
    x++;
}

std::atomic<uint64_t> y;

void inc_b_non_atomic() {
    y.store(y.load(std::memory_order_relaxed) + 1, std::memory_order_relaxed);
}


and it does so in clang.

It does not in gcc 12 (and earlier).

https://godbolt.org/z/GcM67xz8T



This pattern is very popular in approximate statistical counters / metrics,
where the flow of information is unidirectional (i.e. from one thread that does
updates, to another thread that only reads the counters), and its performance
is critical in many codebases.


More information about the Gcc-bugs mailing list