https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71336
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I guess it could be useful even without lea. Consider: int test2 (int a) { return (a & 4) ? 385600 : 123456; } We emit: andl $4, %edi cmpl $1, %edi sbbl %eax, %eax andl $-262144, %eax addl $385600, %eax We could change that to e.g. andl $4, %edi shll $16, %edi movl %edi, %eax orl $123456, %eax All we care is that the comparison against zero has the other operand that has at most one bit set in it (and we know which one, i.e. nonzero_bits must be power of two), and that the diff in between the two values has also exactly one bit set.