aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-data-refs.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-08-28 13:13:45 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-08-28 13:13:45 +0000
commitb1aef01e16b01f3b07a14c5c7cac92d98553517f (patch)
treeb4e458d2703a45df4467d10ef7a50acef78d5b09 /gcc/tree-vect-data-refs.c
parentf22ae1ecbd724ed01423a2132b5631a5d7c0ee10 (diff)
downloadgcc-b1aef01e16b01f3b07a14c5c7cac92d98553517f.zip
gcc-b1aef01e16b01f3b07a14c5c7cac92d98553517f.tar.gz
gcc-b1aef01e16b01f3b07a14c5c7cac92d98553517f.tar.bz2
re PR fortran/62283 (basic-block vectorization fails)
2014-08-28 Richard Biener <rguenther@suse.de> PR tree-optimization/62283 * tree-vect-data-refs.c (vect_enhance_data_refs_alignment): Do not peel loops for alignment where the vector loop likely doesn't run at least VF times. * gfortran.dg/vect/pr62283.f: New testcase. * gcc.dg/tree-ssa/cunroll-5.c: Adjust. * gcc.dg/vect/costmodel/i386/costmodel-vect-31.c: Likewise. * gcc.dg/vect/costmodel/i386/costmodel-vect-33.c: Likewise. * gcc.dg/vect/costmodel/x86_64/costmodel-vect-31.c: Likewise. * gcc.dg/vect/costmodel/x86_64/costmodel-vect-33.c: Likewise. * gcc.dg/vect/vect-33.c: Likewise. From-SVN: r214678
Diffstat (limited to 'gcc/tree-vect-data-refs.c')
-rw-r--r--gcc/tree-vect-data-refs.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 893ad5a..8785d10 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -1515,10 +1515,20 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
|| !slpeel_can_duplicate_loop_p (loop, single_exit (loop)))
do_peeling = false;
- if (do_peeling && all_misalignments_unknown
+ /* If we don't know how many times the peeling loop will run
+ assume it will run VF-1 times and disable peeling if the remaining
+ iters are less than the vectorization factor. */
+ if (do_peeling
+ && all_misalignments_unknown
+ && LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
+ && (LOOP_VINFO_INT_NITERS (loop_vinfo)
+ < 2 * (unsigned) LOOP_VINFO_VECT_FACTOR (loop_vinfo) - 1))
+ do_peeling = false;
+
+ if (do_peeling
+ && all_misalignments_unknown
&& vect_supportable_dr_alignment (dr0, false))
{
-
/* Check if the target requires to prefer stores over loads, i.e., if
misaligned stores are more expensive than misaligned loads (taking
drs with same alignment into account). */
@@ -1605,6 +1615,14 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
&body_cost_vec);
if (!dr0 || !npeel)
do_peeling = false;
+
+ /* If peeling by npeel will result in a remaining loop not iterating
+ enough to be vectorized then do not peel. */
+ if (do_peeling
+ && LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
+ && (LOOP_VINFO_INT_NITERS (loop_vinfo)
+ < LOOP_VINFO_VECT_FACTOR (loop_vinfo) + npeel))
+ do_peeling = false;
}
if (do_peeling)