Commit f1c13d6d by Richard Sandiford Committed by Richard Sandiford

Record the loop masks needed for EXTRACT_LAST_REDUCTIONs

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.

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.

From-SVN: r279163
parent 9ec35478
2019-12-10 Richard Sandiford <richard.sandiford@arm.com>
* tree-vect-stmts.c (vectorizable_condition): Record the loop
masks required for extract-last reductions.
2019-12-10 Richard Sandiford <richard.sandiford@arm.com>
* tree-vect-stmts.c (vect_finish_replace_stmt): Always use the
original scalar statement rather than a pattern statement.
(vectorizable_condition): Likewise, in the handling of extract-last
2019-12-10 Richard Sandiford <richard.sandiford@arm.com>
* gcc.target/aarch64/sve/clastb_9.c: New test.
2019-12-10 Tobias Burnus <tobias@codesourcery.com>
PR fortran/92872
......
/* 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);
}
......@@ -9912,6 +9912,7 @@ vectorizable_condition (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
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 stmt_info, gimple_stmt_iterator *gsi,
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 stmt_info, gimple_stmt_iterator *gsi,
}
}
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. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment