vect: Don't consider branch costs if no peeled iterations
authorKewen Lin <linkw@linux.ibm.com>
Fri, 31 Jul 2020 12:49:39 +0000 (07:49 -0500)
committerKewen Lin <linkw@linux.ibm.com>
Fri, 31 Jul 2020 13:16:42 +0000 (08:16 -0500)
Currently vectorizer cost modeling counts branch taken costs for
prologue and epilogue if the number of iterations is unknown.
But it isn't sensible if there are no peeled iterations.

This patch is to guard them under peel_iters_prologue > 0 or
peel_iters_epilogue > 0.

Bootstrapped/regtested on powerpc64le-linux-gnu and aarch64-linux-gnu.

gcc/ChangeLog:

* tree-vect-loop.c (vect_get_known_peeling_cost): Don't consider branch
taken costs for prologue and epilogue if they don't exist.
(vect_estimate_min_profitable_iters): Likewise.

gcc/testsuite/ChangeLog:

* gcc.target/aarch64/sve/cost_model_2.c: Adjust due to cost model
change.

gcc/testsuite/gcc.target/aarch64/sve/cost_model_2.c
gcc/tree-vect-loop.c

index d9d7078..a7d7483 100644 (file)
@@ -9,4 +9,4 @@ vset (int *restrict dst, int *restrict src, int count)
       *dst++ = 1;
 }
 
-/* { dg-final { scan-assembler-times {\tst1w\tz} 1 } } */
+/* { dg-final { scan-assembler-times {\tstr\tq} 1 } } */
index 185019c..43ec4fb 100644 (file)
@@ -3520,10 +3520,12 @@ vect_get_known_peeling_cost (loop_vec_info loop_vinfo, int peel_iters_prologue,
     {
       /* If peeled iterations are known but number of scalar loop
         iterations are unknown, count a taken branch per peeled loop.  */
-      retval = record_stmt_cost (prologue_cost_vec, 1, cond_branch_taken, NULL,
-                                NULL_TREE, 0, vect_prologue);
-      retval += record_stmt_cost (epilogue_cost_vec, 1, cond_branch_taken, NULL,
-                                 NULL_TREE, 0, vect_epilogue);
+      if (peel_iters_prologue > 0)
+       retval = record_stmt_cost (prologue_cost_vec, 1, cond_branch_taken,
+                                  NULL, NULL_TREE, 0, vect_prologue);
+      if (*peel_iters_epilogue > 0)
+       retval += record_stmt_cost (epilogue_cost_vec, 1, cond_branch_taken,
+                                   NULL, NULL_TREE, 0, vect_epilogue);
     }
 
   stmt_info_for_cost *si;
@@ -3670,7 +3672,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo,
   bool prologue_need_br_not_taken_cost = false;
 
   /* Calculate peel_iters_prologue.  */
-  if (LOOP_VINFO_FULLY_MASKED_P (loop_vinfo))
+  if (vect_use_loop_mask_for_alignment_p (loop_vinfo))
     peel_iters_prologue = 0;
   else if (npeel < 0)
     {
@@ -3689,7 +3691,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo,
   else
     {
       peel_iters_prologue = npeel;
-      if (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo))
+      if (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo) && peel_iters_prologue > 0)
        /* If peeled iterations are known but number of scalar loop
           iterations are unknown, count a taken branch per peeled loop.  */
        prologue_need_br_taken_cost = true;
@@ -3719,7 +3721,7 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo,
   else
     {
       peel_iters_epilogue = vect_get_peel_iters_epilogue (loop_vinfo, npeel);
-      if (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo))
+      if (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo) && peel_iters_epilogue > 0)
        /* If peeled iterations are known but number of scalar loop
           iterations are unknown, count a taken branch per peeled loop.  */
        epilogue_need_br_taken_cost = true;