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