From 4eef89cc39a629988453e964258374cd7a047b1f Mon Sep 17 00:00:00 2001 From: "Vladimir N. Makarov" Date: Tue, 24 Mar 2026 09:05:59 -0400 Subject: [PATCH] [PR124572, LRA]: Deal with generation of reload insns during elimination It was assumed that elimination in LRA does not generate new reload insns. In the testcase the elimination of SFP subreg generates reload insn of the subreg and this insn is added at end of RTL code. The insn is also skipped for necessary processing. This results in ICE. The patch checks creation of reloads insn during elimination, insert them in the right place, and add them for later processing. gcc/ChangeLog: PR rtl-optimization/124572 * lra-eliminations.cc (lra_eliminate): Push new reload insns for eliminations in insns. gcc/testsuite/ChangeLog: PR rtl-optimization/124572 * gcc.target/aarch64/pr124572.c: New. --- gcc/lra-eliminations.cc | 15 +++++++++++++-- gcc/testsuite/gcc.target/aarch64/pr124572.c | 10 ++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/pr124572.c diff --git a/gcc/lra-eliminations.cc b/gcc/lra-eliminations.cc index 8e68cb70dcf..e2a6ebfff16 100644 --- a/gcc/lra-eliminations.cc +++ b/gcc/lra-eliminations.cc @@ -1544,8 +1544,19 @@ lra_eliminate (bool final_p, bool first_p) EXECUTE_IF_SET_IN_BITMAP (&insns_with_changed_offsets, 0, uid, bi) /* A dead insn can be deleted in process_insn_for_elimination. */ if (lra_insn_recog_data[uid] != NULL) - process_insn_for_elimination (lra_insn_recog_data[uid]->insn, - final_p, first_p); + { + rtx_insn *insn = lra_insn_recog_data[uid]->insn; + start_sequence (); + process_insn_for_elimination (insn, final_p, first_p); + rtx_insn *first = get_insns (); + end_sequence (); + if (first != NULL) + { + lra_assert (!final_p); + lra_process_new_insns (insn, first, NULL, + "Inserting elimination insn", true); + } + } bitmap_clear (&insns_with_changed_offsets); lra_eliminate_done: diff --git a/gcc/testsuite/gcc.target/aarch64/pr124572.c b/gcc/testsuite/gcc.target/aarch64/pr124572.c new file mode 100644 index 00000000000..edadfc3da79 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr124572.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +int e() { + char f; + long tt = (long)&f; + tt+=1; + int g = tt; + return g + 3; +}