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

            Bug ID: 87237
           Summary: __atomic_load on 8-byte-sized, 1-byte-aligned struct
                    is not atomic
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: richard-gccbugzilla at metafoo dot co.uk
  Target Milestone: ---

It's my understanding that __atomic_load is supposed to work for an essentially
arbitrary TYPE, including the case where alignof(TYPE) < sizeof(TYPE). (From
the documentation, "The four non-arithmetic functions (load, store, exchange,
and compare_exchange) all have a generic version as well. This generic version
works on any data type.") However:

  struct A { char c[4]; } *p, *q;
  void f() { __atomic_load(p, q, 5); }

On x86_64, GCC emits f as a 'movl' from *p. That is not atomic if *p straddles
two cache lines.

libatomic's __atomic_load implementation gets this right, and falls back on a
mutex in the case where the source straddles two cache lines, but GCC doesn't
seem to realize it needs to call it.

Reply via email to