<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/129805>129805</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Failure to spot `popcount` idiom
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            missed-optimization
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Kmeakin
      </td>
    </tr>
</table>

<pre>
    LLVM does a valiant effort of unrolling and vectorizing these loops, but they're really just `popcount` and it should recognize them as such

```c++
#include <stdint.h>

using u8 = uint8_t;
using u16 = uint16_t;
using u32 = uint32_t;
using u64 = uint64_t;

template <typename T>
auto src(T x) -> u64 {
    u64 count = 0;
    for (u64 i = 0; i < sizeof(T) * 8; i++) {
        if (x & ((u64)1 << i)) {
 count++;
        }
    }
    return count;
}

template <typename T>
auto tgt(T x) -> u64 {
    return __builtin_popcountg(x);
}

extern "C" {
auto src8(u8 x) -> u64 { return src(x); }
auto src16(u8 x) -> u64 { return src(x); }
auto src32(u8 x) -> u64 { return src(x); }
auto src64(u8 x) -> u64 { return src(x); }

auto tgt8(u8 x) -> u64 { return tgt(x); }
auto tgt16(u8 x) -> u64 { return tgt(x); }
auto tgt32(u8 x) -> u64 { return tgt(x); }
auto tgt64(u8 x) -> u64 { return tgt(x); }
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyklF1vozgUhn_N4eaokTlO-LjgIm0nNzt7N9rbyoAhnjUY4eOq7a9fGUjanRk1u5rICjav3ud8ISvvTT9qXcHhHg6PiQp8dnP1x6DV32ZMate-Vl-__vUntk57VPisrFEjo-46NzO6DsM4O2vN2KMaW3zWDbvZvMUzn7XXaJ2bPNAD1oHjq1egfNY4a2XtK34PnhEyMbmpcWFkyMTCMYz-7IJtcdaN60fzpqN5QOXRh-YM4hhXJtbVAN3HJY5A0oyNDa1GkA-eWzPy7gzyy-oIPmYWCgT5iMGMXDwxyPt3Jc2uUpr9oEm6apJ-0LL9Vcv2Fw3EkfUwWcVLNvw66VENGr-t-ajADv3cABXf8AWoxDuQX1ZWHv2IuJyW1ix8sYKj0LkZgYqom6u2bB_QmzftusiNVKAjFou4tSm-uwaIP9NF1AsCZXGzYoHKNNIi0ACVH2zrrFaY_AiC_HE7ve9mzWEeN8_al0X7L93hnj_tzsZ-eqqDsWzGp8uH1Md6YtL_DqhfWM8jAtEDEG2gyxyWuoufY12irKPaqFuBF2-a_YZZ0m-Y46D-t_lDf29VvY7gF7G555tVf2a-WfVn5ptV_8q8_V9ujaStZFvKUiW6SvN9mso9CUrOlc6KulFlmZVd0dVl2ipZ5nkmsjzrtKzLxFQk6CCkOAhBkmgn8q7rZKtkXbRN3gjYCz0oY3fWPg87N_eJ8T7oKqWyEIfEqlpbv1y6RIPxXrd3bmIzmDfFxo1AFG_juYr2uzr0HvbCGs_-HciGra5Oytgwa4zfwuR-uktNa9yQhNlWZ-bJgzwCnYBOveFzqHeNG4BOEbk97qbZfdcNA52WhD3Qacv5uaJ_AgAA___n_Mbq">