<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/62445>62445</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang-cl -march=armv8-a doesn't generate a dmb for InterlockedExchangeAdd
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          mcfi
      </td>
    </tr>
</table>

<pre>
    Compile the following code using clang-cl /O2 -march=armv8-a /FA
```
#include <windows.h>
#include <intrin.h>

void foo(void)
{
    volatile LONG i = 0;
    InterlockedExchangeAdd(&i, 1);
}
```
the following code will be generated:
```
foo: // @foo
.seh_proc foo
// %bb.0:
    sub sp, sp, #32
    str x30, [sp, #16]                  // 8-byte Folded Spill
    adrp    x9, __security_cookie
    add x8, sp, #4
    ldr x9, [x9, :lo12:__security_cookie]
    str x9, [sp, #8]
    str wzr, [sp, #4]
.LBB0_1:                                // =>This Inner Loop Header: Depth=1
    ldaxr   w9, [x8]
    add w9, w9, #1
    stlxr   w10, w9, [x8]
    cbnz    w10, .LBB0_1
```
Note that no dmb instruction was added behind the cbnz instruction. For comparison, please see MSVC code gen on [CompilerExplorer](https://godbolt.org/z/xbqervP6M). Also, the documented behavior of [InterlockedExchangeAdd](https://learn.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-interlockedexchangeadd) clearly states that "This function generates a full memory barrier (or fence) to ensure that memory operations are completed in order."

There are also other Interlocked* APIs without Acquire/Release/_nf suffices. All of them by default should generate a full fence on Arm/Arm64.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyEVV1vozoT_jXOzSgIbJKGi1zQprzvSvuls6tzWxk8BJ81HtY2Tbq__siEpNk2qxNFMDAPM_PMl6X3em8Rt2x1z1a7hRxDR27bN61e1KRetg_UD9oghA6hJWPooO0eGlIIo59EI-1-2RhgvPrCYdlL13RM7KTrnzdLGV9XJUt3LC3ZOp3_p0cutG3MqBCYeDhoq-jgk46Jx1t6bYPT9lo9XZ9JK2iJGN9EkfFi1t7dnwQAgGcyMkQWH798_h9oYGIHKRNXiA82oDPU_ED1eGw6afdYKsX4hvG1ZvwBsmj5_AW7291kdCNJB20M1Ah7tOhkQMXE7WxEDqKM6WK8Apan8cWkSTx2T4OjBi6vzii-quskvZiMTPxYgx9iyKcr40LwK3VwcBTppFndXyDZmq128O43-9ks65eAUJFRqODboI15tSiVG-L9WERbT08em9Hp8PLUEP3QeA1UcNz8Fln-qjXKzSbY6n4WRGko40yU762udm84FW8pbd5hDr_cW1B-ASUf7-_TpyzW4D9-5-SLHROP3zvt4YO16OAj0QD_R6nQRSs7HEIchOyaozw6ADhceP4eZMzQSTcjuMiuKZjT11l6BXlnpKntL3iFnXnd6rnPFOJkywCWQPU1aOuDG5ugycJB-hgQKqix01ZNK2AyfoVKoCIHDfWDdNqTjR4Hg9IjeET49O3vh9Mc7NEC2RjuvFHc43Ew5NDF4PmmC2HwsZGn5O5J1WRCQm7PePWL8epY_0T3_HX9ifEigdJ4iq5iSIqasUcbToHKZ00OqI2e_jDUN_wZlM4mvW4ceWpD0lDPeIV2OXrGq3k1nSTBGa_koE9PNjBe2XY5iUv96hBnhzJukQKa6MG8gA8yoD_lnHE-dU872lPGzzvCg4R2NAZ67Mm9QC2d0-iA8Q05aNE2GG0GArR-dHMJZzAN0YYm60E6nEpjMCZHWyCn0CWM8-sN-r1DhxNWGk9AoUN3vQ8ZL6H8-sHDQYeOxgBl83PUDhmv_sKp1IxXT7YFP7atbtDH8phYgtBhD_ULKGzlaAL4jkajLjTPLCdCsTlKF7Neun6dJwu1FaoQhVzgNltv-F2e36XFotvyQqyzbJ3nGcd1KjFtVVa3hagVX0klxEJvecpFmvMiXaWrtEgyrrBVa9HwO6XSvGZ5ir3UJjHmuY8tttDej7hd8zxfLYys0fjzeei2EbSsx71neWq0D_71s6CDwe3lAHx39ClCbxm_C9eU45i15P5w4ixGZ7ZvZkGHbqznloy-59tycPQPNrEBp_hjf04U_g0AAP__0eha7Q">