aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatoly Sokolov <aesok@post.ru>2008-01-11 23:33:50 +0300
committerAnatoly Sokolov <aesok@gcc.gnu.org>2008-01-11 23:33:50 +0300
commit0d40cc60e875e070d2b11e368e9d602e02faccfe (patch)
treed87bde98fffafce4d1ad5fcb95f51ef300ddf164
parentfd6590f8c8ca86225f6154636029937cd424dbec (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/avr/avr.c26
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;