On 1/4/24 02:11, Jakub Jelinek wrote:
Hi!

We expand __builtin_popcount* (x) == 1 as
x ^ (x - 1) > x - 1, either unconditionally in tree-ssa-math-opts.cc
if we don't have a direct optab support for popcount, or during
expansion where we compare the costs of comparison of the popcount
against one vs. the above expression.
As mentioned in the PR, if we know from ranger that the argument is
not zero, we can emit x & (x - 1) == 0 test which is same number of
GIMPLE statements, but on many targets cheaper (e.g. whenever an AND
instruction can also set flags on whether result was zero or not).

The following patch does that.  Bootstrapped/regtested on x86_64-linux
and i686-linux, ok for trunk?

2024-01-03  Jakub Jelinek  <ja...@redhat.com>

        PR tree-optimization/90693
        * tree-ssa-math-opts.cc (match_single_bit_test): If
        tree_expr_nonzero_p (arg), remember it in the second argument to
        IFN_POPCOUNT or lower it as arg & (arg - 1) == 0 rather than
        arg ^ (arg - 1) > arg - 1.
        * internal-fn.cc (expand_POPCOUNT): If second argument to
        IFN_POPCOUNT suggests arg is non-zero, try to expand it as
        arg & (arg - 1) == 0 rather than arg ^ (arg - 1) > arg - 1.

        * gcc.target/i386/pr90693-2.c: New test.
OK
jeff

Reply via email to