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 d9d707893d88205bb47029b5ba26106b3756cfd2..a7d748397d6cb702aa724228f83d99cf92ccc828 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 185019c3305ae9495180ac06c1f3c977b3fbdccf..43ec4fb04d5637dc8dbb89f326bc8704edf3654a 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;