On Mon, Nov 8, 2021 at 11:59 AM Richard Sandiford via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > target_cost_data is in vec_info but is really specific to > loop_vec_info. This patch moves it there and renames it to > vector_costs, to distinguish it from scalar target costs. > > Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install?
OK. Thanks, Richard. > Richard > > > gcc/ > * tree-vectorizer.h (vec_info::target_cost_data): Replace with... > (_loop_vec_info::vector_costs): ...this. > (LOOP_VINFO_TARGET_COST_DATA): Delete. > * tree-vectorizer.c (vec_info::vec_info): Remove target_cost_data > initialization. > (vec_info::~vec_info): Remove corresponding delete. > * tree-vect-loop.c (_loop_vec_info::_loop_vec_info): Initialize > vector_costs to null. > (_loop_vec_info::~_loop_vec_info): Delete vector_costs. > (vect_analyze_loop_operations): Update after above changes. > (vect_analyze_loop_2): Likewise. > (vect_estimate_min_profitable_iters): Likewise. > * tree-vect-slp.c (vect_slp_analyze_operations): Likewise. > --- > gcc/tree-vect-loop.c | 14 ++++++++------ > gcc/tree-vect-slp.c | 13 ++++++------- > gcc/tree-vectorizer.c | 4 +--- > gcc/tree-vectorizer.h | 7 +++---- > 4 files changed, 18 insertions(+), 20 deletions(-) > > diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c > index a28bb6321d7..b6a631d4384 100644 > --- a/gcc/tree-vect-loop.c > +++ b/gcc/tree-vect-loop.c > @@ -821,6 +821,7 @@ _loop_vec_info::_loop_vec_info (class loop *loop_in, > vec_info_shared *shared) > num_iters (NULL_TREE), > num_iters_unchanged (NULL_TREE), > num_iters_assumptions (NULL_TREE), > + vector_costs (nullptr), > th (0), > versioning_threshold (0), > vectorization_factor (0), > @@ -932,6 +933,7 @@ _loop_vec_info::~_loop_vec_info () > delete ivexpr_map; > delete scan_map; > epilogue_vinfos.release (); > + delete vector_costs; > > /* When we release an epiloge vinfo that we do not intend to use > avoid clearing AUX of the main loop which should continue to > @@ -1765,7 +1767,7 @@ vect_analyze_loop_operations (loop_vec_info loop_vinfo) > } > } /* bbs */ > > - add_stmt_costs (loop_vinfo->target_cost_data, &cost_vec); > + add_stmt_costs (loop_vinfo->vector_costs, &cost_vec); > > /* All operations in the loop are either irrelevant (deal with loop > control, or dead), or only used outside the loop and can be moved > @@ -2375,7 +2377,7 @@ start_over: > LOOP_VINFO_INT_NITERS (loop_vinfo)); > } > > - LOOP_VINFO_TARGET_COST_DATA (loop_vinfo) = init_cost (loop_vinfo, false); > + loop_vinfo->vector_costs = init_cost (loop_vinfo, false); > > /* Analyze the alignment of the data-refs in the loop. > Fail if a data reference is found that cannot be vectorized. */ > @@ -2742,8 +2744,8 @@ again: > LOOP_VINFO_COMP_ALIAS_DDRS (loop_vinfo).release (); > LOOP_VINFO_CHECK_UNEQUAL_ADDRS (loop_vinfo).release (); > /* Reset target cost data. */ > - delete LOOP_VINFO_TARGET_COST_DATA (loop_vinfo); > - LOOP_VINFO_TARGET_COST_DATA (loop_vinfo) = nullptr; > + delete loop_vinfo->vector_costs; > + loop_vinfo->vector_costs = nullptr; > /* Reset accumulated rgroup information. */ > release_vec_loop_controls (&LOOP_VINFO_MASKS (loop_vinfo)); > release_vec_loop_controls (&LOOP_VINFO_LENS (loop_vinfo)); > @@ -3919,7 +3921,7 @@ vect_estimate_min_profitable_iters (loop_vec_info > loop_vinfo, > int scalar_outside_cost = 0; > int assumed_vf = vect_vf_for_cost (loop_vinfo); > int npeel = LOOP_VINFO_PEELING_FOR_ALIGNMENT (loop_vinfo); > - vector_costs *target_cost_data = LOOP_VINFO_TARGET_COST_DATA (loop_vinfo); > + vector_costs *target_cost_data = loop_vinfo->vector_costs; > > /* Cost model disabled. */ > if (unlimited_cost_model (LOOP_VINFO_LOOP (loop_vinfo))) > @@ -4265,7 +4267,7 @@ vect_estimate_min_profitable_iters (loop_vec_info > loop_vinfo, > } > > /* Complete the target-specific cost calculations. */ > - finish_cost (LOOP_VINFO_TARGET_COST_DATA (loop_vinfo), &vec_prologue_cost, > + finish_cost (loop_vinfo->vector_costs, &vec_prologue_cost, > &vec_inside_cost, &vec_epilogue_cost); > > vec_outside_cost = (int)(vec_prologue_cost + vec_epilogue_cost); > diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c > index 7e1061c8c4e..d437bfd20d0 100644 > --- a/gcc/tree-vect-slp.c > +++ b/gcc/tree-vect-slp.c > @@ -4889,16 +4889,15 @@ vect_slp_analyze_operations (vec_info *vinfo) > else > { > i++; > - > - /* For BB vectorization remember the SLP graph entry > - cost for later. */ > - if (is_a <bb_vec_info> (vinfo)) > - instance->cost_vec = cost_vec; > - else > + if (loop_vec_info loop_vinfo = dyn_cast<loop_vec_info> (vinfo)) > { > - add_stmt_costs (vinfo->target_cost_data, &cost_vec); > + add_stmt_costs (loop_vinfo->vector_costs, &cost_vec); > cost_vec.release (); > } > + else > + /* For BB vectorization remember the SLP graph entry > + cost for later. */ > + instance->cost_vec = cost_vec; > } > } > > diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c > index a2e13acb6d2..9ef76ce654b 100644 > --- a/gcc/tree-vectorizer.c > +++ b/gcc/tree-vectorizer.c > @@ -459,8 +459,7 @@ shrink_simd_arrays > vec_info::vec_info (vec_info::vec_kind kind_in, vec_info_shared *shared_) > : kind (kind_in), > shared (shared_), > - stmt_vec_info_ro (false), > - target_cost_data (nullptr) > + stmt_vec_info_ro (false) > { > stmt_vec_infos.create (50); > } > @@ -470,7 +469,6 @@ vec_info::~vec_info () > for (slp_instance &instance : slp_instances) > vect_free_slp_instance (instance); > > - delete target_cost_data; > free_stmt_vec_infos (); > } > > diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h > index b552e9dccce..1cd6cc036f2 100644 > --- a/gcc/tree-vectorizer.h > +++ b/gcc/tree-vectorizer.h > @@ -408,9 +408,6 @@ public: > stmt in the chain. */ > auto_vec<stmt_vec_info> grouped_stores; > > - /* Cost data used by the target cost model. */ > - class vector_costs *target_cost_data; > - > /* The set of vector modes used in the vectorized region. */ > mode_set used_vector_modes; > > @@ -590,6 +587,9 @@ public: > /* Condition under which this loop is analyzed and versioned. */ > tree num_iters_assumptions; > > + /* The cost of the vector code. */ > + class vector_costs *vector_costs; > + > /* Threshold of number of iterations below which vectorization will not be > performed. It is calculated from MIN_PROFITABLE_ITERS and > param_min_vect_loop_bound. */ > @@ -843,7 +843,6 @@ public: > #define LOOP_VINFO_SLP_UNROLLING_FACTOR(L) (L)->slp_unrolling_factor > #define LOOP_VINFO_REDUCTIONS(L) (L)->reductions > #define LOOP_VINFO_REDUCTION_CHAINS(L) (L)->reduction_chains > -#define LOOP_VINFO_TARGET_COST_DATA(L) (L)->target_cost_data > #define LOOP_VINFO_PEELING_FOR_GAPS(L) (L)->peeling_for_gaps > #define LOOP_VINFO_PEELING_FOR_NITER(L) (L)->peeling_for_niter > #define LOOP_VINFO_NO_DATA_DEPENDENCIES(L) (L)->no_data_dependencies > -- > 2.25.1