https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90693
--- Comment #13 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #12) > (In reply to Piotr Siupa from comment #11) > > However, I've noticed that: > > bool foo(unsigned x) > > { > > if (x == 0) > > return true; > > else > > return std::has_single_bit(x); > > } > > > Oh that is because expand does not use flow sensitive ranges/non-zero bits > there. There is talk about adding the ability for that but nothing has been > done yet. Well that also should be transformed into `__builtin_popcount(a) <= 1` which then gets expanded into `(v & (v - 1)) == 0`. I will be handling both of those via PR 94787 .