<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/75081>75081</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
`is_always_lock_free` Returns Incorrect Value For 128 Bit Struct On ARM64
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
insertinterestingnamehere
</td>
</tr>
</table>
<pre>
With clang 17.1 on ARM64 I'm seeing `std::atomic<T>::is_always_lock_free` evaluate to `true` even though the member function `std::atomic<T>::is_lock_free()` evaluates to `false` for the same type.
Here's a minimal example:
```C++
#include <atomic>
#include <cstdint>
#include <iostream>
struct bigint_equiv {
uint64_t first, second;
};
int main() {
std::atomic<bigint_equiv> a;
std::cout << a.is_lock_free() << " " << decltype(a)::is_always_lock_free << std::endl;
}
```
Possibly related: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70814 where the gcc devs discuss why libatomic doesn't allow 128 bit atomics to be lock-free on ARM.
When I compile the same code with gcc 13.2 `is_always_lock_free` is `false` which is strange since I've confirmed that the same libstdc++ is being included and linked. This also appears to be what happens on godbolt too though. With gcc the assembly (as best I can tell) shows a 0 being written out (https://godbolt.org/z/T7493K8xP) while with clang the assembly shows a 1 (https://godbolt.org/z/Gb35jMfjr).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVVtv2zgT_TX0yyCCRPr6oIfc_H3BotiiG2weDYoaSUwp0ssZRU1__YKSXSftBigg0_YMdc5czpCayLYesRSrG7G6W-iBuxBL6wkjW88Ykdj61useO4y4qEL9Wj5Z7sA47VsoNlkBwcP1l0_rJTwIuemBEK1vQaxz4lqoa6GuNYfeGqFuH4W6n02WDtqN-pUOLpivhyYiinUO-KLdoBmBQ0LgOJzM6IG7MLQdcIfQY19hhGbwhm3wv0F2YZFbIXdvuehE1mhHE1sT4sRCukfg1yNmIr8T-fW8_h8jCrkh0NBbb3vtAL_p_ugwkb3ZKNb5_NwKeZOe2SqV9cYNNYJQt-dg7__LaYhr6_kDrw3EEXV_cU8rcRwMQ2Vb6_mA_wz2BcTmRA4wWM_r5YGhsZFYyFsgNMHXQp3j29xdfk-r9Qy9tn6u3BuwX0v-llWoe9A_oOCy24SBUwJC3YLOfu3N2SeknD_z3xqNS80QcqtTBz-S0Xn_Dz70tXuX3vvuvE31cyCylXuFiE4zJgDomI-UkOReyH1rTNb6IQuxFXJfDe1365wWck9dGA_V0GamtULtbS3U3SbfFksY0-hMgmqNgRpfCGpLZiCCsXsFZ6u5flAHJC_khkE7F0Yo5BYqyzC7J5lWCCnRqynRefDeifOpQw8PYEJ_tA4vKjahRhjT4KYYCpXJpPgPhtDSu3EYO2u6ZCSO2rcIZL3BadpfErJvbOyxBu40XxidrYhrM0s_vV1Nx8JJwDVoX4Oz_ivWGTx2lkA7CqCPR9TxnOqYELtk85SybUNdBcfAIZxOgwyezkklZk2EfepfEkmiJE7V0B4YnUvaSm1Ko5uf4hmjZUYPkybl9qdmz3ynZn8Xcv-4We7UH9tvnxPW2KUaj5fj8F0IZ6bid3D_V6nV86fmOQq5yxZ1qeqd2ukFlsUml6rYbbarRVeu8sasZNNsm-WqkEar5VrVjaoUVrvcKFzYUqbtsiiKrVrLVVbrppJarrdS6mapjVjm2GvrMude-sS_sEQDlptVvi0WTlfoaLoNpPQ4wuQUUqbLIZbpnatqaEksc2eJ6YLClh2WH0vqC_IQPcGDNyFGNAx_azcg7EOcZH5jGf6aT64_T9fJYoiu_Klulruhykzohdwn7tPX1TGGZzQs5H6KmITcTxn9GwAA__-N8Srt">