OSDN Git Service

(ix86_expand_prologue): Save red-zone while stack probing.
authorktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 Jan 2008 10:46:17 +0000 (10:46 +0000)
committerktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 Jan 2008 10:46:17 +0000 (10:46 +0000)
 PR 34013.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131255 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/i386/i386.c

index 7fc21c4..1524eac 100644 (file)
@@ -1,6 +1,12 @@
+2008-01-02  Arthur Norman <acn1@cam.ac.uk>
+
+       PR 34013
+       * gcc/config/i386/i386.c: (ix86_expand_prologue): Save red-zone
+       while stack probing.
+
 2008-01-01  Douglas Gregor  <doug.gregor@gmail.com>
 
-       * c-opts.c (sanitize_cpp_opts): Don't warn about "long long" when
+       * c-opts.c (sanitize_cpp_opts): Don't warn about "long long" when
        in C++0x mode.
 
 2008-01-01  Volker Reichelt  <v.reichelt@netcologne.de>
index 232d6fe..3193101 100644 (file)
@@ -6318,8 +6318,12 @@ ix86_expand_prologue (void)
     allocate += frame.nregs * UNITS_PER_WORD;
 
   /* When using red zone we may start register saving before allocating
-     the stack frame saving one cycle of the prologue.  */
-  if (TARGET_RED_ZONE && frame.save_regs_using_mov)
+     the stack frame saving one cycle of the prologue. However I will
+     avoid doing this if I am going to have to probe the stack since
+     at least on x86_64 the stack probe can turn into a call that clobbers
+     a red zone location */
+  if (TARGET_RED_ZONE && frame.save_regs_using_mov
+      && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT))
     ix86_emit_save_regs_using_mov (frame_pointer_needed ? hard_frame_pointer_rtx
                                   : stack_pointer_rtx,
                                   -frame.nregs * UNITS_PER_WORD);
@@ -6375,7 +6379,9 @@ ix86_expand_prologue (void)
        }
     }
 
-  if (frame.save_regs_using_mov && !TARGET_RED_ZONE)
+  if (frame.save_regs_using_mov
+      && !(TARGET_RED_ZONE
+         && (! TARGET_STACK_PROBE || allocate < CHECK_STACK_LIMIT)))
     {
       if (!frame_pointer_needed || !frame.to_allocate)
         ix86_emit_save_regs_using_mov (stack_pointer_rtx, frame.to_allocate);