Godbolt
#include <stdint.h>
uint64_t foo(uint64_t z) {
uint64_t w = z - 1;
return (z & w) * w;
}
Emits:
foo:
lea rax, [rdi - 1]
and rdi, rax ; can't be computed in parallel with `lea`
imul rax, rdi
ret
I was expecting:
foo:
lea rax, [rdi - 1]
blsr rdi, rdi ; can be computed in parallel with `lea`
imul rax, rdi
ret