aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2023-08-06 22:33:33 +0200
committerJan Hubicka <jh@suse.cz>2023-08-06 22:33:33 +0200
commite3e6db43640fadc9aa41c5459d43e5541d83f29a (patch)
tree09b5bbaa638b70e5436af91924f4e36644659062
parent838237aeeba578fc2cf42bfd3ecb9d9a4fb7a2b4 (diff)
downloadgcc-e3e6db43640fadc9aa41c5459d43e5541d83f29a.zip
gcc-e3e6db43640fadc9aa41c5459d43e5541d83f29a.tar.gz
gcc-e3e6db43640fadc9aa41c5459d43e5541d83f29a.tar.bz2
Disable loop distribution for loops with estimated iterations 0
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.
-rw-r--r--gcc/tree-loop-distribution.cc15
1 files changed, 13 insertions, 2 deletions
diff --git a/gcc/tree-loop-distribution.cc b/gcc/tree-loop-distribution.cc
index cf7c197..a28470b 100644
--- a/gcc/tree-loop-distribution.cc
+++ b/gcc/tree-loop-distribution.cc
@@ -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);