diff options
author | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-02-10 16:12:33 +0000 |
---|---|---|
committer | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-02-10 16:12:33 +0000 |
commit | a9c1f295d9e02e5d7ccb174df7223b9deeefbb99 (patch) | |
tree | d4318d96c3482ad5e4acd7f98bdb8877e1a261cc /gcc | |
parent | 4ad04fc17246b610b45dbba9990569079b70fd84 (diff) | |
download | gcc-a9c1f295d9e02e5d7ccb174df7223b9deeefbb99.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@144063 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 18 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 15 |
2 files changed, 25 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7b385034640..c85a25697fb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 @@ -100,8 +107,7 @@ 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> @@ -249,7 +255,7 @@ 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> @@ -444,8 +450,7 @@ * 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. @@ -579,8 +584,7 @@ 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> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 7c25a187026..e64bcc65575 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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 ()); |