On Fri, Jul 10, 2026 at 6:15 PM Robin Dapp <[email protected]> wrote: > > 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 | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc > index 3908cad5714..7bcc02535d4 100644 > --- a/gcc/tree-vect-loop.cc > +++ b/gcc/tree-vect-loop.cc > @@ -4160,8 +4160,21 @@ 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 number of &&s in the assumptions. */ > + auto count_conditions = [](tree *t, int *, void *nconditions) -> tree > + { > + if (TREE_CODE (*t) == TRUTH_AND_EXPR)
given we cost scalar_stmts don't we want EXPR_P ( *t) here? Thus not only count &&s, but also compares? Possibly repeated use of 'niter' when building the condition should have used a SAVE_EXPR (or double-check that gimplification will not unshare). Otherwise OK. > + (*(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 >
