https://gcc.gnu.org/g:7e8d89ee82cc504e760c1613f4225be61ddc5d5d

commit r16-2787-g7e8d89ee82cc504e760c1613f4225be61ddc5d5d
Author: Georg-Johann Lay <a...@gjlay.de>
Date:   Sun Aug 3 11:40:37 2025 +0200

    AVR: target/121359: Remove -mlra and remains of reload.
    
            PR target/121359
    gcc/
            * config/avr/avr.h: Remove -mlra and remains of reload.
            * config/avr/avr.cc: Same.
            * config/avr/avr.md: Same.
            * config/avr/avr-log.cc: Same.
            * config/avr/avr-protos.h: Same.
            * config/avr/avr.opt: Same.
            * config/avr/avr.opt.urls: Same.
    gcc/testsuite/
            * gcc.target/avr/torture/pr118591-1.c: Remove -mlra.
            * gcc.target/avr/torture/pr118591-2.c: Same.

Diff:
---
 gcc/config/avr/avr-log.cc                         |   1 -
 gcc/config/avr/avr-protos.h                       |   2 -
 gcc/config/avr/avr.cc                             | 124 ++--------------------
 gcc/config/avr/avr.h                              |  18 ----
 gcc/config/avr/avr.md                             |  35 ------
 gcc/config/avr/avr.opt                            |   4 -
 gcc/config/avr/avr.opt.urls                       |   2 -
 gcc/testsuite/gcc.target/avr/torture/pr118591-1.c |   2 +-
 gcc/testsuite/gcc.target/avr/torture/pr118591-2.c |   2 +-
 9 files changed, 8 insertions(+), 182 deletions(-)

diff --git a/gcc/config/avr/avr-log.cc b/gcc/config/avr/avr-log.cc
index fadb3ca231ba..972ba6b2c92e 100644
--- a/gcc/config/avr/avr-log.cc
+++ b/gcc/config/avr/avr-log.cc
@@ -373,7 +373,6 @@ avr_log_set_avr_log (void)
       SET_DUMP_DETAIL (insn_addresses);
       SET_DUMP_DETAIL (legitimate_address_p);
       SET_DUMP_DETAIL (legitimize_address);
-      SET_DUMP_DETAIL (legitimize_reload_address);
       SET_DUMP_DETAIL (progmem);
       SET_DUMP_DETAIL (rtx_costs);
 
diff --git a/gcc/config/avr/avr-protos.h b/gcc/config/avr/avr-protos.h
index 9aa00d39f1df..8ba1945cff7e 100644
--- a/gcc/config/avr/avr-protos.h
+++ b/gcc/config/avr/avr-protos.h
@@ -146,7 +146,6 @@ extern void out_shift_with_cnt (const char *templ, rtx_insn 
*insn,
 extern enum reg_class avr_mode_code_base_reg_class (machine_mode, 
addr_space_t, rtx_code, rtx_code);
 extern bool avr_regno_mode_code_ok_for_base_p (int, machine_mode, 
addr_space_t, rtx_code, rtx_code);
 extern rtx avr_incoming_return_addr_rtx (void);
-extern rtx avr_legitimize_reload_address (rtx*, machine_mode, int, int, int, 
int, rtx (*)(rtx,int));
 extern bool avr_adiw_reg_p (rtx);
 extern bool avr_mem_flash_p (rtx);
 extern bool avr_mem_flashx_p (rtx);
@@ -241,7 +240,6 @@ typedef struct
   unsigned insn_addresses :1;
   unsigned legitimate_address_p :1;
   unsigned legitimize_address :1;
-  unsigned legitimize_reload_address :1;
   unsigned progmem :1;
   unsigned rtx_costs :1;
 } avr_log_t;
diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc
index 2afea952f087..1bfa3f5a00d7 100644
--- a/gcc/config/avr/avr.cc
+++ b/gcc/config/avr/avr.cc
@@ -453,13 +453,6 @@ avr_ld_regno_p (int regno)
 }
 
 
-static bool
-ra_in_progress ()
-{
-  return avropt_lra_p ? lra_in_progress : reload_in_progress;
-}
-
-
 /* Set `avr_arch' as specified by `-mmcu='.
    Return true on success.  */
 
