From: Bin Cheng Date: Wed, 7 Jun 2017 10:56:54 +0000 (+0000) Subject: tree-vect-loop-manip.c (vect_do_peeling): Don't skip vector loop if versioning is... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=704c28eeebfa5fc3fb555eb980f149ca76a8b948;p=gcc.git tree-vect-loop-manip.c (vect_do_peeling): Don't skip vector loop if versioning is required. * tree-vect-loop-manip.c (vect_do_peeling): Don't skip vector loop if versioning is required. * tree-vect-loop.c (vect_analyze_loop_2): Merge niter check for loop peeling with the check for versioning. From-SVN: r248959 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f83e059e05f..8198e0c88d6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-06-07 Bin Cheng + + * tree-vect-loop-manip.c (vect_do_peeling): Don't skip vector loop + if versioning is required. + * tree-vect-loop.c (vect_analyze_loop_2): Merge niter check for loop + peeling with the check for versioning. + 2017-06-07 Bin Cheng * tree-vectorizer.h (vect_build_loop_niters): New parameter. diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index 0156c97be5c..d60b84e60ef 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -1691,9 +1691,11 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, /* Prolog loop may be skipped. */ bool skip_prolog = (prolog_peeling != 0); - /* Skip to epilog if scalar loop may be preferred. It's only used when - we peel for epilog loop. */ - bool skip_vector = (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)); + /* Skip to epilog if scalar loop may be preferred. It's only needed + when we peel for epilog loop and when it hasn't been checked with + loop versioning. */ + bool skip_vector = (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo) + && !LOOP_REQUIRES_VERSIONING (loop_vinfo)); /* Epilog loop must be executed if the number of iterations for epilog loop is known at compile time, otherwise we need to add a check at the end of vector loop and skip to the end of epilog loop. */ diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index f81eb6f3f20..92d9a28fd9a 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -2220,6 +2220,36 @@ start_over: } } + /* During peeling, we need to check if number of loop iterations is + 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))) + { + unsigned niters_th; + + /* Niters for peeled prolog loop. */ + if (LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) < 0) + { + struct data_reference *dr = LOOP_VINFO_UNALIGNED_DR (loop_vinfo); + tree vectype = STMT_VINFO_VECTYPE (vinfo_for_stmt (DR_STMT (dr))); + + niters_th = TYPE_VECTOR_SUBPARTS (vectype) - 1; + } + else + niters_th = LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo); + + /* Niters for at least one iteration of vectorized loop. */ + 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; + } + gcc_assert (vectorization_factor == (unsigned)LOOP_VINFO_VECT_FACTOR (loop_vinfo));