From: Anatoly Sokolov Date: Fri, 11 Jan 2008 20:33:50 +0000 (+0300) Subject: avr.c (expand_prologue, [...]): Don't save/restore frame pointer register and don... X-Git-Tag: releases/gcc-4.3.0~653 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0d40cc60e875e070d2b11e368e9d602e02faccfe;p=thirdparty%2Fgcc.git avr.c (expand_prologue, [...]): Don't save/restore frame pointer register and don't use 'call-prologues' ... * config/avr/avr.c (expand_prologue, expand_epilogue): Don't save/restore frame pointer register and don't use 'call-prologues' optimization in function with "OS_task" attribute. From-SVN: r131474 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bfb1ef03dc55..92f1cd6f74c4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-01-11 Anatoly Sokolov + + * config/avr/avr.c (expand_prologue, expand_epilogue): Don't + save/restore frame pointer register and don't use 'call-prologues' + optimization in function with "OS_task" attribute. + 2008-01-11 Eric Botcazou PR middle-end/31309 diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index a27d2ea886f2..63d710d4d1ad 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -607,7 +607,9 @@ expand_prologue (void) live_seq = sequent_regs_live (); minimize = (TARGET_CALL_PROLOGUES - && !(cfun->machine->is_interrupt || cfun->machine->is_signal) + && !cfun->machine->is_interrupt + && !cfun->machine->is_signal + && !cfun->machine->is_OS_task && live_seq); if (cfun->machine->is_interrupt || cfun->machine->is_signal) @@ -668,9 +670,13 @@ expand_prologue (void) } if (frame_pointer_needed) { - /* Push frame pointer. */ - insn = emit_move_insn (pushword, frame_pointer_rtx); - RTX_FRAME_RELATED_P (insn) = 1; + if(!cfun->machine->is_OS_task) + { + /* Push frame pointer. */ + insn = emit_move_insn (pushword, frame_pointer_rtx); + RTX_FRAME_RELATED_P (insn) = 1; + } + if (!size) { insn = emit_move_insn (frame_pointer_rtx, stack_pointer_rtx); @@ -813,7 +819,9 @@ expand_epilogue (void) live_seq = sequent_regs_live (); minimize = (TARGET_CALL_PROLOGUES - && !(cfun->machine->is_interrupt || cfun->machine->is_signal) + && !cfun->machine->is_interrupt + && !cfun->machine->is_signal + && !cfun->machine->is_OS_task && live_seq); if (minimize && (frame_pointer_needed || live_seq > 4)) @@ -876,9 +884,11 @@ expand_epilogue (void) emit_move_insn (stack_pointer_rtx, frame_pointer_rtx); } } - - /* Restore previous frame_pointer. */ - emit_insn (gen_pophi (frame_pointer_rtx)); + if(!cfun->machine->is_OS_task) + { + /* Restore previous frame_pointer. */ + emit_insn (gen_pophi (frame_pointer_rtx)); + } } /* Restore used registers. */ HARD_REG_SET set;