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 ();

Reply via email to