2009-09-07 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Sep 2009 10:30:32 +0000 (10:30 +0000)
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Sep 2009 10:30:32 +0000 (10:30 +0000)
* rtl.h (PREFETCH_SCHEDULE_BARRIER_P): New macro.
* sched-deps.c (sched_analyze_2): Make prefetches a hard barrier
when volatile flag is set.
* doc/rtl.texi (PREFETCH_SCHEDULE_BARRIER_P): Add documentation pieces.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151475 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/doc/rtl.texi
gcc/rtl.h
gcc/sched-deps.c

index e3445d1..8527d0b 100644 (file)
@@ -1,3 +1,10 @@
+2009-09-07  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
+
+       * rtl.h (PREFETCH_SCHEDULE_BARRIER_P): New macro.       
+       * sched-deps.c (sched_analyze_2): Make prefetches a hard barrier
+       when volatile flag is set.
+       * doc/rtl.texi (PREFETCH_SCHEDULE_BARRIER_P): Add documentation pieces.
+
 2009-09-06  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR bootstrap/41241
index 79baa10..ba72b48 100644 (file)
@@ -882,6 +882,14 @@ Stored in the @code{volatil} field and printed as @samp{/v}.
 Most uses of @code{SYMBOL_REF_FLAG} are historic and may be subsumed
 by @code{SYMBOL_REF_FLAGS}.  Certainly use of @code{SYMBOL_REF_FLAGS}
 is mandatory if the target requires more than one bit of storage.
+
+@findex PREFETCH_SCHEDULE_BARRIER_P
+@cindex @code{prefetch} and @samp{/v}
+@cindex @code{volatile}, in @code{prefetch}
+@item PREFETCH_SCHEDULE_BARRIER_P (@var{x})
+In a @code{prefetch}, indicates that the prefetch is a scheduling barrier.
+No other INSNs will be moved over it.
+Stored in the @code{volatil} field and printed as @samp{/v}.
 @end table
 
 These are the fields to which the above macros refer:
@@ -1034,6 +1042,9 @@ In an @code{insn}, 1 means the insn has been deleted.
 In @code{label_ref} and @code{reg_label} expressions, 1 means a reference
 to a non-local label.
 
+In @code{prefetch} expressions, 1 means that the containing insn is a
+scheduling barrier.
+
 In an RTL dump, this flag is represented as @samp{/v}.
 @end table
 
index c5839df..88b93f1 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -271,7 +271,9 @@ struct GTY((chain_next ("RTX_NEXT (&%h)"),
      1 in a SUBREG with a negative value.
      1 in a LABEL_REF, REG_LABEL_TARGET or REG_LABEL_OPERAND note for a
      non-local label.
-     In a SYMBOL_REF, this flag is used for machine-specific purposes.  */
+     In a SYMBOL_REF, this flag is used for machine-specific purposes.
+     In a PREFETCH, this flag indicates that it should be considered a scheduling
+     barrier.  */
   unsigned int volatil : 1;
   /* 1 in a MEM referring to a field of an aggregate.
      0 if the MEM was a variable or the result of a * operator in C;
@@ -1423,6 +1425,10 @@ do {                                             \
    offset within that block.  */
 #define SYMBOL_REF_BLOCK_OFFSET(RTX) (BLOCK_SYMBOL_CHECK (RTX)->offset)
 
+/* True if RTX is flagged to be a scheduling barrier.  */
+#define PREFETCH_SCHEDULE_BARRIER_P(RTX)                                       \
+  (RTL_FLAG_CHECK1("PREFETCH_SCHEDULE_BARRIER_P", (RTX), PREFETCH)->volatil)
+
 /* Indicate whether the machine has any sort of auto increment addressing.
    If not, we can avoid checking for REG_INC notes.  */
 
index 25f03d2..e9dac31 100644 (file)
@@ -2487,6 +2487,11 @@ sched_analyze_2 (struct deps *deps, rtx x, rtx insn)
       flush_pending_lists (deps, insn, true, false);
       break;
 
+    case PREFETCH:
+      if (PREFETCH_SCHEDULE_BARRIER_P (x))
+       reg_pending_barrier = TRUE_BARRIER;
+      break;
+
     case UNSPEC_VOLATILE:
       flush_pending_lists (deps, insn, true, true);
       /* FALLTHRU */