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

--- Comment #7 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-10 branch has been updated by Richard Sandiford
<rsand...@gcc.gnu.org>:

https://gcc.gnu.org/g:00bcb8380bf755c60d5ad605a21818f6d3ed9912

commit r10-9114-g00bcb8380bf755c60d5ad605a21818f6d3ed9912
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Thu Dec 3 10:23:25 2020 +0000

    expr: Fix REDUCE_BIT_FIELD for constants [PR95694, PR96151]

    This is yet another PR caused by constant integer rtxes not storing
    a mode.  We were calling REDUCE_BIT_FIELD on a constant integer that
    didn't fit in poly_int64, and then tripped the as_a<scalar_int_mode>
    assert on VOIDmode.

    AFAICT REDUCE_BIT_FIELD is always passed rtxes that have TYPE_MODE
    (rather than some other mode) and it just fills in the redundant
    sign bits of that TYPE_MODE value.  So it should be safe to get
    the mode from the type instead of the rtx.  The patch does that
    and asserts that the modes agree, where information is available.

    That on its own is enough to fix the bug, but we might as well
    extend the folding case to all constant integers, not just those
    that fit poly_int64.

    gcc/
            PR middle-end/95694
            * expr.c (expand_expr_real_2): Get the mode from the type rather
            than the rtx, and assert that it is consistent with the mode of
            the rtx (where known).  Optimize all constant integers, not just
            those that can be represented in poly_int64.

    gcc/testsuite/
            PR middle-end/95694
            * gcc.dg/pr95694.c: New test.

    (cherry picked from commit 760df6d296b8fc59796f42dca5eb14012fbfa28b)

Reply via email to