summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog21
-rw-r--r--gcc/config/i386/i386.c25
-rw-r--r--gcc/config/i386/i386.md27
3 files changed, 52 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4dd16725e0f..71c859e7b8d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+2009-02-11 Uros Bizjak <ubizjak@gmail.com>
+ Jakub Jelinek <jakub@redhat.com>
+
+ PR target/39118
+ * config/i386/i386.md (UNSPEC_MEMORY_BLOCKAGE): New constant.
+ (memory_blockage): New expander.
+ (*memory_blockage): New insn pattern.
+ * config/i386/i386.c (ix86_expand_prologue): Use memory_blockage
+ instead of general blockage at the end of function prologue when
+ frame pointer is used to access red zone area. Do not emit blockage
+ when profiling, it is emitted in generic code.
+ (ix86_expand_epilogue): Emit memory_blockage at the beginning of
+ function epilogue when frame pointer is used to access red zone area.
+
2009-02-11 Paolo Bonzini <bonzini@gnu.org>
* config/i386/i386.md: Add two new peephole2 to avoid mov followed
@@ -32,8 +46,7 @@
cancel_loop_tree, not before it.
PR target/39139
- * function.h (struct function): Add has_local_explicit_reg_vars
- bit.
+ * function.h (struct function): Add has_local_explicit_reg_vars bit.
* gimplify.c (gimplify_bind_expr): Set it if local DECL_HARD_REGISTER
VAR_DECLs were seen.
* tree-ssa-live.c (remove_unused_locals): Recompute
@@ -89,8 +102,8 @@
2009-02-09 Sebastian Pop <sebastian.pop@amd.com>
PR middle-end/38953
- * graphite.c (if_region_set_false_region): After moving a region
- in the false branch of a condition, remove the empty dummy basic block.
+ * graphite.c (if_region_set_false_region): After moving a region in
+ the false branch of a condition, remove the empty dummy basic block.
(gloog): Remove wrong fix for PR38953.
2009-02-09 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index e64bcc65575..3e02102284f 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -7997,7 +7997,6 @@ ix86_expand_prologue (void)
{
rtx insn;
bool pic_reg_used;
- bool emit_blockage = false;
struct ix86_frame frame;
HOST_WIDE_INT allocate;
@@ -8209,14 +8208,12 @@ ix86_expand_prologue (void)
insn = emit_insn (gen_set_got (pic_offset_table_rtx));
}
- /* Prevent function calls from being scheduled before the call to mcount.
- In the pic_reg_used case, make sure that the got load isn't deleted. */
- if (crtl->profile)
- {
- if (pic_reg_used)
- emit_insn (gen_prologue_use (pic_offset_table_rtx));
- emit_blockage = true;
- }
+ /* In the pic_reg_used case, make sure that the got load isn't deleted
+ when mcount needs it. Blockage to avoid call movement across mcount
+ call is emitted in generic code after the NOTE_INSN_PROLOGUE_END
+ note. */
+ if (crtl->profile && pic_reg_used)
+ emit_insn (gen_prologue_use (pic_offset_table_rtx));
if (crtl->drap_reg && !crtl->stack_realign_needed)
{
@@ -8235,10 +8232,7 @@ ix86_expand_prologue (void)
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_insn (gen_memory_blockage ());
/* Emit cld instruction if stringops are used in the function. */
if (TARGET_CLD && ix86_current_function_needs_cld)
@@ -8326,6 +8320,11 @@ ix86_expand_epilogue (int style)
ix86_compute_frame_layout (&frame);
+ /* See the comment about red zone and frame
+ pointer usage in ix86_expand_prologue. */
+ if (frame_pointer_needed && frame.red_zone_size)
+ emit_insn (gen_memory_blockage ());
+
/* Calculate start of saved registers relative to ebp. Special care
must be taken for the normal return case of a function using
eh_return: the eax and edx registers are marked as saved, but not
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 7a4511fc07f..1516237ae69 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -68,12 +68,13 @@
(UNSPEC_DEF_CFA 15)
(UNSPEC_SET_RIP 16)
(UNSPEC_SET_GOT_OFFSET 17)
+ (UNSPEC_MEMORY_BLOCKAGE 18)
; TLS support
- (UNSPEC_TP 18)
- (UNSPEC_TLS_GD 19)
- (UNSPEC_TLS_LD_BASE 20)
- (UNSPEC_TLSDESC 21)
+ (UNSPEC_TP 20)
+ (UNSPEC_TLS_GD 21)
+ (UNSPEC_TLS_LD_BASE 22)
+ (UNSPEC_TLSDESC 23)
; Other random patterns
(UNSPEC_SCAS 30)
@@ -15175,6 +15176,24 @@
""
[(set_attr "length" "0")])
+;; Do not schedule instructions accessing memory across this point.
+
+(define_expand "memory_blockage"
+ [(set (match_dup 0)
+ (unspec:BLK [(match_dup 0)] UNSPEC_MEMORY_BLOCKAGE))]
+ ""
+{
+ operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
+ MEM_VOLATILE_P (operands[0]) = 1;
+})
+
+(define_insn "*memory_blockage"
+ [(set (match_operand:BLK 0 "" "")
+ (unspec:BLK [(match_dup 0)] UNSPEC_MEMORY_BLOCKAGE))]
+ ""
+ ""
+ [(set_attr "length" "0")])
+
;; As USE insns aren't meaningful after reload, this is used instead
;; to prevent deleting instructions setting registers for PIC code
(define_insn "prologue_use"