<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/55917>55917</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Toggling an atomic_bool with ^= is inefficient
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
josephcsible
</td>
</tr>
</table>
<pre>
Consider this C code:
```c
#include <stdatomic.h>
atomic_bool b;
atomic_char c;
_Bool b2;
void f1(void) {
b ^= 1;
}
void f2(void) {
atomic_fetch_xor(&b, 1);
}
void f3(void) {
c ^= 1;
}
void f4(void) {
atomic_fetch_xor(&c, 1);
}
void f5(void) {
b2 ^= 1;
}
```
At `-O3`, those functions compile into this:
```asm
f1: # @f1
movb b(%rip), %al
.LBB0_1: # =>This Inner Loop Header: Depth=1
andb $1, %al
movl %eax, %ecx
xorb $1, %cl
lock cmpxchgb %cl, b(%rip)
jne .LBB0_1
retq
f2: # @f2
lock xorb $1, b(%rip)
retq
f3: # @f3
lock xorb $1, c(%rip)
retq
f4: # @f4
lock xorb $1, c(%rip)
retq
f5: # @f5
xorb $1, b2(%rip)
retq
```
The code generated for `f1` is inefficient. It should have generated the same code as it did for `f2`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1lU2PmzAQhn-NuViLiI1DOHDYhK260kq97D0ytgPeGkyxSdN_3wGSzccqaXKohcAf49ePPeOhsPJPtrKN01J12Ffa4RUWVipEn1GUo-gZzaPpEfs2oboRppcKI7pyXnJvay3CCtGXvcX4nrrXhbUGF4guz3pFxTssPnvXy9GKfHZM763VEm9miCyGGiIpRsneAEMpMGIviOZ4dpyX5F8FyDWBPcxGeVGtd7YDO0TmBSIrkCTpbVV6TVXciRU_hiXuw2JXT4vc4jo4eWo-ewz1px906IFlfWWdwpu-EV5DrECA1K02CuvG2zFovkYLd_XUA_6jI8A_C0QWRnEEEz6hh1LbbTFuYDwH1ul2OASgggY3k234tlxG63tWGhehOQTr-xDsr00Dcf9mbYu_Kw53YJDIVeshnPMLEN7IYpKIZxfrn7CayYQpvtsbKbE7twKfXgqJCyFjxc9TbFG3O1GVxXEbwxSYe34qZxofjRq_h8M5G-yU_7V3EHnUQeQ26-X2biCeUNBHKehjFOIuivhRivh_ULBHKdjtACvIPcteJIH3So1_AlwquCPcK8guthsSA9zQeYTh9uhGbTZaaNX4EL967CrbG4krvj2d5UHI8XqvxmGax1If1Qi8wkBmVKY05YHX3qjs3Zal0U0Jtw6f_kp-a18dEtk5QdB3Jqu8b8dsRL7BU4JxX4SQrqBhzPbweWo7-6GEh6Z2rlcOKoylsySoMiIWCWdpOk_EImUpjYWcx5FKgW0mRSICwwtlXIbYErE80BmJCInmUTKLGRiGKeOsIHQhZRoljMfgHlVzbcJh4dB2ZdBlI0PRlw4GjXbeHQe5c7pslDro8x6Sb5d9QAJuK-F0YVQwMmcj8F9xmfV4">