Record the loop masks needed for EXTRACT_LAST_REDUCTIONs

Richard Sandiford richard.sandiford@arm.com
Tue Dec 10 11:34:00 GMT 2019


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?

Richard


2019-12-10  Richard Sandiford  <richard.sandiford@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);
+}



More information about the Gcc-patches mailing list