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