aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-prefetch.c
diff options
context:
space:
mode:
authorChangpeng Fang <changpeng.fang@amd.com>2010-05-17 22:33:53 +0000
committerSebastian Pop <spop@gcc.gnu.org>2010-05-17 22:33:53 +0000
commit8532678c05ca513c77a9163e1546f4019a82beef (patch)
tree9957431e127d4b12f699827d78fb336349730bed /gcc/tree-ssa-loop-prefetch.c
parent339f49ec21ea4870e25641f7a7e60703b5d86d50 (diff)
downloadgcc-8532678c05ca513c77a9163e1546f4019a82beef.zip
gcc-8532678c05ca513c77a9163e1546f4019a82beef.tar.gz
gcc-8532678c05ca513c77a9163e1546f4019a82beef.tar.bz2
Define PREFETCH_MOD_TO_UNROLL_FACTOR_RATIO heuristic.
2010-05-17 Changpeng Fang <changpeng.fang@amd.com> * tree-ssa-loop-prefetch.c (PREFETCH_MOD_TO_UNROLL_FACTOR_RATIO): New. (schedule_prefetches): Do not generate a prefetch if the unroll factor is far from what is required by the prefetch. From-SVN: r159514
Diffstat (limited to 'gcc/tree-ssa-loop-prefetch.c')
-rw-r--r--gcc/tree-ssa-loop-prefetch.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/tree-ssa-loop-prefetch.c b/gcc/tree-ssa-loop-prefetch.c
index f828ed3..4889604 100644
--- a/gcc/tree-ssa-loop-prefetch.c
+++ b/gcc/tree-ssa-loop-prefetch.c
@@ -225,6 +225,17 @@ struct mem_ref_group
#define PREFETCH_ALL (~(unsigned HOST_WIDE_INT) 0)
+/* Do not generate a prefetch if the unroll factor is significantly less
+ than what is required by the prefetch. This is to avoid redundant
+ prefetches. For example, if prefetch_mod is 16 and unroll_factor is
+ 1, this means prefetching requires unrolling the loop 16 times, but
+ the loop is not going to be unrolled. In this case (ratio = 16),
+ prefetching is not likely to be beneficial. */
+
+#ifndef PREFETCH_MOD_TO_UNROLL_FACTOR_RATIO
+#define PREFETCH_MOD_TO_UNROLL_FACTOR_RATIO 8
+#endif
+
/* The memory reference. */
struct mem_ref
@@ -921,6 +932,12 @@ schedule_prefetches (struct mem_ref_group *groups, unsigned unroll_factor,
if (!should_issue_prefetch_p (ref))
continue;
+ /* The loop is far from being sufficiently unrolled for this
+ prefetch. Do not generate prefetch to avoid many redudant
+ prefetches. */
+ if (ref->prefetch_mod / unroll_factor > PREFETCH_MOD_TO_UNROLL_FACTOR_RATIO)
+ continue;
+
/* If we need to prefetch the reference each PREFETCH_MOD iterations,
and we unroll the loop UNROLL_FACTOR times, we need to insert
ceil (UNROLL_FACTOR / PREFETCH_MOD) instructions in each