diff options
author | Richard Biener <rguenther@suse.de> | 2024-01-09 11:49:50 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2024-01-09 13:31:20 +0100 |
commit | c22cf7a7a77bf9245bd0790b21695440208c3aa5 (patch) | |
tree | 89625ef7e50cb1dbda0c7350698a7f2a01a35b4d | |
parent | aaa9467618a549608dfe837ef6e0f58581bf3b3a (diff) | |
download | gcc-c22cf7a7a77bf9245bd0790b21695440208c3aa5.zip gcc-c22cf7a7a77bf9245bd0790b21695440208c3aa5.tar.gz gcc-c22cf7a7a77bf9245bd0790b21695440208c3aa5.tar.bz2 |
tree-optimization/113026 - fix vector epilogue maximum iter bound
The late amendment with a limit based on VF was redundant and wrong
for peeled early exits. The following moves the adjustment done
when we don't have a skip edge down to the place where the already
existing VF based max iter check is done and removes the amendment.
PR tree-optimization/113026
* tree-vect-loop-manip.cc (vect_do_peeling): Remove
redundant and wrong niter bound setting. Move niter
bound adjustment down.
-rw-r--r-- | gcc/tree-vect-loop-manip.cc | 47 |
1 files changed, 15 insertions, 32 deletions
diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc index 2313d26..f0ea7fc 100644 --- a/gcc/tree-vect-loop-manip.cc +++ b/gcc/tree-vect-loop-manip.cc @@ -3383,38 +3383,6 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, bb_before_epilog->count = single_pred_edge (bb_before_epilog)->count (); bb_before_epilog = loop_preheader_edge (epilog)->src; } - else - { - /* When we do not have a loop-around edge to the epilog we know - the vector loop covered at least VF scalar iterations unless - we have early breaks and the epilog will cover at most - VF - 1 + gap peeling iterations. - Update any known upper bound with this knowledge. */ - if (! LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) - { - if (epilog->any_upper_bound) - epilog->nb_iterations_upper_bound -= lowest_vf; - if (epilog->any_likely_upper_bound) - epilog->nb_iterations_likely_upper_bound -= lowest_vf; - if (epilog->any_estimate) - epilog->nb_iterations_estimate -= lowest_vf; - } - unsigned HOST_WIDE_INT const_vf; - if (vf.is_constant (&const_vf)) - { - const_vf += LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo) - 1; - if (epilog->any_upper_bound) - epilog->nb_iterations_upper_bound - = wi::umin (epilog->nb_iterations_upper_bound, const_vf); - if (epilog->any_likely_upper_bound) - epilog->nb_iterations_likely_upper_bound - = wi::umin (epilog->nb_iterations_likely_upper_bound, - const_vf); - if (epilog->any_estimate) - epilog->nb_iterations_estimate - = wi::umin (epilog->nb_iterations_estimate, const_vf); - } - } /* If loop is peeled for non-zero constant times, now niters refers to orig_niters - prolog_peeling, it won't overflow even the orig_niters @@ -3505,6 +3473,21 @@ vect_do_peeling (loop_vec_info loop_vinfo, tree niters, tree nitersm1, if (LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) iterate_fix_dominators (CDI_DOMINATORS, doms, false); + /* When we do not have a loop-around edge to the epilog we know + the vector loop covered at least VF scalar iterations unless + we have early breaks. + Update any known upper bound with this knowledge. */ + if (! skip_vector + && ! LOOP_VINFO_EARLY_BREAKS (loop_vinfo)) + { + if (epilog->any_upper_bound) + epilog->nb_iterations_upper_bound -= lowest_vf; + if (epilog->any_likely_upper_bound) + epilog->nb_iterations_likely_upper_bound -= lowest_vf; + if (epilog->any_estimate) + epilog->nb_iterations_estimate -= lowest_vf; + } + unsigned HOST_WIDE_INT bound; if (bound_scalar.is_constant (&bound)) { |