re PR target/39118 (x86_64 red zone violation)
authorUros Bizjak <uros@gcc.gnu.org>
Tue, 10 Feb 2009 16:12:33 +0000 (17:12 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 10 Feb 2009 16:12:33 +0000 (17:12 +0100)
PR target/39118
* config/i386/i386.c (expand_prologue): Emit blockage at the end
of function prologue when frame pointer is used to access
red zone area.

From-SVN: r144063

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

index 7b385034640376acdb9a44369f9e53fc49a0df9a..c85a25697fbadcf12335cf60a28fc36803a9af23 100644 (file)
@@ -1,3 +1,10 @@
+2009-02-10  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/39118
+       * config/i386/i386.c (expand_prologue): Emit blockage at the end
+       of function prologue when frame pointer is used to access
+       red zone area.
+
 2009-02-10  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/39127
 
 2009-02-06  Nick Clifton  <nickc@redhat.com>
 
-       * config/m32c/m32c.h (PCC_BITFIELD_TYPE_MATTERS): Define to
-       zero.
+       * config/m32c/m32c.h (PCC_BITFIELD_TYPE_MATTERS): Define to zero.
 
 2009-02-06  Paolo Bonzini  <bonzini@gnu.org>
 
 
 2009-02-02  Catherine Moore  <clm@codesourcery.com>
 
-       * sde.h (SUBTARGET_ARM_SPEC): Don;t assemble -fpic code as -mabicalls.
+       * sde.h (SUBTARGET_ARM_SPEC): Don't assemble -fpic code as -mabicalls.
 
 2009-02-02  Richard Sandiford  <rdsandiford@googlemail.com>
 
 
        * regclass.c: Rename reginfo.c.  Change file description.
        (FORBIDDEN_INC_DEC_CLASSES): Remove.
-       (reg_class_superclasses, forbidden_inc_dec_class, in_inc_dec):
-       Remove.
+       (reg_class_superclasses, forbidden_inc_dec_class, in_inc_dec): Remove.
        (init_reg_sets_1): Remove code for evaluation of
        reg_class_superclasses and losing_caller_save_reg_set.
        (init_regs): Remove init_reg_autoinc.
 2009-01-28  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/38740
-       * reorg.c (gate_handle_delay_slots): Avoid dbr scheduling
-       if !optimize.
+       * reorg.c (gate_handle_delay_slots): Avoid dbr scheduling if !optimize.
        * config/mips/mips.c (mips_reorg): Likewise.
 
 2009-01-28  Richard Guenther  <rguenther@suse.de>
index 7c25a1870263f4331ea92acef0a9e7b03ce8b450..e64bcc655754671e1cce87b120cac7eba52b0f97 100644 (file)
@@ -7997,6 +7997,7 @@ ix86_expand_prologue (void)
 {
   rtx insn;
   bool pic_reg_used;
+  bool emit_blockage = false;
   struct ix86_frame frame;
   HOST_WIDE_INT allocate;
 
@@ -8214,7 +8215,7 @@ ix86_expand_prologue (void)
     {
       if (pic_reg_used)
        emit_insn (gen_prologue_use (pic_offset_table_rtx));
-      emit_insn (gen_blockage ());
+      emit_blockage = true;
     }
 
   if (crtl->drap_reg && !crtl->stack_realign_needed)
@@ -8227,6 +8228,18 @@ ix86_expand_prologue (void)
       insn = emit_insn (gen_rtx_SET (VOIDmode, crtl->drap_reg, x));
     }
 
+  /* Prevent instructions from being scheduled into register save push
+     sequence when access to the redzone area is done through frame pointer.
+     The offset betweeh the frame pointer and the stack pointer is calculated
+     relative to the value of the stack pointer at the end of the function
+     prologue, and moving instructions that access redzone area via frame
+     pointer inside push sequence violates this assumption.  */
+  if (frame_pointer_needed && frame.red_zone_size)
+    emit_blockage = true;
+
+  if (emit_blockage)
+    emit_insn (gen_blockage ()); 
+
   /* Emit cld instruction if stringops are used in the function.  */
   if (TARGET_CLD && ix86_current_function_needs_cld)
     emit_insn (gen_cld ());