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

            Bug ID: 116415
           Summary: [13 Regression][PPC64LE] atomics wrongly use vector
                    instructions in DWCAS.
           Product: gcc
           Version: 13.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: torsten.mandel at sap dot com
  Target Milestone: ---

Using g++ 13.2.1 the subsequently following code produces this output:

2 1

instead of g++ 11.3.0:

1 2

on a Power 64 LE machine.


CODE:

#include <iostream>
#include <atomic>

using ::std::memory_order_seq_cst;
using ::std::memory_order_acquire;

struct DblCnt {
        union Value {
                struct {
                        uint64_t a;
                        uint64_t b;
                } t;
                __uint128_t raw_data;
        } value;

        inline void atomic_inc(const uint64_t delta1, const uint64_t &delta2)
noexcept {
                Value cur;
                cur.raw_data = const_cast<__uint128_t&>(value.raw_data);
                for (;;) {
                        Value next;
                        next.t.a = cur.t.a+delta1;
                        next.t.b = cur.t.b+delta2;
                        if (__atomic_compare_exchange(&value.raw_data,
&cur.raw_data, &next.raw_data, false, __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE))
break;
                }

        }
        DblCnt() : value() {}
};

int main() {
        uint64_t i(1),j(2);
        DblCnt c;
        c.atomic_inc(i,j);
        std::cout << c.value.t.a << " " << c.value.t.b << std::endl;
}


Compile with: g++ -O2 -Werror -Wall -o dwcas -latomic ./test.cpp

Reply via email to