4 ms·
LLVM has a LoopIdiomRecognize pass which will, amongst other patterns, try to detect a loop implementing popcount [1] and convert it to the llvm.ctpop.* intrins
by asb 3y ago
LLVM has a LoopIdiomRecognize pass which will, amongst other patterns, try to detect a loop implementing popcount [1] and convert it to the llvm.ctpop.* intrinsic [2]. I've not looked at why it's not matching this loop, but the sibling comment suggesting to just use `.count_ones` seems like the right answer for Rust. In C or C++ I'd strongly recommend using `__builtin_popcount` (provided by both Clang and GCC).
[1]: https://github.com/llvm/llvm-project/blob/08a6968127f04a40d767bf3fe296bc36667c89eb/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp#L1557 https://github.com/llvm/llvm-project/blob/08a6968127f04a40d7...
[2]: https://llvm.org/docs/LangRef.html#llvm-ctpop-intrinsic https://llvm.org/docs/LangRef.html#llvm-ctpop-intrinsic