https://gcc.gnu.org/g:ca8d97f8cb8d282c190183e9c297d5e0490bab4e
commit r16-6133-gca8d97f8cb8d282c190183e9c297d5e0490bab4e Author: Victor Do Nascimento <[email protected]> Date: Thu May 8 15:28:05 2025 +0100 vect: Relax known iteration number constraint At present we reject uncounted loops outright when doing initial loop analysis in `vect_analyze_loop_form'. We have the following gating condition that causes rejection of a given loop: if (integer_zerop (info->assumptions) || !info->number_of_iterations || chrec_contains_undetermined (info->number_of_iterations)) We can do away with this check altogether, but not without problems, allowing many malformed loops through which ought to be rejected as early as possible. We observe that a common thread running through these malformed loops is the absence of any scalar evolution between iterations. We have therefore adjusted the analysis replacing the checks on `niters' for a test for the presence of scalar evolution in the loop, which can be detected via the presence of phi nodes in the loop. gcc/ChangeLog: * tree-vect-loop.cc (vect_analyze_loop_form): Relax niters condition. Diff: --- gcc/tree-vect-loop.cc | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index 9b435c78c21b..00b21ecfc958 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -1473,6 +1473,20 @@ vect_analyze_loop_form (class loop *loop, gimple *loop_vectorized_call, "not vectorized:" " unsupported control flow in loop.\n"); } + + /* Check if we have any control flow that doesn't leave the loop. */ + bool has_phi = false; + for (unsigned i = 0; i < loop->num_nodes; i++) + if (!gimple_seq_empty_p (phi_nodes (bbs[i]))) + { + has_phi = true; + break; + } + if (!has_phi) + return opt_result::failure_at (vect_location, + "not vectorized:" + " no scalar evolution detected in loop.\n"); + free (bbs); /* Different restrictions apply when we are considering an inner-most loop, @@ -1597,9 +1611,20 @@ vect_analyze_loop_form (class loop *loop, gimple *loop_vectorized_call, std::swap (info->conds[0], info->conds[i]); } - if (integer_zerop (info->assumptions) - || !info->number_of_iterations - || chrec_contains_undetermined (info->number_of_iterations)) + if (chrec_contains_undetermined (info->number_of_iterations)) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_NOTE, vect_location, + "Loop being analyzed as uncounted.\n"); + if (loop->inner) + return opt_result::failure_at + (vect_location, + "not vectorized: outer loop vectorization of uncounted loops" + " is unsupported.\n"); + return opt_result::success (); + } + + if (integer_zerop (info->assumptions)) return opt_result::failure_at (info->conds[0], "not vectorized: number of iterations cannot be computed.\n");
