[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