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