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

    <tr>
        <th>Summary</th>
        <td>
            Dead branch instructions in Aarch64 atomic compare exchange
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:AArch64
      </td>
    </tr>

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

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

<pre>
    Some of our kernel developers pointed out an odd instruction sequence emited by clang. We're not sure why this strange branch sequence appears, since its basically a NOP. 

Godbolt: https://godbolt.org/z/T77qWvxW5

```cpp
#include <atomic>
#include <stdlib.h>

bool cmpxchg(std::atomic<uint32_t>& a, uint32_t& expected, uint32_t desired) {
    return a.compare_exchange_strong(expected, desired, std::memory_order_acq_rel);
}
```


```asm
cmpxchg(std::atomic<unsigned int>&, unsigned int&, unsigned int):
        ldr     w9, [x1]
.LBB0_1:
 ldaxr   w8, [x0]
        cmp     w8, w9
        b.ne    .LBB0_4
 stlxr   w10, w2, [x0]
        cbnz    w10, .LBB0_1
        mov     w0, #1 // <-- move 1 into W)
        tbz     w0, #0, .LBB0_5   // <-- branch if the 0th bit is zero (always false)
        b       .LBB0_6 // Always taken
.LBB0_4:
        mov     w0, wzr
 clrex
        tbnz    wzr, #0, .LBB0_6
.LBB0_5:
        str     w8, [x1]
.LBB0_6:
        ret
```

Does anyone know why this is emitted this way? We could find no reason that we'd want such a lowering.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJx8VE-P-yYQ_TTkMtoI43_JwQfvbtNL1VZqpT1GGGZjuhj8Axwn-fQVtvOv2zaKhDzz5g0Phse9VweDWJH8leTvKz6E1rpKaXvEXq0aK8_VH7ZDsJ9gBwdf6AxqkHhEbXt0HnqrTEAJdgjADVgpQRkf3CCCsgY8_hjQCATsVIQ1ZxCam8MaPpCw0iEYG8APDmFszxBa5cEHx80BoXHciPZOwfseufOEvYFXMaCCh4Z7JbjWZ-Dw62-_r4HQmtD6ZysbqwNJa2hD6D1Ja8J2hO0Oc2Jt3YGw3YWw3Z9l-ePjePrI50pS0Pkv-j5-slQZoQeJQNI3HmynBEl_-pbxQWrVrNslR-vGWg2i60-iPRC28UHGPaT1leJtUCakbB9iBSuAR123GCsATz2KgPIxDhK9cjG2BVK-EloDADgMgzPA18J2PXe4x5No4xHufXDWxPaPZDeON7jtqsPOuvPeOoluz8WPvUNN2JaksQcp3x8PZjmnhwj3HaH1_4o106DF4VgET7Ieo_8W2kaaWWT8aemmddxGKMlfTwnJ497Wv7y-0n2yoLXkpwgcN1cYnWFXHtH1M88EGLcPqWZtMK4zYxYzPuiZLqETnP0Xa2MucMdd93QHdPY4t53yhKUJzEMZB-jlJeYRkqjcwkcUfy8NzeW59KFFDvDMszwc9QmhRaChhUYFUB4u6CwQtuF65GcPn1x7fO7TLOvMXFx567kg8C80t-POni_nWd14cTEntMPTk47ljC7uu5DiRp0_U_vgHu7r270Xz2iH4fu4vlv0wM3ZGoQvY8e73Sg_mVN0p-l75GeS7uADQdhBS_hURoKx4JB7ayC0PMAYzUvCyE00L9ECB21HdMoc1itZpXKbbvkKq6TMtrRkaVGs2qqUBVLJykQiyzOUnG6ydMNTmrA8SYpmpSpGWU4LmrGEFbRYb8syzxhlm4SVZbYpSUax40qvtT520cJWyvsBqyRjm3yz0rxB7ScvZ6zh4gtNfId17URbZISxaPGuisUvzXDwJKNa-eDvdEEFjdU7cnkboruZe1AGaj6RwfyyYXEcuDrOanC6-ofjqtAOTfQmwnax07K89M7-hSIQtptUeMJ2i5Bjxf4OAAD__4mn8rc">