aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-12-21 07:02:46 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2017-12-21 07:02:46 +0000
commita696bc4fec986318a1765c31ac9ee2db3849934a (patch)
treeb024ac8449c4eccf850126c2747e34a781b7931b /gcc/tree-vect-loop.c
parentd2fd6a04f958346c6311113f4244540ac28efef2 (diff)
downloadgcc-a696bc4fec986318a1765c31ac9ee2db3849934a.zip
gcc-a696bc4fec986318a1765c31ac9ee2db3849934a.tar.gz
gcc-a696bc4fec986318a1765c31ac9ee2db3849934a.tar.bz2
poly_int: loop versioning threshold
This patch splits the loop versioning threshold out from the cost model threshold so that the former can become a poly_uint64. We still use a single test to enforce both limits where possible. 2017-12-21 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * tree-vectorizer.h (_loop_vec_info): Add a versioning_threshold field. (LOOP_VINFO_VERSIONING_THRESHOLD): New macro (vect_loop_versioning): Take the loop versioning threshold as a separate parameter. * tree-vect-loop-manip.c (vect_loop_versioning): Likewise. * tree-vect-loop.c (_loop_vec_info::_loop_vec_info): Initialize versioning_threshold. (vect_analyze_loop_2): Compute the loop versioning threshold whenever loop versioning is needed, and store it in the new field rather than combining it with the cost model threshold. (vect_transform_loop): Update call to vect_loop_versioning. Try to combine the loop versioning and cost thresholds here. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r255934
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r--gcc/tree-vect-loop.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 58e46a0..810fa5f 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -1112,6 +1112,7 @@ _loop_vec_info::_loop_vec_info (struct loop *loop_in)
num_iters_unchanged (NULL_TREE),
num_iters_assumptions (NULL_TREE),
th (0),
+ versioning_threshold (0),
vectorization_factor (0),
max_vectorization_factor (0),
unaligned_dr (NULL),
@@ -2176,11 +2177,9 @@ start_over:
enough for both peeled prolog loop and vector loop. This check
can be merged along with threshold check of loop versioning, so
increase threshold for this case if necessary. */
- if (LOOP_REQUIRES_VERSIONING (loop_vinfo)
- && (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo)
- || LOOP_VINFO_PEELING_FOR_NITER (loop_vinfo)))
+ if (LOOP_REQUIRES_VERSIONING (loop_vinfo))
{
- unsigned niters_th;
+ poly_uint64 niters_th;
/* Niters for peeled prolog loop. */
if (LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) < 0)
@@ -2197,9 +2196,8 @@ start_over:
niters_th += LOOP_VINFO_VECT_FACTOR (loop_vinfo);
/* One additional iteration because of peeling for gap. */
if (LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo))
- niters_th++;
- if (LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo) < niters_th)
- LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo) = niters_th;
+ niters_th += 1;
+ LOOP_VINFO_VERSIONING_THRESHOLD (loop_vinfo) = niters_th;
}
gcc_assert (vectorization_factor
@@ -2302,6 +2300,7 @@ again:
LOOP_VINFO_PEELING_FOR_NITER (loop_vinfo) = false;
LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo) = false;
LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo) = 0;
+ LOOP_VINFO_VERSIONING_THRESHOLD (loop_vinfo) = 0;
goto start_over;
}
@@ -7380,7 +7379,17 @@ vect_transform_loop (loop_vec_info loop_vinfo)
if (LOOP_REQUIRES_VERSIONING (loop_vinfo))
{
- vect_loop_versioning (loop_vinfo, th, check_profitability);
+ poly_uint64 versioning_threshold
+ = LOOP_VINFO_VERSIONING_THRESHOLD (loop_vinfo);
+ if (check_profitability
+ && ordered_p (poly_uint64 (th), versioning_threshold))
+ {
+ versioning_threshold = ordered_max (poly_uint64 (th),
+ versioning_threshold);
+ check_profitability = false;
+ }
+ vect_loop_versioning (loop_vinfo, th, check_profitability,
+ versioning_threshold);
check_profitability = false;
}