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

--- Comment #20 from CVS 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:ad96c867e173c1ebcfc201b201adac5095683a08

commit r12-559-gad96c867e173c1ebcfc201b201adac5095683a08
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Thu May 6 10:15:40 2021 +0200

    phiopt: Optimize (x <=> y) cmp z [PR94589]

    genericize_spaceship genericizes i <=> j to approximately
    ({ int c; if (i == j) c = 0; else if (i < j) c = -1; else c = 1; c; })
    for strong ordering and
    ({ int c; if (i == j) c = 0; else if (i < j) c = -1; else if (i > j) c = 1;
else c = 2; c; })
    for partial ordering.
    The C++ standard supports then == or != comparisons of that against
    strong/partial ordering enums, or </<=/==/!=/>/>= comparisons of <=> result
    against literal 0.

    In some cases we already optimize that but in many cases we keep performing
    all the 2 or 3 comparisons, compute the spaceship value and then compare
    that.

    The following patch recognizes those patterns if the <=> operands are
    integral types or floating point (the latter only for -ffast-math) and
    optimizes it to the single comparison that is needed (plus adds debug stmts
    if needed for the spaceship result).

    There is one thing I'd like to address in a follow-up: the pr94589-2.C
    testcase should be matching just 12 times each, but runs
    into operator>=(partial_ordering, unspecified) being defined as
    (_M_value&1)==_M_value
    rather than _M_value>=0.  When not honoring NaNs, the 2 case should be
    unreachable and so (_M_value&1)==_M_value is then equivalent to
_M_value>=0,
    but is not a single use but two uses.  I'll need to pattern match that case
    specially.

    2021-05-06  Jakub Jelinek  <ja...@redhat.com>

            PR tree-optimization/94589
            * tree-ssa-phiopt.c (tree_ssa_phiopt_worker): Call
            spaceship_replacement.
            (cond_only_block_p, spaceship_replacement): New functions.

            * gcc.dg/pr94589-1.c: New test.
            * gcc.dg/pr94589-2.c: New test.
            * gcc.dg/pr94589-3.c: New test.
            * gcc.dg/pr94589-4.c: New test.
            * g++.dg/opt/pr94589-1.C: New test.
            * g++.dg/opt/pr94589-2.C: New test.
            * g++.dg/opt/pr94589-3.C: New test.
            * g++.dg/opt/pr94589-4.C: New test.

Reply via email to