<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59597>59597</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AArch64] Redundant zero-extension in 32-bit popcount expansion
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AArch64,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
SamTebbs33
</td>
</tr>
</table>
<pre>
```
#include <stdint.h>
uint32_t
foo (uint32_t a)
{
return __builtin_popcount (a);
}
```
LLVM at -O2 gives:
```
foo: // @foo
mov w8, w0
fmov d0, x8
cnt v0.8b, v0.8b
uaddlv h0, v0.8b
fmov w0, s0
ret
```
The first MOV can be avoided by doing a 32-bit FMOV like GCC does:
```
foo:
fmov s0, w0
cnt v0.8b, v0.8b
addv b0, v0.8b
fmov w0, s0
ret
```
https://godbolt.org/z/GPre1d6Ge
This could be caused by `AArch64ISelLowering::LowerCTPOP_PARITY` emitting a 64-bit zero extension which is then bitcasted.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVFtvozgU_jXm5SiRMYHAAw80WaqROmo1E420T5Evh-AdsCNskk5__QpDdpRuq9Ui5Ms537l8nzHcOX0yiCVJH0i6j_joWzuU33l_QCFckkTCql8lyejy0j2hFWGJNrIbFQJJds4rbfy6JckfizuMozY-YUc_7xprgbD8ZgROWLGgtw_zAmBAPw4Gjkcx6s5rczzbs7Sj8VNoiEgebkH7ZfGuszA-Pf34CtzD6pnBSV_QkaT6EN5YS5IKCKsJq4Fs6GRYmpmf3l7CfM0J28F1iYNmsSs6mV_z-yBpfJgvdJ2LCTAv7jAjV6q7ALT0E8CtxDUAHL33Dug_ZHRoERo9OA9fn3-A5AYEAr9YrVCB-AXKanMCDglbCe2hnlCd_onwuNuBsv8l1QctOnqnzP-QgCsVGIp_SfAJ989It96fQ-PhHE9WCdv5tR1OhNVvhNWPLwPGKnvEm0bagbRjpyZxJB_drA3JaFUNss02X75j92SvOGhzmvImVdjtDi_PL8eX6tuXw58ko4C99n7WM9sEPd9wsICvHo3T1sC11bIF7cC3aEBoL7nzqNZzH5EqE1UkBY-wjLNtvNnSbZ5HbYmSZ4JtG9ZsZByzWKaxyCWNFRUMi7SJdMkoYzGLi3jLMpavC5oJVFLxRhRFiinZUOy57tZdd-knJSLt3IhlWqTFNuq4wM6FO8-Y4PInGkWSaiFPGCNsRxjrtXOoVvbsda_fuNfWTL50Hw3llHclxpMjG9pp593vSl77LvxQbvnSPXxDNRrFzazQ6rdC2tw-xX_uOr6eeXBG49CV785W-3YUa2l7wuqp4jKtzoP9C6UnrA5EHWF14Pp3AAAA__8Al2J3">