https://gcc.gnu.org/g:0723273deac50ad9d00d29ca49652695e63ae49a
commit r16-7757-g0723273deac50ad9d00d29ca49652695e63ae49a Author: Vladimir N. Makarov <[email protected]> Date: Fri Feb 27 08:32:06 2026 -0500 Revert "[PR115042, LRA]: Postpone processing of new reload insns" as it results in numerous failures on some secondary targets. This reverts commit 9a7da540b63e7d77e747b5cdd6fdbbd3954e28c8. Diff: --- gcc/lra-constraints.cc | 39 +++++++++++++++++++++++++-------------- gcc/lra-int.h | 1 - gcc/lra.cc | 16 ++-------------- 3 files changed, 27 insertions(+), 29 deletions(-) diff --git a/gcc/lra-constraints.cc b/gcc/lra-constraints.cc index 1e1b0c4d1d87..1b5a875f7248 100644 --- a/gcc/lra-constraints.cc +++ b/gcc/lra-constraints.cc @@ -5514,9 +5514,10 @@ bool lra_constraints (bool first_p) { bool changed_p; - int i, hard_regno; - unsigned int uid; + int i, hard_regno, new_insns_num; + unsigned int min_len, new_min_len, uid; rtx set, x, reg, nosubreg_dest; + rtx_insn *original_insn; basic_block last_bb; bitmap_iterator bi; @@ -5626,18 +5627,36 @@ lra_constraints (bool first_p) substituted by their equivalences. */ EXECUTE_IF_SET_IN_BITMAP (equiv_insn_bitmap, 0, uid, bi) lra_push_insn_by_uid (uid); + min_len = lra_insn_stack_length (); + new_insns_num = 0; last_bb = NULL; changed_p = false; - auto constraint_insns = lra_constraint_insn_stack_clear (); - while (constraint_insns.length () != 0) + original_insn = NULL; + while ((new_min_len = lra_insn_stack_length ()) != 0) { - curr_insn = constraint_insns.pop (); + curr_insn = lra_pop_insn (); + --new_min_len; curr_bb = BLOCK_FOR_INSN (curr_insn); if (curr_bb != last_bb) { last_bb = curr_bb; bb_reload_num = lra_curr_reload_num; } + if (min_len > new_min_len) + { + min_len = new_min_len; + new_insns_num = 0; + original_insn = curr_insn; + } + else if (combine_reload_insn (curr_insn, original_insn)) + { + continue; + } + if (new_insns_num > MAX_RELOAD_INSNS_NUMBER) + internal_error + ("maximum number of generated reload insns per insn achieved (%d)", + MAX_RELOAD_INSNS_NUMBER); + new_insns_num++; if (DEBUG_INSN_P (curr_insn)) { /* We need to check equivalence in debug insn and change @@ -5728,15 +5747,7 @@ lra_constraints (bool first_p) init_curr_insn_input_reloads (); init_curr_operand_mode (); if (curr_insn_transform (false)) - { - if (lra_insn_stack_length () != 0) - { - auto reload_insn = lra_pop_insn (); - if (!combine_reload_insn (reload_insn, curr_insn)) - lra_push_insn (reload_insn); - } - changed_p = true; - } + changed_p = true; /* Check non-transformed insns too for equiv change as USE or CLOBBER don't need reloads but can contain pseudos being changed on their equivalences. */ diff --git a/gcc/lra-int.h b/gcc/lra-int.h index 18c4cf6eaeb0..1c0561f496cf 100644 --- a/gcc/lra-int.h +++ b/gcc/lra-int.h @@ -310,7 +310,6 @@ extern void lra_push_insn_by_uid (unsigned int); extern void lra_push_insn_and_update_insn_regno_info (rtx_insn *); extern rtx_insn *lra_pop_insn (void); extern unsigned int lra_insn_stack_length (void); -extern vec<rtx_insn *> lra_constraint_insn_stack_clear (void); extern rtx lra_create_new_reg (machine_mode, rtx, enum reg_class, HARD_REG_SET *, const char *); diff --git a/gcc/lra.cc b/gcc/lra.cc index b4471a3e1c8e..20a3db457476 100644 --- a/gcc/lra.cc +++ b/gcc/lra.cc @@ -1808,8 +1808,8 @@ lra_rtx_hash (rtx x) /* Bitmap used to put an insn on the stack only in one exemplar. */ static sbitmap lra_constraint_insn_stack_bitmap; -/* Vectors used for the stack. */ -static vec<rtx_insn *> lra_constraint_insn_stack, lra_constraint_insn_stack2; +/* The stack itself. */ +vec<rtx_insn *> lra_constraint_insn_stack; /* Put INSN on the stack. If ALWAYS_UPDATE is true, always update the reg info for INSN, otherwise only update it if INSN is not already on the @@ -1868,16 +1868,6 @@ lra_insn_stack_length (void) return lra_constraint_insn_stack.length (); } -/* Purge the stack and return stack vector before purging. */ -vec<rtx_insn *> -lra_constraint_insn_stack_clear (void) -{ - std::swap (lra_constraint_insn_stack, lra_constraint_insn_stack2); - lra_constraint_insn_stack.truncate (0); - bitmap_clear (lra_constraint_insn_stack_bitmap); - return lra_constraint_insn_stack2; -} - /* Push insns FROM to TO (excluding it) going in reverse order. */ static void push_insns (rtx_insn *from, rtx_insn *to) @@ -2468,7 +2458,6 @@ lra (FILE *f, int verbose) expensive when a lot of RTL changes are made. */ df_set_flags (DF_NO_INSN_RESCAN); lra_constraint_insn_stack.create (get_max_uid ()); - lra_constraint_insn_stack2.create (get_max_uid ()); lra_constraint_insn_stack_bitmap = sbitmap_alloc (get_max_uid ()); bitmap_clear (lra_constraint_insn_stack_bitmap); lra_live_ranges_init (); @@ -2646,7 +2635,6 @@ lra (FILE *f, int verbose) finish_reg_info (); sbitmap_free (lra_constraint_insn_stack_bitmap); lra_constraint_insn_stack.release (); - lra_constraint_insn_stack2.release (); finish_insn_recog_data (); lra_finish_equiv (); regstat_free_n_sets_and_refs ();
