https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94800
Bug ID: 94800 Summary: Failure to optimize yet another popcount idiom Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: gabravier at gmail dot com Target Milestone: --- int populationCount(uint32_t x) { x = x - ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0F0F0F0F; x += (x << 8); return ((x + (x << 16)) >> 24); } This can be optimized to `__builtin_popcount(x)` (when `sizeof(int) == sizeof(uint32_t)`). This transformation is done by LLVM, but not by GCC Comparison here : https://godbolt.org/z/iz9qJf