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

--- Comment #5 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-11 branch has been updated by Alex Coplan
<acop...@gcc.gnu.org>:

https://gcc.gnu.org/g:2d3b72cbbfe7fb38b0e3b8ef2119156cbce57488

commit r11-10852-g2d3b72cbbfe7fb38b0e3b8ef2119156cbce57488
Author: Alex Coplan <alex.cop...@arm.com>
Date:   Thu May 25 13:34:46 2023 +0100

    arm: Fix ICE due to infinite splitting [PR109800]

    In r11-966-g9a182ef9ee011935d827ab5c6c9a7cd8e22257d8 we introduce a
    simplification to emit_move_insn that attempts to simplify moves of the
form:

    (set (subreg:M1 (reg:M2 ...)) (constant C))

    where M1 and M2 are of equal mode size. That is problematic for the
splitter
    vfp.md:no_literal_pool_df_immediate in the arm backend, which tries to pun
an
    lvalue DFmode pseudo into DImode and assign a constant to it with
    emit_move_insn, as the new transformation simply undoes this, and we end up
    splitting indefinitely.

    This patch changes things around in the arm backend so that we use a
    DImode temporary (instead of DFmode) and first load the DImode constant
    into the pseudo, and then pun the pseudo into DFmode as an rvalue in a
    reg -> reg move. I believe this should be semantically equivalent but
    avoids the pathalogical behaviour seen in the PR.

    gcc/ChangeLog:

            PR target/109800
            * config/arm/arm.md (movdf): Generate temporary pseudo in DImode
            instead of DFmode.
            * config/arm/vfp.md (no_literal_pool_df_immediate): Rather than
punning an
            lvalue DFmode pseudo into DImode, use a DImode pseudo and pun it
into
            DFmode as an rvalue.

    gcc/testsuite/ChangeLog:

            PR target/109800
            * gcc.target/arm/pure-code/pr109800.c: New test.

    (cherry picked from commit f5298d9969b4fa34ff3aecd54b9630e22b2984a5)
  • [Bug target/109800] [11 Regress... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to