https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113933
--- Comment #3 from John David Anglin <danglin at gcc dot gnu.org> --- This code in pa_emit_move_sequence is reload specific (reg_equiv_mem): if (scratch_reg && reload_in_progress && GET_CODE (operand0) == REG && REGNO (operand0) >= FIRST_PSEUDO_REGISTER) operand0 = reg_equiv_mem (REGNO (operand0)); else if (scratch_reg && reload_in_progress && GET_CODE (operand0) == SUBREG && GET_CODE (SUBREG_REG (operand0)) == REG && REGNO (SUBREG_REG (operand0)) >= FIRST_PSEUDO_REGISTER) { /* We must not alter SUBREG_BYTE (operand0) since that would confuse the code which tracks sets/uses for delete_output_reload. */ rtx temp = gen_rtx_SUBREG (GET_MODE (operand0), reg_equiv_mem (REGNO (SUBREG_REG (operand0))), SUBREG_BYTE (operand0)); operand0 = alter_subreg (&temp, true); } We need something similar for lra. Otherwise, we hit following error: dave@mx3210:~/gnu/gcc/objdir/hppa-linux-gnu/libgcc$ sh xx.sh GNU C17 (GCC) version 15.0.0 20240918 (experimental) [master r15-3695-gcc62b2c3da1] (hppa-linux-gnu) compiled by GNU C version 13.3.0, GMP version 6.3.0, MPFR version 4.2.1, MPC version 1.3.1, isl version isl-0.18-GMP GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 07d108a61db93a2471fe8e13f11689df during RTL pass: reload ../../../gcc/libgcc/libgcc2.c: In function ‘__mulvdi3’: ../../../gcc/libgcc/libgcc2.c:376:1: internal compiler error: maximum number of generated reload insns per insn achieved (90) 376 | } | ^ 0x335fd73 internal_error(char const*, ...) ../../gcc/gcc/diagnostic-global-context.cc:517 0x12b9e43 lra_constraints(bool) ../../gcc/gcc/lra-constraints.cc:5404 0x1291b63 lra(_IO_FILE*, int) ../../gcc/gcc/lra.cc:2445 0x11f4d43 do_reload ../../gcc/gcc/ira.cc:5976 0x11f5663 execute ../../gcc/gcc/ira.cc:6164