]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Disable loop distribution for loops with estimated iterations 0
authorJan Hubicka <jh@suse.cz>
Sun, 6 Aug 2023 20:33:33 +0000 (22:33 +0200)
committerJan Hubicka <jh@suse.cz>
Sun, 6 Aug 2023 20:33:33 +0000 (22:33 +0200)
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.

gcc/ChangeLog:

* tree-loop-distribution.cc (loop_distribution::execute): Disable
distribution for loops with estimated iterations 0.

gcc/tree-loop-distribution.cc

index cf7c197aaf7919a0ecd56a10db0a42f93707ca58..a28470b66ea935741a61fb73961ed7c927543a3d 100644 (file)
@@ -120,6 +120,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "rtl.h"
 #include "memmodel.h"
 #include "optabs.h"
+#include "tree-ssa-loop-niter.h"
 
 
 #define MAX_DATAREFS_NUM \
@@ -3871,10 +3872,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);