Hi Alex, > -----Original Message----- > From: Alex Coplan <alex.cop...@arm.com> > Sent: Thursday, May 11, 2023 12:15 PM > To: gcc-patches@gcc.gnu.org > Cc: ni...@redhat.com; Richard Earnshaw <richard.earns...@arm.com>; > Ramana Radhakrishnan <ramana....@gmail.com>; Kyrylo Tkachov > <kyrylo.tkac...@arm.com> > Subject: [PATCH] arm: Fix ICE due to infinite splitting [PR109800] > > Hi, > > 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. > > Bootstrapped/regtested on arm-linux-gnueabihf, regtested on > arm-none-eabi and armeb-none-eabi. > > OK for trunk and backports?
Ok but the testcase... > > Thanks, > Alex > > 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/pr109800.c: New test. diff --git a/gcc/testsuite/gcc.target/arm/pr109800.c b/gcc/testsuite/gcc.target/arm/pr109800.c new file mode 100644 index 00000000000..71d1ede13dd --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr109800.c @@ -0,0 +1,3 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=armv7-m -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mbig-endian -mpure-code" } */ +double f() { return 5.0; } ... The arm testsuite options are kinda hard to get right with all the effective targets and multilibs and such hardcoded abi and march options tend to break in some target. I suggest you put this testcase in gcc.target/arm/pure-code and add a dg-skip-if to skip the test if the multilib options specify a different float-abi. Thanks, Kyrill