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

--- Comment #15 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:2e4e899641c0c558eabf0128ee72cb8d3999c990

commit r14-489-g2e4e899641c0c558eabf0128ee72cb8d3999c990
Author: Andrew Pinski <apin...@marvell.com>
Date:   Thu May 4 10:07:50 2023 -0700

    PHIOPT: Fix diamond case of match_simplify_replacement

    So it turns out I messed checking which edge was true/false for the diamond
    form. The edges, e0 and e1 here are edges from the merge block but the
    true/false edges are from the conditional block and with diamond/threeway,
    there is a bb inbetween on both edges.
    Most of the time, the check that was in match_simplify_replacement would
    happen to be correct for diamond form as most of the time the first edge in
    the conditional is the edge for the true side of the conditional.
    This is why I didn't see the issue during bootstrap/testing.

    I added a fragile gimple testcase which exposed the issue. Since there is
    no way to specify the order of the edges in the gimple fe, we have to
    have forwprop to swap the false/true edges (not order of them, just
swapping
    true/false flags) and hope not to do cleanupcfg inbetween forwprop and the
    first phiopt pass. This is the fragile part really, it is not that we will
    produce wrong code, just we won't hit what was the failing case.

    OK? Bootstrapped and tested on x86_64-linux-gnu.

            PR tree-optimization/109732

    gcc/ChangeLog:

            * tree-ssa-phiopt.cc (match_simplify_replacement): Fix the
selection
            of the argtrue/argfalse.

    gcc/testsuite/ChangeLog:

            * gcc.dg/pr109732.c: New test.
            * gcc.dg/pr109732-1.c: New test.

Reply via email to