summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2009-02-10 16:12:33 +0000
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2009-02-10 16:12:33 +0000
commita9c1f295d9e02e5d7ccb174df7223b9deeefbb99 (patch)
treed4318d96c3482ad5e4acd7f98bdb8877e1a261cc /gcc
parent4ad04fc17246b610b45dbba9990569079b70fd84 (diff)
downloadgcc-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/ChangeLog18
-rw-r--r--gcc/config/i386/i386.c15
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 ());