From bf90074c6aac420955744b7f889fca2024c31876 Mon Sep 17 00:00:00 2001
From: Changpeng Fang <chfang@houghton.(none)>
Date: Mon, 7 Jun 2010 14:57:27 -0700
Subject: [PATCH 2/2] Account prefetch_mod and unroll_factor for the computation of the prefetch count
*tree-ssa-loop-prefetch.c (nothing_to_prefetch_p): New. Return true
if no prefetch is going to be generated for a given group.
(estimate_prefetch_count): Use prefetch_mod and unroll_factor to
estimate the prefetch_count.
(loop_prefetch_arrays): Call nothing_to_prefetch_p; estimate the
prefetch count by considering the unroll_factor and prefetch_mod
for is_loop_prefetching_profitable.
---
gcc/tree-ssa-loop-prefetch.c | 36 +++++++++++++++++++++++++++++++-----
1 files changed, 31 insertions(+), 5 deletions(-)
@@ -987,18 +987,39 @@ schedule_prefetches (struct mem_ref_group *groups, unsigned unroll_factor,
return any;
}
-/* Estimate the number of prefetches in the given GROUPS. */
+/* Return TRUE if no prefetch is going to be generated
+ in the given GROUPS. */
+static bool
+nothing_to_prefetch_p (struct mem_ref_group *groups)
+{
+ struct mem_ref *ref;
+
+ for (; groups; groups = groups->next)
+ for (ref = groups->refs; ref; ref = ref->next)
+ if (should_issue_prefetch_p (ref))
+ return false;
+
+ return true;
+}
+
+/* Estimate the number of prefetches in the given GROUPS.
+ UNROLL_FACTOR is the factor by which LOOP was unrolled. */
static int
-estimate_prefetch_count (struct mem_ref_group *groups)
+estimate_prefetch_count (struct mem_ref_group *groups, unsigned unroll_factor)
{
struct mem_ref *ref;
+ unsigned n_prefetches;
int prefetch_count = 0;
for (; groups; groups = groups->next)
for (ref = groups->refs; ref; ref = ref->next)
if (should_issue_prefetch_p (ref))
- prefetch_count++;
+ {
+ n_prefetches = ((unroll_factor + ref->prefetch_mod - 1)
+ / ref->prefetch_mod);
+ prefetch_count += n_prefetches;
+ }
return prefetch_count;
}
@@ -1709,8 +1730,7 @@ loop_prefetch_arrays (struct loop *loop)
/* Step 2: estimate the reuse effects. */
prune_by_reuse (refs);
- prefetch_count = estimate_prefetch_count (refs);
- if (prefetch_count == 0)
+ if (nothing_to_prefetch_p (refs))
goto fail;
determine_loop_nest_reuse (loop, refs, no_other_refs);
@@ -1726,6 +1746,12 @@ loop_prefetch_arrays (struct loop *loop)
ninsns = tree_num_loop_insns (loop, &eni_size_weights);
unroll_factor = determine_unroll_factor (loop, refs, ninsns, &desc,
est_niter);
+
+ /* Estimate prefetch count for the unrolled loop. */
+ prefetch_count = estimate_prefetch_count (refs, unroll_factor);
+ if (prefetch_count == 0)
+ goto fail;
+
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Ahead %d, unroll factor %d, trip count "
HOST_WIDE_INT_PRINT_DEC "\n"
--
1.6.3.3