--- gcc/config/avr/avr.h.orig 2010-03-05 15:20:53.000000000 +0100 +++ gcc/config/avr/avr.h 2010-03-05 15:22:53.000000000 +0100 @@ -470,10 +470,6 @@ 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)) \ { \ --- gcc/config/avr/avr.c.orig 2010-03-05 15:20:53.000000000 +0100 +++ gcc/config/avr/avr.c 2010-03-05 15:22:53.000000000 +0100 @@ -993,6 +993,8 @@ 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; @@ -1007,6 +1009,7 @@ 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;