Issue 158860
Summary After Atomic Acquire, shouldn't we re-read previously read objects (if source code re-reads them) ?
Labels new issue
Assignees
Reporter DoctorNoobingstoneIPresume
    Dear Programmers of Clang,

```c++
#include <atomic>

int ButWeAcquire (const int *pt)
{
    const std::atomic <int> *const pat {static_cast <const std::atomic <int> *> (static_cast <const void *> (pt))};
    static_assert (sizeof *pat == sizeof *pt);

    const T t0 {*pt};
    const T t1 {*pat};
    const T t2 {*pt};

    return t0 + t1 - t2;
}
```

Clang (but not GCC) seems to optimize away the last load operation (for `t2`):

https://godbolt.org/z/3resvraz9:
Compiling with `-D'NDEBUG' -f'strict-aliasing' -O2 -g` results in:

```
ButWeAcquire(int const*):
        mov     eax, dword ptr [rdi]
        mov     ecx, dword ptr [rdi]
        ret
```

or, for armv7-a:

```
ButWeAcquire(int const*):
        ldr     r1, [r0]
        ldr     r0, [r0]
        mov r2, #0
        mov     r0, r1
        mcr     p15, #0, r2, c7, c10, #5
 bx      lr
```

or, for armv8-a:

```
ButWeAcquire(int const*):
 ldr     w8, [x0]
        ldar    wzr, [x0]
        mov     w0, w8
 ret
```

For me it would appear that the loading for `t1` should Acquire effects by another thread which performs Release on the same memory address,

and those effects might include stores by that other thread to `*pt` (well, to the same memory address).

I am wrong somewhere, am I not ?

Maybe I should have written not "... Release on the same memory address", but rather "... Release on the same atomic object", and the atomic object is not shared with any other piece of code, please ?

Or is this really a bug ?

Thank you !!
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to