https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90693

--- Comment #10 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:0152637c74c9eab7658483b1cca4e3d584dd4262

commit r14-6940-g0152637c74c9eab7658483b1cca4e3d584dd4262
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Fri Jan 5 11:16:58 2024 +0100

    Improve __builtin_popcount* (x) == 1 generation if x is known != 0
[PR90693]

    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.

    2024-01-05  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.

Reply via email to