avr.c (avr_hard_regno_mode_ok): Do not allow r29 which may overwrite the high byte...
authorMarek Michalkiewicz <marekm@amelek.gda.pl>
Thu, 28 Feb 2002 15:23:54 +0000 (16:23 +0100)
committerMarek Michalkiewicz <marekm@gcc.gnu.org>
Thu, 28 Feb 2002 15:23:54 +0000 (15:23 +0000)
* config/avr/avr.c (avr_hard_regno_mode_ok): Do not allow r29
which may overwrite the high byte of the frame pointer.

From-SVN: r50138

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

index 64f1d8858a3db82fab33a70aca31b13a3856621b..8e896c5bc0cbef73c177d92e759f97e8020daa67 100644 (file)
@@ -1,3 +1,8 @@
+2002-02-28  Marek Michalkiewicz  <marekm@amelek.gda.pl>
+
+       * config/avr/avr.c (avr_hard_regno_mode_ok): Do not allow r29
+       which may overwrite the high byte of the frame pointer.
+
 2002-02-28  Bo Thorsen  <bo@suse.de>
 
        * config/i386/linux64.h (LINK_SPEC): Fix 32/64 bit compilation.
index 145751993a80841481002eaaa51bdb21ee340dbc..8e64bcb74aaed250e14701aa02ac43bd63a10188 100644 (file)
@@ -5210,6 +5210,13 @@ avr_hard_regno_mode_ok (regno, mode)
      int regno;
      enum machine_mode mode;
 {
+  /* Bug workaround: recog.c (peep2_find_free_register) and probably
+     a few other places assume that the frame pointer is a single hard
+     register, so r29 may be allocated and overwrite the high byte of
+     the frame pointer.  Do not allow any value to start in r29.  */
+  if (regno == REG_Y + 1)
+    return 0;
+
   if (mode == QImode)
     return 1;
   /*  if (regno < 24 && !AVR_ENHANCED)