<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/96679>96679</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Switch clang-cl's sequential consistency reads and writes to match what the latest MSVC generates
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mcfi
</td>
</tr>
</table>
<pre>
Build the following code on Windows using clang-cl.
```
#include <atomic>
#include <iostream>
#include <thread>
#include <vector>
std::atomic<int> cnt = {0};
void f()
{
cnt.load(std::memory_order_seq_cst);
cnt.store(1, std::memory_order_seq_cst);
cnt.store(1, std::memory_order_release);
}
```
This was the code generated with `clang-cl -c -O2 --target=aarch64-pc-windows-msvc /FA`. Notice that five dmb ish barriers were inserted.
```
adrp x8, "?cnt@@3U?$atomic@H@std@@A"
mov w9, #1 // =0x1
ldr wzr, [x8, :lo12:"?cnt@@3U?$atomic@H@std@@A"]
dmb ish
dmb ish
str w9, [x8, :lo12:"?cnt@@3U?$atomic@H@std@@A"]
dmb ish
dmb ish
str w9, [x8, :lo12:"?cnt@@3U?$atomic@H@std@@A"]
ret
```
Below was the same source code compiled by VS2022 17.6+. As can be seen, acquire load was lowered to ldar and released store was stlr, both are one-way barriers that should be more performant than dmb ishs. In addition, the sequential consistency store was lowered to stlr + dmb, which is 2 instructions, while clang generates dmb + str + dmb, 3 instructions.
```
|void f(void)| PROC ; f
adrp x8,|std::atomic<int> cnt|
add x9,x8,|std::atomic<int> cnt|
ldar w8,[x9]
mov w8,#1
stlr w8,[x9]
dmb ish
stlr w8,[x9]
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcVs2O4zYTfBr60rBBkZI1OujgnzW-75BskE02xwVFti0GlOghKWsmTx-QljUzm_Vkk2MIQ7LVrOqmu6oh4b0-9Yg1Kbak2C_EEFrr6k4e9aKx6rneDtooCC3C0RpjR92fQFqFYHv4TffKjh4Gn54a0Z-W0qwI3RO6ma5rOn2uPxnXvTSDQiB8J4LttCT8w7eC2vrgUHR3wqF1KNSd4AVlsG4OwvXmgyJ8Q_jmlnen-0D4B5B9AML3QMotJeWe8O0b3MVqBUfCHgirpmzlbQdARK-MFYqwhzlDh511z1-sU-i-eHz8In2I6Jk5gnywDgl7yAjbwfdDp5TfgXZoUHh8jY7H-2Zj0vWXVnsYhU_9Tl0-YY9OBFQw6tACWdNbm2EpYfmRwXIZhDthIHwvhJPtOl-e5XK8SmPZ-YsEwg6HmHAFP9qgJUJoRYCjviCorgHtW2iEcxqdhxEdgu49uoBqdafWSih3JrR6eoiHJ4wRfpB9IDklOeW_En4gLJ-6nNP_kZzGPyhFN3H3jaazF0Krsbqy8AzuLsIOhB2iSuhTNuONchH_h0sExXaqh2-MzVhsyD-urNjP5KprCK20b9954oN7OcB_LL_D8I5Ut2jsOGvViw7B28HJSbfSdmdtUEHzDJ8_McoYZOVqTdh2BRsPUvTQIHjEPlYs5OOgHUK0ceI0NupQQbBglHAgegWTmxQk56VtPpjU-saGFoSLQxGXo3h-kXNSum_tYFRM2EXkGd3Ruk70IYb7mwf8Cv7fg1BKB21TWelk-DhgH7QwIG3vtQ_Yy-dXNbwqNZYDhG0jY8SPrZYtaA8sOiq4QUZmP4UMXkf27HGfKol4H97w8Dfwd-d7uZunZfwSR0-5g59-_ri7762vnMa3cHwZdXFFt0PSFil3701xUu6-RqqZ-Cmq9F-xJAlMa0wExfapmrV6C3X2Am-3MT7Nimtr_p4iNuC2Zp_dHiSOd8B_NcxC1VxVvBILrLMyq3jOKOeLtm6wLMqKFyU9HrPsQRyLjMrjuigzrMpSFQtdM8pyumZFVlHK2UqqvGJY5AUWuczyguQUO6HNyphLt7LutNDeD1hX63VZLYxo0Pj0UsFYjyOk4NXgC1dHzLIZTp7k1Ggf_AtL0MFg_WnUQbbzKwVhpb_nhPga4JNBR6ejiIOFTkT0GL0XPWSiuAP88Onz7kXsi8GZug3h7NOgiuP9pEM7NCtpO8IOsaLptjw7-zvKQNghncMTdrie81KzPwMAAP__l26mKg">