<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">