diff -Naurp gcc/config/avr/avr.c gcc/config/avr/avr.c --- gcc/config/avr/avr.c 2011-10-27 17:47:15.000000000 +0530 +++ gcc/config/avr/avr.c 2011-10-27 17:53:42.000000000 +0530 @@ -881,8 +881,9 @@ expand_prologue (void) emit_move_insn (stack_pointer_rtx, frame_pointer_rtx); } else if ((!AVR_XMEGA && TARGET_NO_INTERRUPTS ) - || cfun->machine->is_signal - || cfun->machine->is_OS_main) + || (!AVR_XMEGA && cfun->machine->is_signal) + || (!AVR_XMEGA && cfun->machine->is_OS_main) + || (AVR_XMEGA && cfun->machine->is_nmi)) { emit_insn (gen_movhi_sp_r_irq_off (stack_pointer_rtx, frame_pointer_rtx)); @@ -1070,7 +1071,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 2011-10-27 17:19:51.000000000 +0530 +++ gcc/function.c 2011-10-27 17:53:42.000000000 +0530 @@ -5254,6 +5254,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 2011-10-27 17:19:52.000000000 +0530 +++ gcc/rtl.h 2011-10-27 17:53:42.000000000 +0530 @@ -2402,6 +2402,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);