widening_mul: Fix a > ~b to .ADD_OVERFLOW optimization [PR98256]
authorJakub Jelinek <jakub@redhat.com>
Sun, 13 Dec 2020 18:25:33 +0000 (19:25 +0100)
committerJakub Jelinek <jakub@redhat.com>
Sun, 13 Dec 2020 18:28:07 +0000 (19:28 +0100)
commit49ec63666e086853401021e686f0aa4d285ce9dc
treee5669d886633bfa6ee97f838ccbac65b88a7c0f0
parent3cc4e183f12e962678c70f2c3d476c748a82c29e
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  <jakub@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.
gcc/testsuite/gcc.c-torture/compile/pr98256.c [new file with mode: 0644]
gcc/tree-ssa-math-opts.c