diff options
author | Changpeng Fang <changpeng.fang@amd.com> | 2010-05-17 22:33:53 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2010-05-17 22:33:53 +0000 |
commit | 8532678c05ca513c77a9163e1546f4019a82beef (patch) | |
tree | 9957431e127d4b12f699827d78fb336349730bed /gcc/tree-ssa-loop-prefetch.c | |
parent | 339f49ec21ea4870e25641f7a7e60703b5d86d50 (diff) | |
download | gcc-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.c | 17 |
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 |