From: uros Date: Tue, 10 Feb 2009 16:12:33 +0000 (+0000) Subject: PR target/39118 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a9c1f295d9e02e5d7ccb174df7223b9deeefbb99;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7b3850346403..c85a25697fba 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-02-10 Uros Bizjak + + 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 PR middle-end/39127 @@ -100,8 +107,7 @@ 2009-02-06 Nick Clifton - * 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 @@ -249,7 +255,7 @@ 2009-02-02 Catherine Moore - * 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 @@ -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 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 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 7c25a1870263..e64bcc655754 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 ());