]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
avr.c (expand_prologue, [...]): Don't save/restore frame pointer register and don...
authorAnatoly Sokolov <aesok@post.ru>
Fri, 11 Jan 2008 20:33:50 +0000 (23:33 +0300)
committerAnatoly Sokolov <aesok@gcc.gnu.org>
Fri, 11 Jan 2008 20:33:50 +0000 (23:33 +0300)
* 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

gcc/ChangeLog
gcc/config/avr/avr.c

index bfb1ef03dc5573b27620dbd3c8a8d2f49f13e1be..92f1cd6f74c4e2619717c55253d6f6d91352cbe7 100644 (file)
@@ -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
index a27d2ea886f22cd85c4a72088b413c572bc2179d..63d710d4d1adf9f5bf54ebdba0771f719a6b9202 100644 (file)
@@ -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;