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

--- Comment #9 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:06ac981ffb3c0d6997f2e1c01ffaf6253b6a244f

commit r12-3246-g06ac981ffb3c0d6997f2e1c01ffaf6253b6a244f
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Tue Aug 31 10:29:23 2021 +0200

    tree-ssa-ccp: Fix up bit_value_binop on RSHIFT_EXPR [PR102134]

    As mentioned in the PR, this hunk is guarded with !wi::neg_p (r1val |
r1mask, sgn)
    which means if sgn is UNSIGNED, it is always true, but r1val | r1mask in
    widest_int is still sign-extended.  That means wi::clz (arg) returns 0,
    wi::get_precision (arg) returns some very large number
    (WIDE_INT_MAX_PRECISION, on x86_64 576 bits) and width is 64, so we end up
    with lzcount of -512 where the code afterwards expects a non-negative
    lzcount.  For arg without the sign bit set the code works right, those
    numbers are zero extended and so wi::clz must return wi::get_precision
(arg) - width
    plus number of leading zero bits within the width precision.
    The patch fixes it by handling the sign-extension specially, either it
could
    be done through wi::neg_p (arg) check, but lzcount == 0 works identically.

    2021-08-31  Jakub Jelinek  <ja...@redhat.com>

            PR tree-optimization/102134
            * tree-ssa-ccp.c (bit_value_binop) <case RSHIFT_EXPR>: If sgn is
            UNSIGNED and r1val | r1mask has MSB set, ensure lzcount doesn't
            become negative.

            * gcc.c-torture/execute/pr102134.c: New test.

Reply via email to