]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/60505 (Warning caused by GCC vectorizer.)
authorCong Hou <congh@google.com>
Thu, 3 Apr 2014 23:05:42 +0000 (19:05 -0400)
committerCong Hou <congh@gcc.gnu.org>
Thu, 3 Apr 2014 23:05:42 +0000 (19:05 -0400)
2014-04-03  Cong Hou  <congh@google.com>

PR tree-optimization/60505
    * tree-vectorizer.h (struct _stmt_vec_info): Add th field as the
    threshold of number of iterations below which no vectorization will be
    done.
    * tree-vect-loop.c (new_loop_vec_info):
    Initialize LOOP_VINFO_COST_MODEL_THRESHOLD.
    * tree-vect-loop.c (vect_analyze_loop_operations):
    Set LOOP_VINFO_COST_MODEL_THRESHOLD.
    * tree-vect-loop.c (vect_transform_loop):
    Use LOOP_VINFO_COST_MODEL_THRESHOLD.
    * tree-vect-loop.c (vect_analyze_loop_2): Check the maximum number
    of iterations of the loop and see if we should build the epilogue.

2014-04-03  Cong Hou  <congh@google.com>

    PR tree-optimization/60505
    * gcc.dg/vect/pr60505.c: New test.

From-SVN: r209065

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr60505.c [new file with mode: 0644]
gcc/tree-vect-loop.c
gcc/tree-vectorizer.h

index 8d0c02162eda954884db3819aa70665c27f54ce8..2a2e948b4b087eeb538134808068aaef275056f2 100644 (file)
@@ -1,3 +1,18 @@
+2014-04-03  Cong Hou  <congh@google.com>
+
+       PR tree-optimization/60505
+       * tree-vectorizer.h (struct _stmt_vec_info): Add th field as the
+       threshold of number of iterations below which no vectorization will be
+       done.
+       * tree-vect-loop.c (new_loop_vec_info):
+       Initialize LOOP_VINFO_COST_MODEL_THRESHOLD.
+       * tree-vect-loop.c (vect_analyze_loop_operations):
+       Set LOOP_VINFO_COST_MODEL_THRESHOLD.
+       * tree-vect-loop.c (vect_transform_loop):
+       Use LOOP_VINFO_COST_MODEL_THRESHOLD.
+       * tree-vect-loop.c (vect_analyze_loop_2): Check the maximum number
+       of iterations of the loop and see if we should build the epilogue.
+
 2014-04-03  Richard Biener  <rguenther@suse.de>
 
        * tree-streamer.h (struct streamer_tree_cache_d): Add next_idx
index 3a58dc297454329714f80f186b2a70072b2fafeb..d470b1e6b35fd2a94e0063ba1bc721b92c728b43 100644 (file)
@@ -1,3 +1,8 @@
+2014-04-03  Cong Hou  <congh@google.com>
+
+       PR tree-optimization/60505
+       * gcc.dg/vect/pr60505.c: New test.
+
 2014-04-03  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/60740
diff --git a/gcc/testsuite/gcc.dg/vect/pr60505.c b/gcc/testsuite/gcc.dg/vect/pr60505.c
new file mode 100644 (file)
index 0000000..6940513
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-Wall -Werror" } */
+
+void foo(char *in, char *out, int num)
+{
+  int i;
+  char ovec[16] = {0};
+
+  for(i = 0; i < num ; ++i)
+    out[i] = (ovec[i] = in[i]);
+  out[num] = ovec[num/2];
+}
index df6ab6fcb9ee2993b7f7023f591c5ed0b2b1f9fd..1c78e114fe1c09c9169de82e51d2193bc3a5803d 100644 (file)
@@ -933,6 +933,7 @@ new_loop_vec_info (struct loop *loop)
   LOOP_VINFO_NITERS (res) = NULL;
   LOOP_VINFO_NITERS_UNCHANGED (res) = NULL;
   LOOP_VINFO_COST_MODEL_MIN_ITERS (res) = 0;
+  LOOP_VINFO_COST_MODEL_THRESHOLD (res) = 0;
   LOOP_VINFO_VECTORIZABLE_P (res) = 0;
   LOOP_VINFO_PEELING_FOR_ALIGNMENT (res) = 0;
   LOOP_VINFO_VECT_FACTOR (res) = 0;
