On Fri, Aug 4, 2023 at 9:16 AM Jan Hubicka via Gcc-patches
<[email protected]> wrote:
>
> Hi,
> this prevents useless loop distribiton produced in hmmer. With FDO we now
> correctly work out that the loop created for last iteraiton is not going to
> iterate however loop distribution still produces a verioned loop that has no
> chance to survive loop vectorizer since we only keep distributed loops
> when loop vectorization suceeds and it requires number of (header) iterations
> to exceed the vectorization factor.
>
> Bootstrapped/regtested x86_64-linux, OK?
OK.
But why does optimize_loop_for_speed_p () return true when the loop
isn't expected to iterate? Wouldn't that be a better place to fix this
and similar issues in other places then?
Thanks,
Richard.
> gcc/ChangeLog:
>
> * tree-loop-distribution.cc (loop_distribution::execute): Disable
> distribution for loops with estimated iterations 0.
>
> diff --git a/gcc/tree-loop-distribution.cc b/gcc/tree-loop-distribution.cc
> index cf7c197aaf7..8ff2108f284 100644
> --- a/gcc/tree-loop-distribution.cc
> +++ b/gcc/tree-loop-distribution.cc
> @@ -3871,10 +3871,20 @@ loop_distribution::execute (function *fun)
>
> bool destroy_p;
> int nb_generated_loops, nb_generated_calls;
> + bool only_patterns = !optimize_loop_for_speed_p (loop)
> + || !flag_tree_loop_distribution;
> + /* do not try to distribute loops that are not expected to iterate.
> */
> + if (!only_patterns)
> + {
> + HOST_WIDE_INT iterations = estimated_loop_iterations_int (loop);
> + if (iterations < 0)
> + iterations = likely_max_loop_iterations_int (loop);
> + if (!iterations)
> + only_patterns = true;
> + }
> nb_generated_loops
> = distribute_loop (loop, work_list, cd, &nb_generated_calls,
> - &destroy_p, (!optimize_loop_for_speed_p (loop)
> - || !flag_tree_loop_distribution));
> + &destroy_p, only_patterns);
> if (destroy_p)
> loops_to_be_destroyed.safe_push (loop);
>