[Bug tree-optimization/66713] atomic compare_exchange_strong creates spurious store for x86-64 at -O3
pinskia at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Jul 1 06:06:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66713
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
#include <atomic>
float *ptr;
std::atomic<float*> aptr;
template <typename T>
T cas_original (T cmp_, T val_) {
T old;
__asm volatile(
"lock; cmpxchgq %2, %3"
: "=a" (old), "=m" (ptr)
: "r" (val_), "m" (ptr), "0" (cmp_)
: "cc"
);
return old;
}
template <typename T>
T cas_atomic( T cmp_, T val_) {
aptr.compare_exchange_strong(cmp_, val_, std::memory_order_acq_rel);
return cmp_;
}
void driver_original(float *a, float *b) {
cas_original(a, b);
}
void driver_atomic(float *a, float *b) {
cas_atomic(a, b);
}
More information about the Gcc-bugs
mailing list