diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c --- gcc/config/avr/avr.c 2011-01-19 13:45:00.000000000 -0600 +++ gcc/config/avr/avr.c 2011-01-19 13:45:47.000000000 -0600 @@ -784,7 +784,8 @@ expand_prologue (void) } else if ((!AVR_XMEGA && TARGET_NO_INTERRUPTS) || (!AVR_XMEGA && cfun->machine->is_signal) - || (!AVR_XMEGA && cfun->machine->is_OS_main)) + || (!AVR_XMEGA && cfun->machine->is_OS_main) + || (AVR_XMEGA && cfun->machine->is_nmi)) { insn = emit_insn (gen_movhi_sp_r_irq_off (stack_pointer_rtx, @@ -963,7 +964,8 @@ expand_epilogue (void) emit_move_insn (stack_pointer_rtx, frame_pointer_rtx); } else if ((!AVR_XMEGA && TARGET_NO_INTERRUPTS) - || (!AVR_XMEGA && cfun->machine->is_signal)) + || (!AVR_XMEGA && cfun->machine->is_signal) + || (AVR_XMEGA && cfun->machine->is_nmi)) { emit_insn (gen_movhi_sp_r_irq_off (stack_pointer_rtx, frame_pointer_rtx)); diff -Naurp gcc/function.c gcc/function.c --- gcc/function.c 2010-02-26 09:58:57.000000000 -0600 +++ gcc/function.c 2011-01-19 13:45:48.000000000 -0600 @@ -4980,6 +4980,14 @@ contains (const_rtx insn, htab_t hash) } int +prologue_contains (const_rtx insn) +{ + if (contains (insn, prologue_insn_hash)) + return 1; + return 0; +} + +int prologue_epilogue_contains (const_rtx insn) { if (contains (insn, prologue_insn_hash)) diff -Naurp gcc/rtl.h gcc/rtl.h --- gcc/rtl.h 2010-03-16 05:50:42.000000000 -0500 +++ gcc/rtl.h 2011-01-19 13:45:48.000000000 -0600 @@ -2296,6 +2296,7 @@ extern void print_inline_rtx (FILE *, co /* In function.c */ extern void reposition_prologue_and_epilogue_notes (void); +extern int prologue_contains (const_rtx); extern int prologue_epilogue_contains (const_rtx); extern int sibcall_epilogue_contains (const_rtx); extern void mark_temp_addr_taken (rtx);