diff options
author | Richard Biener <rguenther@suse.de> | 2021-10-27 13:14:41 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-11-05 09:03:11 +0100 |
commit | 33f1d038708a793a498076c8647165613ec90661 (patch) | |
tree | c6936eac2ebbcf5ab579621361d4aa61be8b6dee /gcc/tree-vectorizer.h | |
parent | 614b39757b8b61f70ac1c666edb7a01a5fc19cd4 (diff) | |
download | gcc-33f1d038708a793a498076c8647165613ec90661.zip gcc-33f1d038708a793a498076c8647165613ec90661.tar.gz gcc-33f1d038708a793a498076c8647165613ec90661.tar.bz2 |
First refactor of vect_analyze_loop
This refactors the main loop analysis part in vect_analyze_loop,
re-purposing the existing vect_reanalyze_as_main_loop for this
to reduce code duplication. Failure flow is a bit tricky since
we want to extract info from the analyzed loop but I wanted to
share the destruction part. Thus I add some std::function and
lambda to funnel post-analysis for the case we want that
(when analyzing from the main iteration but not when re-analyzing
an epilogue as main).
In addition I split vect_analyze_loop_form into analysis and
vinfo creation so we can do the analysis only once, simplifying
the new vect_analyze_loop_1.
As discussed we probably want to change the loop over vector
modes to first only analyze things as the main loop, picking
the best (or simd VF) mode for the main loop and then analyze
for a vectorized epilogue. The unroll would then integrate
with the main loop vectorization. I think that currently
we may fail to analyze the epilogue with the same mode as
the main loop when using partial vectors since we increment
mode_i before doing that.
2021-11-04 Richard Biener <rguenther@suse.de>
* tree-vectorizer.h (struct vect_loop_form_info): New.
(vect_analyze_loop_form): Adjust.
(vect_create_loop_vinfo): New.
* tree-parloops.c (gather_scalar_reductions): Adjust for
vect_analyze_loop_form API change.
* tree-vect-loop.c: Include <functional>.
(vect_analyze_loop_form_1): Rename to vect_analyze_loop_form,
take struct vect_loop_form_info as output parameter and adjust.
(vect_analyze_loop_form): Rename to vect_create_loop_vinfo and
split out call to the original vect_analyze_loop_form_1.
(vect_reanalyze_as_main_loop): Rename to...
(vect_analyze_loop_1): ... this, factor out the call to
vect_analyze_loop_form and generalize to be able to use it twice ...
(vect_analyze_loop): ... here. Perform vect_analyze_loop_form
once only and here.
Diffstat (limited to 'gcc/tree-vectorizer.h')
-rw-r--r-- | gcc/tree-vectorizer.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 76e22ee..3f069e7 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -2152,8 +2152,17 @@ extern bool reduction_fn_for_scalar_code (enum tree_code, internal_fn *); /* Drive for loop transformation stage. */ extern class loop *vect_transform_loop (loop_vec_info, gimple *); -extern opt_loop_vec_info vect_analyze_loop_form (class loop *, - vec_info_shared *); +struct vect_loop_form_info +{ + tree number_of_iterations; + tree number_of_iterationsm1; + tree assumptions; + gcond *loop_cond; + gcond *inner_loop_cond; +}; +extern opt_result vect_analyze_loop_form (class loop *, vect_loop_form_info *); +extern loop_vec_info vect_create_loop_vinfo (class loop *, vec_info_shared *, + const vect_loop_form_info *); extern bool vectorizable_live_operation (vec_info *, stmt_vec_info, gimple_stmt_iterator *, slp_tree, slp_instance, int, |