diff options
author | Anatoly Sokolov <aesok@post.ru> | 2008-01-11 23:33:50 +0300 |
---|---|---|
committer | Anatoly Sokolov <aesok@gcc.gnu.org> | 2008-01-11 23:33:50 +0300 |
commit | 0d40cc60e875e070d2b11e368e9d602e02faccfe (patch) | |
tree | d87bde98fffafce4d1ad5fcb95f51ef300ddf164 /gcc | |
parent | fd6590f8c8ca86225f6154636029937cd424dbec (diff) | |
download | gcc-0d40cc60e875e070d2b11e368e9d602e02faccfe.zip gcc-0d40cc60e875e070d2b11e368e9d602e02faccfe.tar.gz gcc-0d40cc60e875e070d2b11e368e9d602e02faccfe.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/avr/avr.c | 26 |
2 files changed, 24 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bfb1ef0..92f1cd6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-01-11 Anatoly Sokolov <aesok@post.ru> + + * 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 <ebotcazou@adacore.com> PR middle-end/31309 diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index a27d2ea..63d710d 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; |