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);