MaxGraey edited issue #3262:
Feature
This is fairly common pattern that generates LLVM-based languages for power of two code (
x != 0 & (x & (x - 1) == 0=>popcnt(x) == 1). This is a pretty compact and fast representation, but not for platforms which don't supportpopcntinstructions, such as armv8 or x86 before Nehalem architecture. AArch64 could also benefit from this.Benefit
https://godbolt.org/z/dM4fqvozn
Implementation
During lowering I propose lower
popcnt(x) == 1pattern to(x != 0) & ((x & (x - 1) == 0)for some archs.
MaxGraey edited issue #3262:
Feature
This is fairly common pattern that generates by LLVM-based languages for power of two code (
x != 0 & (x & (x - 1) == 0=>popcnt(x) == 1). This is a pretty compact and fast representation, but not for platforms which don't supportpopcntinstructions, such as armv8 or x86 before Nehalem architecture. AArch64 could also benefit from this.Benefit
https://godbolt.org/z/dM4fqvozn
Implementation
During lowering I propose lower
popcnt(x) == 1pattern to(x != 0) & ((x & (x - 1) == 0)for some archs.
MaxGraey edited issue #3262:
Feature
This is fairly common pattern that generates by LLVM-based languages for power of two code
(x != 0 & (x & (x - 1) == 0=>popcnt(x) == 1). This is a pretty compact and fast representation, but not for platforms which don't supportpopcntinstructions, such as armv8 or x86 before Nehalem architecture. AArch64 could also benefit from this.Benefit
https://godbolt.org/z/dM4fqvozn
Implementation
During lowering I propose lower
popcnt(x) == 1pattern to(x != 0) & ((x & (x - 1) == 0)for some archs.
Last updated: Dec 13 2025 at 19:03 UTC