summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraesok <aesok@138bc75d-0d04-0410-961f-82ee72b054a4>2008-01-11 20:33:50 +0000
committeraesok <aesok@138bc75d-0d04-0410-961f-82ee72b054a4>2008-01-11 20:33:50 +0000
commita0a028c29ca8efd5e563a4e4ebdcc7599b47b0dc (patch)
treed87bde98fffafce4d1ad5fcb95f51ef300ddf164
parent8dec97a01c853098d6632fe60e9a442dd9210b35 (diff)
downloadppe42-gcc-a0a028c29ca8efd5e563a4e4ebdcc7599b47b0dc.tar.gz
ppe42-gcc-a0a028c29ca8efd5e563a4e4ebdcc7599b47b0dc.zip
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131474 138bc75d-0d04-0410-961f-82ee72b054a4
-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 bfb1ef03dc5..92f1cd6f74c 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 a27d2ea886f..63d710d4d1a 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;
OpenPOWER on IntegriCloud