From: Robin Dapp <[email protected]>
This patch adjusts niter-condition costing. Instead of just one
vector statements, it counts the number of ANDed terms and costs
that many scalar statements.
gcc/ChangeLog:
* tree-vect-loop.cc (vect_estimate_min_profitable_iters): Adjust
niter condition costing.
---
gcc/tree-vect-loop.cc | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 54f8912b894..410bf7aca4b 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -4128,8 +4128,23 @@ vect_estimate_min_profitable_iters (loop_vec_info
loop_vinfo,
/* Requires loop versioning with niter checks. */
if (LOOP_REQUIRES_VERSIONING_FOR_NITERS (loop_vinfo))
{
+ tree assum = LOOP_VINFO_NITERS_ASSUMPTIONS (loop_vinfo);
+
+ /* Count the ANDs and comparisons in the assumption tree. */
+ auto count_conditions = [] (tree *t, int *, void *nconditions) -> tree
+ {
+ if (EXPR_P (*t)
+ && (TREE_CODE (*t) == BIT_AND_EXPR
+ || TREE_CODE_CLASS (TREE_CODE (*t)) == tcc_comparison))
+ (*(int *) nconditions)++;
+ return NULL_TREE;
+ };
+
+ int nconditions = 0;
+ walk_tree_without_duplicates (&assum, count_conditions, &nconditions);
+
/* FIXME: Make cost depend on complexity of individual check. */
- (void) add_stmt_cost (target_cost_data, 1, vector_stmt,
+ (void) add_stmt_cost (target_cost_data, nconditions, scalar_stmt,
NULL, NULL, NULL_TREE, 0, vect_prologue);
if (dump_enabled_p ())
dump_printf (MSG_NOTE,
--
2.54.0