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

--- Comment #1 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:49ec63666e086853401021e686f0aa4d285ce9dc

commit r11-5974-g49ec63666e086853401021e686f0aa4d285ce9dc
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Sun Dec 13 19:25:33 2020 +0100

    widening_mul: Fix a > ~b to .ADD_OVERFLOW optimization [PR98256]

    Unfortunately, my latest tree-ssa-math-opts.c patch broke the following
    testcase.  The problem is that the code is adding .ADD_OVERFLOW or
    .SUB_OVERFLOW before or after the stmt on which the function has been
    called, which is normally a addition or subtraction that has all the
    operands.
    But in the a > ~b optimization that stmt is the ~b stmt and the other
    comparison operand might be defined only after that ~b stmt, so we can't
    insert the .ADD_OVERFLOW next to ~b that we want to delete, but need to
    insert it before the a > temp comparison that uses it; and in that case
    when removing the BIT_NOT_EXPR stmt we need to ensure the caller doesn't do
    gsi_next because gsi_remove already points the iterator to the next stmt.

    2020-12-13  Jakub Jelinek  <ja...@redhat.com>

            PR tree-optimization/98256
            * tree-ssa-math-opts.c (match_uaddsub_overflow): For BIT_NOT_EXPR,
            only handle a single use, and insert .ADD_OVERFLOW before the
            comparison rather than after the BIT_NOT_EXPR.  Return true iff
            it is BIT_NOT_EXPR and it has been removed.
            (math_opts_dom_walker::after_dom_children) <case BIT_NOT_EXPR>:
            If match_uaddsub_overflow returned true, continue instead of break.

            * gcc.c-torture/compile/pr98256.c: New test.

Reply via email to