@@ -1579,6 +1580,8 @@ vect_analyze_loop_operations (loop_vec_info loop_vinfo, bool slp)
           || min_profitable_iters > min_scalar_loop_bound))
     th = (unsigned) min_profitable_iters;
 
+  LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo) = th;
+
   if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
       && LOOP_VINFO_INT_NITERS (loop_vinfo) <= th)
     {
@@ -1625,6 +1628,7 @@ vect_analyze_loop_2 (loop_vec_info loop_vinfo)
   bool ok, slp = false;
   int max_vf = MAX_VECTORIZATION_FACTOR;
   int min_vf = 2;
+  unsigned int th;
 
   /* Find all data references in the loop (which correspond to vdefs/vuses)
      and analyze their evolution in the loop.  Also adjust the minimal
@@ -1769,6 +1773,10 @@ vect_analyze_loop_2 (loop_vec_info loop_vinfo)
 
   /* Decide whether we need to create an epilogue loop to handle
      remaining scalar iterations.  */
+  th = ((LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo) + 1)
+        / LOOP_VINFO_VECT_FACTOR (loop_vinfo))
+       * LOOP_VINFO_VECT_FACTOR (loop_vinfo);
+
   if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
       && LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo) > 0)
     {
@@ -1779,7 +1787,14 @@ vect_analyze_loop_2 (loop_vec_info loop_vinfo)
     }
   else if (LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo)
           || (tree_ctz (LOOP_VINFO_NITERS (loop_vinfo))
-              < (unsigned)exact_log2 (LOOP_VINFO_VECT_FACTOR (loop_vinfo))))
+              < (unsigned)exact_log2 (LOOP_VINFO_VECT_FACTOR (loop_vinfo))
+               /* In case of versioning, check if the maximum number of
+                  iterations is greater than th.  If they are identical,
+                  the epilogue is unnecessary.  */
+              && ((!LOOP_REQUIRES_VERSIONING_FOR_ALIAS (loop_vinfo)
+                   && !LOOP_REQUIRES_VERSIONING_FOR_ALIGNMENT (loop_vinfo))
+                   || (unsigned HOST_WIDE_INT)max_stmt_executions_int
+                       (LOOP_VINFO_LOOP (loop_vinfo)) > th)))
     LOOP_VINFO_PEELING_FOR_NITER (loop_vinfo) = true;
 
   /* If an epilogue loop is required make sure we can create one.  */
@@ -5775,9 +5790,7 @@ vect_transform_loop (loop_vec_info loop_vinfo)
      by our caller.  If the threshold makes all loops profitable that
      run at least the vectorization factor number of times checking
      is pointless, too.  */
-  th = ((PARAM_VALUE (PARAM_MIN_VECT_LOOP_BOUND)
-        * LOOP_VINFO_VECT_FACTOR (loop_vinfo)) - 1);
-  th = MAX (th, LOOP_VINFO_COST_MODEL_MIN_ITERS (loop_vinfo));
+  th = LOOP_VINFO_COST_MODEL_THRESHOLD (loop_vinfo);
   if (th >= LOOP_VINFO_VECT_FACTOR (loop_vinfo) - 1
       && !LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo))
     {
index f8efe471e065f95a03533bec93bd067a7b341414..f2087e22383bcee08545c71633d3294f7f23f2bc 100644 (file)
@@ -264,6 +264,11 @@ typedef struct _loop_vec_info {
             values unknown at compile time.  */
   int min_profitable_iters;
 
+  /* Threshold of number of iterations below which vectorzation will not be
+     performed. It is calculated from MIN_PROFITABLE_ITERS and
+     PARAM_MIN_VECT_LOOP_BOUND.  */
+  unsigned int th;
+
   /* Is the loop vectorizable? */
   bool vectorizable;
 
@@ -382,6 +387,7 @@ typedef struct _loop_vec_info {
    cost model.  */
 #define LOOP_VINFO_NITERS_UNCHANGED(L)     (L)->num_iters_unchanged
 #define LOOP_VINFO_COST_MODEL_MIN_ITERS(L) (L)->min_profitable_iters
+#define LOOP_VINFO_COST_MODEL_THRESHOLD(L) (L)->th
 #define LOOP_VINFO_VECTORIZABLE_P(L)       (L)->vectorizable
 #define LOOP_VINFO_VECT_FACTOR(L)          (L)->vectorization_factor
 #define LOOP_VINFO_PTR_MASK(L)             (L)->ptr_mask