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

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

https://gcc.gnu.org/g:43619dc6e120a80305d4a52d7f9b8833c110a7db

commit r12-9684-g43619dc6e120a80305d4a52d7f9b8833c110a7db
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)

Reply via email to