<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/86207>86207</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
riscv 64-bit popcount uses inefficient constant materialization
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
efriedma-quic
</td>
</tr>
</table>
<pre>
Consider:
```
int a(unsigned long long x) { return __builtin_popcountll(x); }
```
Targeting rv64, this generates:
```
a:
srli a1, a0, 1
lui a2, 349525
addiw a2, a2, 1365
slli a3, a2, 32
add a2, a2, a3
and a1, a1, a2
sub a0, a0, a1
lui a1, 209715
addiw a1, a1, 819
slli a2, a1, 32
add a1, a1, a2
and a2, a0, a1
srli a0, a0, 2
and a0, a0, a1
add a0, a0, a2
srli a1, a0, 4
add a0, a0, a1
lui a1, 61681
addiw a1, a1, -241
slli a2, a1, 32
add a1, a1, a2
and a0, a0, a1
lui a1, 4112
addiw a1, a1, 257
slli a2, a1, 32
add a1, a1, a2
mul a0, a0, a1
srli a0, a0, 56
ret
```
There are 4 constant integers involved in this computation: 0x5555555555555555, 0x3333333333333333, 0x0F0F0F0F0F0F0F0F, and 0x0101010101010101. The way we're materializing the constants is not efficient. In isolation, each of these takes 4 instructions to materialize, which I think is optimal... but the constants are related to each other. `0x3333333333333333 == (0x0F0F0F0F0F0F0F0F ^ (0x0F0F0F0F0F0F0F0F << 2))`. `0x5555555555555555 == (0x3333333333333333 ^ (0x3333333333333333 << 1))`. `0x0101010101010101 == (0x0F0F0F0F0F0F0F0F & (0x0F0F0F0F0F0F0F0F >> 3))`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVcuSmzoQ_Rp502VKSDzMgkVmPK7KPvspAW3QjSz5SsKe3K-_JWD8AHuSRYBqld2Hc043egjnZKsRS5K-kHS7Er3vjC1xbyU2B7H-t5f1qjLNr_LVaCcbtIR_I3RL6GfM6PQMP6X2IAjb9HrgbUAZ3Y7hg7ACSP4CFn1vNby_V71UXur3oznWptdeKcI2AUb4C5B8-1BhjD-EbdFL3YI9ZQlhr-A76aBFjVZ4dF-7FJc0TJezSoZRxIFL0BDje4jqJQgWEjwpUpbeZ0XTyHMYB8QYY57NUE5NMvyK4mzBNI43TILPMHrCjHbjCXmv1VdTIVN8UM-Vg9Eij5_VdKOyiYsnJbEr6GlJj-xeamHPvV4-z009c41Pmi9Kvvi4xczb9mAmJEuaP-9sFmebpY9FY9csmRf91zr7x16TOF4KLKyyNP_LTg-9-q3TR3MgzSaMRf_VbtGhRRAWIYHaaOeF9iC1xxatA6lPRp2wAanHXaQ2h2PvhZdGE_4N6Ec6u4I0_eCza_yX7u7vwaxuQia-vyMA-NEhnMUvOCNhuUU4CI9WCiX_C3ub7_Di14F0oI0H3O9lLVH7CL5rkM6o0Sl7BRR1B2Yf3nMIXvxEBwlI7bzt6wBy4M2NBoaXzp2sO_geStc_g4g5enkQKooiqHo_MxGaaFEJj03gGhV9hzYCktFlU4DwLeFbIGyz7A2Q9O1Zhr8SHhY5K8KT0Yl__inu-Jfin_wPbA388Zx__pF-459lT_2_Ef4G_Mq_akreFLwQKyzjPI5pusnTbNWVWHPMi7TexAnnDU0rwVKOWPF9kTS0yFeyZJQllLOYMZqmWUSbhgpW7AWvsMJNQxKKByFVpNTpEBnbrqRzPZabjNF8pUSFyg0nPGMazzAkCWPhwLdleGdd9a0jCVXSeXdl8dIrLK109QmyZF1JD59nNfQOw9K5zMbrwrrOr2Firnqrys7743Aosx1hu1b6rq-i2hwI2wW1aVgfrfkHa0_YbvDoCNsNNfwfAAD___bQPbE">