tree-vect-loop-manip.c (vect_do_peeling): Don't skip vector loop if versioning is...
authorBin Cheng <bin.cheng@arm.com>
Wed, 7 Jun 2017 10:56:54 +0000 (10:56 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Wed, 7 Jun 2017 10:56:54 +0000 (10:56 +0000)
* 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

gcc/ChangeLog
gcc/tree-vect-loop-manip.c
gcc/tree-vect-loop.c

index f83e059e05fd84002eb265a015161baf77cd763e..8198e0c88d66cd993c1bf89a6a50dd5e009894f2 100644 (file)
@@ -1,3 +1,10 @@
+2017-06-07  Bin Cheng  <bin.cheng@arm.com>
+
+       * 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  <bin.cheng@arm.com>
 
        * tree-vectorizer.h (vect_build_loop_niters): New parameter.
index 0156c97be5c50ea1a7d9a7b3cde94d560c1b2fe9..d60b84e60ef5478556e770a9e00ebe6e58a012b5 100644 (file)
@@ -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.  */
index f81eb6f3f20e5c70b2d243adaab1cce95b038fea..92d9a28fd9a998c981e3351ef48f869392893b79 100644 (file)
@@ -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));