diff options
author | Richard Biener <rguenther@suse.de> | 2014-08-28 13:13:45 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-08-28 13:13:45 +0000 |
commit | b1aef01e16b01f3b07a14c5c7cac92d98553517f (patch) | |
tree | b4e458d2703a45df4467d10ef7a50acef78d5b09 /gcc/tree-vect-data-refs.c | |
parent | f22ae1ecbd724ed01423a2132b5631a5d7c0ee10 (diff) | |
download | gcc-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.c | 22 |
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) |