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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
      Known to work|                            |6.4.0
            Summary|Incorrect code generation   |[7/8/9 Regression]
                   |with signed/unsigned        |Incorrect code generation
                   |comparison                  |with signed/unsigned
                   |                            |comparison
      Known to fail|7.0.1                       |7.1.0, 8.1.0, 9.0

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
This regressed with moving fold-const.c patterns to match.pd, specifically

/* Non-equality compare simplifications from fold_binary  */
(for cmp (lt gt le ge)
 /* Comparisons with the highest or lowest possible integer of
    the specified precision will have known values.  */
 (simplify
  (cmp (convert?@2 @0) INTEGER_CST@1)
...
       (if (cmp == LE_EXPR)
        { constant_boolean_node (true, type); })

and

/* Transform comparisons of the form X +- C1 CMP C2 to X CMP C2 -+ C1.  */
(for cmp (lt le gt ge)
 (for op (plus minus)
      rop (minus plus)
  (simplify
   (cmp (op@3 @0 INTEGER_CST@1) INTEGER_CST@2)
...
      (if (single_use (@3))
       (with
        {
          fold_overflow_warning (("assuming signed overflow does not occur "
                                  "when changing X +- C1 cmp C2 to "
                                  "X cmp C2 -+ C1"),
                                 WARN_STRICT_OVERFLOW_COMPARISON);
        }
        (cmp @0 { res; })))))))))

The latter only appeared with GCC7.

The issue itself is latent at least since match-and-simplify but possibly
earlier as well where SCCVN used GENERIC expression simplification for
"combining" stmt defs.

It will take some time to fix this (if a fix is possible with reasonable
amount of work), do not hold your breath.

Reply via email to