]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/19636 (Can't compile large switch statement)
authorAndy Hutchinson <hutchinsonandy@aim.com>
Sun, 14 Sep 2008 12:50:10 +0000 (12:50 +0000)
committerAnatoly Sokolov <aesok@gcc.gnu.org>
Sun, 14 Sep 2008 12:50:10 +0000 (16:50 +0400)
PR target/19636
PR target/24894
PR target/31644
PR target/31786
* config/avr/avr.c (legitimate_address_p): Fix problem where subreg
is not recognized as a valid register usage. Allow REG_X to be used
as a base pointer.
* config/avr/avr.h (LEGITIMIZE_RELOAD_ADDRESS): Remove code that
forces a reload when using a base register.

From-SVN: r140360

gcc/ChangeLog
gcc/config/avr/avr.c
gcc/config/avr/avr.h

index af70b38b4c4c8eadbd4e76bd8cab076a17a74e8b..c0008973357056b29949198ebfe2095e2a64fed8 100644 (file)
@@ -1,3 +1,15 @@
+2008-09-14  Andy Hutchinson  <hutchinsonandy@aim.com>
+
+       PR target/19636
+       PR target/24894
+       PR target/31644
+       PR target/31786
+       * config/avr/avr.c (legitimate_address_p): Fix problem where subreg
+       is not recognized as a valid register usage. Allow REG_X to be used
+       as a base pointer.
+       * config/avr/avr.h (LEGITIMIZE_RELOAD_ADDRESS): Remove code that
+       forces a reload when using a base register.
+
 2008-09-14  Danny Smith  <dannysmith@users.sourceforge.net>
 
        * config/i386/cygming-crtend.c (register_frame_ctor): If
index fb217bb167a6cd73970465a35a49c958df2527c7..279aea5259244cdb7a8e8cba4e77f466759335fa 100644 (file)
@@ -1089,6 +1089,8 @@ legitimate_address_p (enum machine_mode mode, rtx x, int strict)
                 true_regnum (XEXP (x, 0)));
       debug_rtx (x);
     }
+  if (!strict && GET_CODE (x) == SUBREG)
+       x = SUBREG_REG (x);
   if (REG_P (x) && (strict ? REG_OK_FOR_BASE_STRICT_P (x)
                     : REG_OK_FOR_BASE_NOSTRICT_P (x)))
     r = POINTER_REGS;
@@ -1103,6 +1105,7 @@ legitimate_address_p (enum machine_mode mode, rtx x, int strict)
       if (fit)
        {
          if (! strict
+             || REGNO (XEXP (x,0)) == REG_X
              || REGNO (XEXP (x,0)) == REG_Y
              || REGNO (XEXP (x,0)) == REG_Z)
            r = BASE_POINTER_REGS;
index 744098518056b0a64c0128b135706b8ee79e2333..3b7cbbb4343eae242c5c74fe530d642091757b7e 100644 (file)
@@ -483,10 +483,6 @@ do {                                                                           \
                           OPNUM, TYPE);                                    \
              goto WIN;                                                     \
            }                                                               \
-         push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL,           \
-                      BASE_POINTER_REGS, GET_MODE (X), VOIDmode, 0, 0,     \
-                      OPNUM, TYPE);                                        \
-          goto WIN;                                                        \
        }                                                                   \
       else if (! (frame_pointer_needed && XEXP (X,0) == frame_pointer_rtx)) \
        {                                                                   \