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

--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Andrew Pinski <pins...@gcc.gnu.org>:

https://gcc.gnu.org/g:f956c232649e4bb7482786cd54e5d5b4085cd00a

commit r14-3140-gf956c232649e4bb7482786cd54e5d5b4085cd00a
Author: Andrew Pinski <apin...@marvell.com>
Date:   Wed Aug 9 13:49:24 2023 -0700

    Fix PR 110954: wrong code with cmp | !cmp

    This was an oversight on my part forgetting that
    cmp will might have a different true value than all ones
    but will have a value of 1 in most cases.
    This means if we have `(f < 0) | !(f < 0)` we would
    optimize this to -1 rather than just 1.

    This is version 2 of the patch.
    Decided to go down a different route than just checking if
    the precission was 1 inside bitwise_inverted_equal_p.
    So instead bitwise_inverted_equal_p gets passed an argument
    that will be set if there was a comparison that was being compared
    and the user of bitwise_inverted_equal_p decides what needs to be done.
    In most uses of bitwise_inverted_equal_p, the check will be
    `!wascmp || element_precision (type) == 1` .
    But in the case of `a & ~a` and `a ^| ~a` we can handle the case
    of wascmp by using constant_boolean_node isntead.

    OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

            PR tree-optimization/110954

    gcc/ChangeLog:

            * generic-match-head.cc (bitwise_inverted_equal_p): Add
            wascmp argument and set it accordingly.
            * gimple-match-head.cc (bitwise_inverted_equal_p): Add
            wascmp argument to the macro.
            (gimple_bitwise_inverted_equal_p): Add
            wascmp argument and set it accordingly.
            * match.pd (`a & ~a`, `a ^| ~a`): Update call
            to bitwise_inverted_equal_p and handle wascmp case.
            (`(~x | y) & x`, `(~x | y) & x`, `a?~t:t`): Update
            call to bitwise_inverted_equal_p and check to see
            if was !wascmp or if precision was 1.

    gcc/testsuite/ChangeLog:

            * gcc.c-torture/execute/pr110954-1.c: New test.

Reply via email to