@@ -2347,8 +2340,8 @@ avr_legitimate_address_p (machine_mode mode, rtx x, bool 
strict)
   if (avr_log.legitimate_address_p)
     {
       avr_edump ("\n%?: ret=%d, mode=%m strict=%d "
-                "reload_completed=%d ra_in_progress=%d %s:",
-                ok, mode, strict, reload_completed, ra_in_progress (),
+                "reload_completed=%d lra_in_progress=%d %s:",
+                ok, mode, strict, reload_completed, lra_in_progress,
                 reg_renumber ? "(reg_renumber)" : "");
 
       if (GET_CODE (x) == PLUS
@@ -2418,88 +2411,6 @@ avr_legitimize_address (rtx x, rtx oldx, machine_mode 
mode)
 }
 
 
-/* Implement `LEGITIMIZE_RELOAD_ADDRESS'.  */
-/* This will allow register R26/27 to be used where it is no worse than normal
-   base pointers R28/29 or R30/31.  For example, if base offset is greater
-   than 63 bytes or for R++ or --R addressing.  */
-
-rtx
-avr_legitimize_reload_address (rtx *px, machine_mode mode, int opnum,
-                              int type, int addr_type, int /*ind_levels*/,
-                              rtx (*mk_memloc)(rtx,int))
-{
-  rtx x = *px;
-
-  if (avr_log.legitimize_reload_address)
-    avr_edump ("\n%?:%m %r\n", mode, x);
-
-  if (1 && (GET_CODE (x) == POST_INC
-           || GET_CODE (x) == PRE_DEC))
-    {
-      push_reload (XEXP (x, 0), XEXP (x, 0), &XEXP (x, 0), &XEXP (x, 0),
-                  POINTER_REGS, GET_MODE (x), GET_MODE (x), 0, 0,
-                  opnum, RELOAD_OTHER);
-
-      if (avr_log.legitimize_reload_address)
-       avr_edump (" RCLASS.1 = %R\n IN = %r\n OUT = %r\n",
-                  POINTER_REGS, XEXP (x, 0), XEXP (x, 0));
-
-      return x;
-    }
-
-  if (GET_CODE (x) == PLUS
-      && REG_P (XEXP (x, 0))
-      && reg_equiv_constant (REGNO (XEXP (x, 0))) == 0
-      && CONST_INT_P (XEXP (x, 1))
-      && INTVAL (XEXP (x, 1)) >= 1)
-    {
-      bool fit = INTVAL (XEXP (x, 1)) <= MAX_LD_OFFSET (mode);
-
-      if (fit)
-       {
-         if (reg_equiv_address (REGNO (XEXP (x, 0))) != 0)
-           {
-             int regno = REGNO (XEXP (x, 0));
-             rtx mem = mk_memloc (x, regno);
-
-             push_reload (XEXP (mem, 0), NULL_RTX, &XEXP (mem, 0), NULL,
-                          POINTER_REGS, Pmode, VOIDmode, 0, 0,
-                          1, (enum reload_type) addr_type);
-
-             if (avr_log.legitimize_reload_address)
-               avr_edump (" RCLASS.2 = %R\n IN = %r\n OUT = %r\n",
-                          POINTER_REGS, XEXP (mem, 0), NULL_RTX);
-
-             push_reload (mem, NULL_RTX, &XEXP (x, 0), NULL,
-                          BASE_POINTER_REGS, GET_MODE (x), VOIDmode, 0, 0,
-                          opnum, (enum reload_type) type);
-
-             if (avr_log.legitimize_reload_address)
-               avr_edump (" RCLASS.2 = %R\n IN = %r\n OUT = %r\n",
-                          BASE_POINTER_REGS, mem, NULL_RTX);
-
-             return x;
-           }
-       }
-      else if (! (frame_pointer_needed
-                 && XEXP (x, 0) == frame_pointer_rtx))
-       {
-         push_reload (x, NULL_RTX, px, NULL,
-                      POINTER_REGS, GET_MODE (x), VOIDmode, 0, 0,
-                      opnum, (enum reload_type) type);
-
-         if (avr_log.legitimize_reload_address)
-           avr_edump (" RCLASS.3 = %R\n IN = %r\n OUT = %r\n",
-                      POINTER_REGS, x, NULL_RTX);
-
-         return x;
-       }
-    }
-
-  return NULL_RTX;
-}
-
-
 /* Helper function to print assembler resp. track instruction
    sequence lengths.  Always return "".
 
@@ -13959,8 +13870,8 @@ extra_constraint_Q (rtx x)
            || xx == arg_pointer_rtx);
 
       if (avr_log.constraints)
-       avr_edump ("\n%?=%d reload_completed=%d ra_in_progress=%d\n %r\n",
-                  ok, reload_completed, ra_in_progress (), x);
+       avr_edump ("\n%?=%d reload_completed=%d lra_in_progress=%d\n %r\n",
+                  ok, reload_completed, lra_in_progress, x);
     }
 
   return ok;
@@ -14165,17 +14076,6 @@ avr_hard_regno_mode_ok (unsigned int regno, 
machine_mode mode)
   if (GET_MODE_SIZE (mode) == 1)
     return true;
 
-  /* FIXME: Ideally, the following test is not needed.
-       However, it turned out that it can reduce the number
-       of spill fails.  AVR and it's poor endowment with
-       address registers is extreme stress test for reload.  */
-
-  if (GET_MODE_SIZE (mode) >= 4
-      && regno + GET_MODE_SIZE (mode) >= REG_30
-      // This problem only concerned the old reload.
-      && ! avropt_lra_p)
-    return false;
-
   /* All modes larger than 8 bits should start in an even register.  */
 
   return !(regno & 1);
@@ -14937,8 +14837,8 @@ avr_addr_space_legitimate_address_p (machine_mode mode, 
rtx x, bool strict,
   if (avr_log.legitimate_address_p)
     {
       avr_edump ("\n%?: ret=%b, mode=%m strict=%d "
-                "reload_completed=%d ra_in_progress=%d %s:",
-                ok, mode, strict, reload_completed, ra_in_progress (),
+                "reload_completed=%d lra_in_progress=%d %s:",
+                ok, mode, strict, reload_completed, lra_in_progress,
                 reg_renumber ? "(reg_renumber)" : "");
 
       if (GET_CODE (x) == PLUS
@@ -16716,15 +16616,6 @@ avr_unwind_word_mode ()
   return Pmode;
 }
 
-
-/* Implement `TARGET_LRA_P'.  */
-
-static bool
-avr_use_lra_p ()
-{
-  return avropt_lra_p;
-}
-
 
 
 /* Initialize the GCC target structure.  */
@@ -16866,9 +16757,6 @@ avr_use_lra_p ()
 #undef  TARGET_CONVERT_TO_TYPE
 #define TARGET_CONVERT_TO_TYPE avr_convert_to_type
 
-#undef TARGET_LRA_P
-#define TARGET_LRA_P avr_use_lra_p
-
 #undef  TARGET_ADDR_SPACE_SUBSET_P
 #define TARGET_ADDR_SPACE_SUBSET_P avr_addr_space_subset_p
 
diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h
index cb818c36e69e..335f9fa55739 100644
--- a/gcc/config/avr/avr.h
+++ b/gcc/config/avr/avr.h
@@ -309,12 +309,6 @@ enum reg_class {
 
 #define STATIC_CHAIN_REGNUM ((AVR_TINY) ? 18 :2)
 
-#define RELOAD_ELIMINABLE_REGS {                               \
-    { ARG_POINTER_REGNUM, STACK_POINTER_REGNUM },               \
-    { ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM },               \
-    { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM },             \
-    { FRAME_POINTER_REGNUM + 1, STACK_POINTER_REGNUM + 1 } }
-
 #define ELIMINABLE_REGS                                                \
   {                                                            \
     { ARG_POINTER_REGNUM, STACK_POINTER_REGNUM },              \
@@ -358,18 +352,6 @@ typedef struct avr_args
 
 #define MAX_REGS_PER_ADDRESS 1
 
-#define LEGITIMIZE_RELOAD_ADDRESS(X,MODE,OPNUM,TYPE,IND_L,WIN)          \
-  do {                                                                  \
-    rtx new_x = avr_legitimize_reload_address (&(X), MODE, OPNUM, TYPE, \
-                                               ADDR_TYPE (TYPE),        \
-                                               IND_L, make_memloc);     \
-    if (new_x)                                                          \
-      {                                                                 \
-        X = new_x;                                                      \
-        goto WIN;                                                       \
-      }                                                                 \
-  } while (0)
-
 /* We increase branch costs after reload in order to keep basic-block
    reordering from introducing out-of-line jumps and to prefer fall-through
    edges instead.  The default branch costs are 0, mainly because otherwise
diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md
index 67e88c18959e..d4bf4dad76db 100644
--- a/gcc/config/avr/avr.md
+++ b/gcc/config/avr/avr.md
@@ -5009,41 +5009,6 @@
 ;;<< << << << << << << << << << << << << << << << << << << << << << << << << <<
 ;; arithmetic shift left
 
-;; Work around PR120423: Transform left shift of a paradoxical subreg
-;; into left shift of the zero-extended entity.
-(define_split ; PR120423
-  [(set (match_operand:HISI 0 "register_operand")
-        (ashift:HISI (subreg:HISI (match_operand:QIPSI 1 
"nonimmediate_operand")
-                                  0)
-                     (match_operand:QI 2 "const_int_operand")))]
-  "!reload_completed
-   && !avropt_lra_p
-   && <HISI:SIZE> > <QIPSI:SIZE>"
-  [(set (match_dup 4)
-        (zero_extend:HISI (match_dup 5)))
-   (set (match_dup 0)
-        (ashift:HISI (match_dup 4)
-                     (match_dup 2)))]
-  {
-    operands[4] = gen_reg_rtx (<HISI:MODE>mode);
-    operands[5] = force_reg (<QIPSI:MODE>mode, operands[1]);
-  })
-
-;; Similar happens for PR116389.
-(define_split ; PR116389
-  [(set (match_operand:HISI 0 "register_operand")
-        (subreg:HISI (match_operand:QIPSI 1 "nonimmediate_operand")
-                     0))]
-  "!reload_completed
-   && !avropt_lra_p
-   && <HISI:SIZE> > <QIPSI:SIZE>"
-  [(set (match_dup 0)
-        (zero_extend:HISI (match_dup 2)))]
-  {
-    operands[2] = force_reg (<QIPSI:MODE>mode, operands[1]);
-  })
-
-
 ;; "ashlqi3"
 ;; "ashlqq3"  "ashluqq3"
 (define_expand "ashl<mode>3"
diff --git a/gcc/config/avr/avr.opt b/gcc/config/avr/avr.opt
index 7f6f18c3f23f..2bed8ea391c9 100644
--- a/gcc/config/avr/avr.opt
+++ b/gcc/config/avr/avr.opt
@@ -18,10 +18,6 @@
 ; along with GCC; see the file COPYING3.  If not see
 ; <http://www.gnu.org/licenses/>.
 
-mlra
-Target Var(avropt_lra_p) UInteger Init(1) Optimization Undocumented
-Usa LRA for reload instead of the old reload framework.  This option is 
experimental, on per default, and it may be removed in future versions of the 
compiler.
-
 mcall-prologues
 Target Mask(CALL_PROLOGUES) Optimization
 Optimization. Use subroutines for function prologues and epilogues.
diff --git a/gcc/config/avr/avr.opt.urls b/gcc/config/avr/avr.opt.urls
index 87c26b2f95e5..fa560bc2a5a7 100644
--- a/gcc/config/avr/avr.opt.urls
+++ b/gcc/config/avr/avr.opt.urls
@@ -1,7 +1,5 @@
 ; Autogenerated by regenerate-opt-urls.py from gcc/config/avr/avr.opt and 
generated HTML
 
-; skipping UrlSuffix for 'mlra' due to finding no URLs
-
 mcall-prologues
 UrlSuffix(gcc/AVR-Options.html#index-mcall-prologues)
 
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr118591-1.c 
b/gcc/testsuite/gcc.target/avr/torture/pr118591-1.c
index 814f0410a7fb..6f54c63d7ee5 100644
--- a/gcc/testsuite/gcc.target/avr/torture/pr118591-1.c
+++ b/gcc/testsuite/gcc.target/avr/torture/pr118591-1.c
@@ -1,5 +1,5 @@
 /* { dg-do run { target { ! avr_tiny } } } */
-/* { dg-additional-options "-std=c99 -mlra" } */
+/* { dg-additional-options "-std=c99" } */
 
 __attribute__((noipa))
 void func2 (long long a1, long long a2, long b)
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr118591-2.c 
b/gcc/testsuite/gcc.target/avr/torture/pr118591-2.c
index 83d360600882..222af09fc97a 100644
--- a/gcc/testsuite/gcc.target/avr/torture/pr118591-2.c
+++ b/gcc/testsuite/gcc.target/avr/torture/pr118591-2.c
@@ -1,6 +1,6 @@
 /* Test case failed on avrtiny.  */
 /* { dg-do run } */
-/* { dg-additional-options "-std=c99 -mlra" } */
+/* { dg-additional-options "-std=c99" } */
 
 __attribute__((noipa))
 void func2 (long a, long b)

Reply via email to