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

--- Comment #3 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <[email protected]>:

https://gcc.gnu.org/g:dd8df074c9ceaa723e82f06bef8714f46ecccb18

commit r16-6706-gdd8df074c9ceaa723e82f06bef8714f46ecccb18
Author: Jakub Jelinek <[email protected]>
Date:   Mon Jan 12 10:06:47 2026 +0100

    simplify-rtx: Fix up shift/rotate VOIDmode count handling [PR123523]

    The following testcase ICEs on i686-linux, because the HW in that
    case implements the shift as shifting by 64-bit count (anything larger
    or equal to number of bits in the first operand's element results
    in 0 or sign copies), so the machine description implements it as
    such as well.
    Now, because shifts/rotates can have different modes on the first
    and second operand, when the second one has VOIDmode (i.e. CONST_INT,
    I think CONST_WIDE_INT has non-VOIDmode and CONST_DOUBLE with VOIDmode
    is hopefully very rarely used), we need to choose some mode for the
    wide_int conversion.  And so far we've been choosing
BITS_PER_WORD/word_mode
    or the mode of the first operand's element, whichever is wider.
    That works fine on 64-bit targets, CONST_INT has always at most 64 bits,
    but for 32-bit targets uses SImode.

    Because HOST_BITS_PER_WIDE_INT is always 64, the following patch just
    uses that plus DImode instead of BITS_PER_WORD and word_mode.

    2026-01-12  Jakub Jelinek  <[email protected]>

            PR rtl-optimization/123523
            * simplify-rtx.cc (simplify_const_binary_operation): Use
            DImode for VOIDmode shift and truncation counts if int_mode
            is narrower than HOST_BITS_PER_WIDE_INT rather than
            word_mode if int_mode it is narrower than BITS_PER_WORD.

            * gcc.target/i386/pr123523.c: New test.

Reply via email to