On December 10, 2019 12:34:33 PM GMT+01:00, Richard Sandiford 
<richard.sandif...@arm.com> wrote:
>The analysis phase of vectorizable_condition wasn't recording the
>loop masks needed by the transform phase.  This meant that the masks
>wouldn't be created in the (rare) case that no other statement needed
>them.
>
>Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?

Ok. 

Richard. 

>Richard
>
>
>2019-12-10  Richard Sandiford  <richard.sandif...@arm.com>
>
>gcc/
>       * tree-vect-stmts.c (vectorizable_condition): Record the loop
>       masks required for extract-last reductions.
>
>gcc/testsuite/
>       * gcc.target/aarch64/sve/clastb_9.c: New test.
>
>Index: gcc/tree-vect-stmts.c
>===================================================================
>--- gcc/tree-vect-stmts.c      2019-12-10 11:33:27.136893420 +0000
>+++ gcc/tree-vect-stmts.c      2019-12-10 11:33:34.084845950 +0000
>@@ -9912,6 +9912,7 @@ vectorizable_condition (stmt_vec_info st
>        vect_unknown_def_type, vect_unknown_def_type};
>   int ndts = 4;
>   int ncopies;
>+  int vec_num;
>  enum tree_code code, cond_code, bitop1 = NOP_EXPR, bitop2 = NOP_EXPR;
>   stmt_vec_info prev_stmt_info = NULL;
>   int i, j;
>@@ -9969,9 +9970,15 @@ vectorizable_condition (stmt_vec_info st
>   tree vectype1 = NULL_TREE, vectype2 = NULL_TREE;
> 
>   if (slp_node)
>-    ncopies = 1;
>+    {
>+      ncopies = 1;
>+      vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node);
>+    }
>   else
>-    ncopies = vect_get_num_copies (loop_vinfo, vectype);
>+    {
>+      ncopies = vect_get_num_copies (loop_vinfo, vectype);
>+      vec_num = 1;
>+    }
> 
>   gcc_assert (ncopies >= 1);
>   if (for_reduction && ncopies > 1)
>@@ -10094,6 +10101,12 @@ vectorizable_condition (stmt_vec_info st
>           }
>       }
> 
>+      if (loop_vinfo
>+        && LOOP_VINFO_CAN_FULLY_MASK_P (loop_vinfo)
>+        && reduction_type == EXTRACT_LAST_REDUCTION)
>+      vect_record_loop_mask (loop_vinfo, &LOOP_VINFO_MASKS (loop_vinfo),
>+                             ncopies * vec_num, vectype, NULL);
>+
>       vect_cost_for_stmt kind = vector_stmt;
>       if (reduction_type == EXTRACT_LAST_REDUCTION)
>       /* Count one reduction-like operation per vector.  */
>Index: gcc/testsuite/gcc.target/aarch64/sve/clastb_9.c
>===================================================================
>--- /dev/null  2019-09-17 11:41:18.176664108 +0100
>+++ gcc/testsuite/gcc.target/aarch64/sve/clastb_9.c    2019-12-10
>11:33:34.080845979 +0000
>@@ -0,0 +1,21 @@
>+/* Originally gcc.dg/vect/O1-pr41008.c.  */
>+/* { dg-options "-O1 -ftree-vectorize -fno-vect-cost-model
>-msve-vector-bits=256" } */
>+
>+double heating[2][2];
>+
>+void foo (int, int);
>+
>+void map_do()
>+{
>+  int jsav, ksav, k, j;
>+
>+  for(k = 0; k < 2; k++)
>+    for(j = 0; j < 2; j++)
>+      if (heating[k][j] > 0.)
>+        {
>+          jsav = j;
>+          ksav = k;
>+        }
>+
>+  foo (jsav, ksav);
>+}

Reply via email to