Commit 27071013 by Richard Sandiford Committed by Richard Sandiford

Move EXTRACT_LAST_REDUCTION costing to vectorizable_condition

gcc.target/aarch64/sve/clastb_[57].c started failing after the increase
in the cost of vec_to_scalar (r278452).  The problem is that we were
double-counting the cost of the CLASTB: once in vect_model_reduction_cost
as a vec_to_scalar and once in vectorizable_condition as a plain
vector_stmt.

Based on the TODO above vect_model_reduction_cost, I think the
preferred long-term direction is for vectorizable_* to cost these
things itself, so that's what the patch does (for this one case only).

2019-11-22  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* tree-vect-stmts.c (vect_model_simple_cost): Take an optional
	vect_cost_for_stmt.
	(vectorizable_condition): Calculate the cost of EXTRACT_LAST_REDUCTION
	here rather than...
	* tree-vect-loop.c (vect_model_reduction_cost): ...here.

From-SVN: r278611
parent d9c50233
2019-11-22 Richard Sandiford <richard.sandiford@arm.com>
* tree-vect-stmts.c (vect_model_simple_cost): Take an optional
vect_cost_for_stmt.
(vectorizable_condition): Calculate the cost of EXTRACT_LAST_REDUCTION
here rather than...
* tree-vect-loop.c (vect_model_reduction_cost): ...here.
2019-11-22 Claudiu Zissulescu <claziss@synopsys.com> 2019-11-22 Claudiu Zissulescu <claziss@synopsys.com>
* config/arc/arc.md (bic_f): Use cc_set_register predicate. * config/arc/arc.md (bic_f): Use cc_set_register predicate.
...@@ -3924,8 +3924,11 @@ vect_model_reduction_cost (stmt_vec_info stmt_info, internal_fn reduc_fn, ...@@ -3924,8 +3924,11 @@ vect_model_reduction_cost (stmt_vec_info stmt_info, internal_fn reduc_fn,
code = gimple_assign_rhs_code (orig_stmt_info->stmt); code = gimple_assign_rhs_code (orig_stmt_info->stmt);
if (reduction_type == EXTRACT_LAST_REDUCTION if (reduction_type == EXTRACT_LAST_REDUCTION)
|| reduction_type == FOLD_LEFT_REDUCTION) /* No extra instructions are needed in the prologue. The loop body
operations are costed in vectorizable_condition. */
inside_cost = 0;
else if (reduction_type == FOLD_LEFT_REDUCTION)
{ {
/* No extra instructions needed in the prologue. */ /* No extra instructions needed in the prologue. */
prologue_cost = 0; prologue_cost = 0;
......
...@@ -860,7 +860,8 @@ vect_model_simple_cost (stmt_vec_info stmt_info, int ncopies, ...@@ -860,7 +860,8 @@ vect_model_simple_cost (stmt_vec_info stmt_info, int ncopies,
enum vect_def_type *dt, enum vect_def_type *dt,
int ndts, int ndts,
slp_tree node, slp_tree node,
stmt_vector_for_cost *cost_vec) stmt_vector_for_cost *cost_vec,
vect_cost_for_stmt kind = vector_stmt)
{ {
int inside_cost = 0, prologue_cost = 0; int inside_cost = 0, prologue_cost = 0;
...@@ -907,7 +908,7 @@ vect_model_simple_cost (stmt_vec_info stmt_info, int ncopies, ...@@ -907,7 +908,7 @@ vect_model_simple_cost (stmt_vec_info stmt_info, int ncopies,
} }
/* Pass the inside-of-loop statements to the target-specific cost model. */ /* Pass the inside-of-loop statements to the target-specific cost model. */
inside_cost += record_stmt_cost (cost_vec, ncopies, vector_stmt, inside_cost += record_stmt_cost (cost_vec, ncopies, kind,
stmt_info, 0, vect_body); stmt_info, 0, vect_body);
if (dump_enabled_p ()) if (dump_enabled_p ())
...@@ -10084,15 +10085,18 @@ vectorizable_condition (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi, ...@@ -10084,15 +10085,18 @@ vectorizable_condition (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
return false; return false;
} }
} }
if (expand_vec_cond_expr_p (vectype, comp_vectype,
cond_code)) vect_cost_for_stmt kind = vector_stmt;
{ if (reduction_type == EXTRACT_LAST_REDUCTION)
STMT_VINFO_TYPE (stmt_info) = condition_vec_info_type; /* Count one reduction-like operation per vector. */
vect_model_simple_cost (stmt_info, ncopies, dts, ndts, slp_node, kind = vec_to_scalar;
cost_vec); else if (!expand_vec_cond_expr_p (vectype, comp_vectype, cond_code))
return true; return false;
}
return false; STMT_VINFO_TYPE (stmt_info) = condition_vec_info_type;
vect_model_simple_cost (stmt_info, ncopies, dts, ndts, slp_node,
cost_vec, kind);
return true;
} }
/* Transform. */ /* Transform. */
......
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