On Tue, Jul 24, 2018 at 12:10 PM Richard Sandiford <richard.sandif...@arm.com> wrote: > > This patch makes free_stmt_vec_info take the stmt_vec_info that > it's supposed to free and makes it free only that stmt_vec_info. > Callers need to update the statement mapping where necessary > (but now there are only a couple of callers). > > This in turns means that we can leave ~vec_info to do the actual > freeing, since there's no longer a need to do it before resetting > the gimple_uids.
OK. > > 2018-07-24 Richard Sandiford <richard.sandif...@arm.com> > > gcc/ > * tree-vectorizer.h (free_stmt_vec_info): Take a stmt_vec_info > rather than a gimple stmt. > * tree-vect-stmts.c (free_stmt_vec_info): Likewise. Don't free > information for pattern statements when passed the original > statement; instead wait to be passed the pattern statement itself. > Don't call set_vinfo_for_stmt here. > (free_stmt_vec_infos): Update call to free_stmt_vec_info. > * tree-vect-loop.c (_loop_vec_info::~loop_vec_info): Don't free > stmt_vec_infos here. > * tree-vect-slp.c (_bb_vec_info::~bb_vec_info): Likewise. > * tree-vectorizer.c (vec_info::remove_stmt): Nullify the statement's > stmt_vec_infos entry. > > Index: gcc/tree-vectorizer.h > =================================================================== > --- gcc/tree-vectorizer.h 2018-07-24 10:24:22.684311906 +0100 > +++ gcc/tree-vectorizer.h 2018-07-24 10:24:26.084281700 +0100 > @@ -1484,7 +1484,7 @@ extern bool supportable_narrowing_operat > enum tree_code *, > int *, vec<tree> *); > extern stmt_vec_info new_stmt_vec_info (gimple *stmt, vec_info *); > -extern void free_stmt_vec_info (gimple *stmt); > +extern void free_stmt_vec_info (stmt_vec_info); > extern unsigned record_stmt_cost (stmt_vector_for_cost *, int, > enum vect_cost_for_stmt, stmt_vec_info, > int, enum vect_cost_model_location); > Index: gcc/tree-vect-stmts.c > =================================================================== > --- gcc/tree-vect-stmts.c 2018-07-24 10:24:22.684311906 +0100 > +++ gcc/tree-vect-stmts.c 2018-07-24 10:24:26.084281700 +0100 > @@ -9916,7 +9916,7 @@ free_stmt_vec_infos (vec<stmt_vec_info> > stmt_vec_info info; > FOR_EACH_VEC_ELT (*v, i, info) > if (info != NULL_STMT_VEC_INFO) > - free_stmt_vec_info (STMT_VINFO_STMT (info)); > + free_stmt_vec_info (info); > if (v == stmt_vec_info_vec) > stmt_vec_info_vec = NULL; > v->release (); > @@ -9926,44 +9926,18 @@ free_stmt_vec_infos (vec<stmt_vec_info> > /* Free stmt vectorization related info. */ > > void > -free_stmt_vec_info (gimple *stmt) > +free_stmt_vec_info (stmt_vec_info stmt_info) > { > - stmt_vec_info stmt_info = vinfo_for_stmt (stmt); > - > - if (!stmt_info) > - return; > - > - /* Check if this statement has a related "pattern stmt" > - (introduced by the vectorizer during the pattern recognition > - pass). Free pattern's stmt_vec_info and def stmt's stmt_vec_info > - too. */ > - if (STMT_VINFO_IN_PATTERN_P (stmt_info)) > + if (stmt_info->pattern_stmt_p) > { > - if (gimple_seq seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info)) > - for (gimple_stmt_iterator si = gsi_start (seq); > - !gsi_end_p (si); gsi_next (&si)) > - { > - gimple *seq_stmt = gsi_stmt (si); > - gimple_set_bb (seq_stmt, NULL); > - tree lhs = gimple_get_lhs (seq_stmt); > - if (lhs && TREE_CODE (lhs) == SSA_NAME) > - release_ssa_name (lhs); > - free_stmt_vec_info (seq_stmt); > - } > - stmt_vec_info patt_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info); > - if (patt_stmt_info) > - { > - gimple_set_bb (patt_stmt_info->stmt, NULL); > - tree lhs = gimple_get_lhs (patt_stmt_info->stmt); > - if (lhs && TREE_CODE (lhs) == SSA_NAME) > - release_ssa_name (lhs); > - free_stmt_vec_info (patt_stmt_info); > - } > + gimple_set_bb (stmt_info->stmt, NULL); > + tree lhs = gimple_get_lhs (stmt_info->stmt); > + if (lhs && TREE_CODE (lhs) == SSA_NAME) > + release_ssa_name (lhs); > } > > STMT_VINFO_SAME_ALIGN_REFS (stmt_info).release (); > STMT_VINFO_SIMD_CLONE_INFO (stmt_info).release (); > - set_vinfo_for_stmt (stmt, NULL); > free (stmt_info); > } > > Index: gcc/tree-vect-loop.c > =================================================================== > --- gcc/tree-vect-loop.c 2018-07-24 10:24:19.540339838 +0100 > +++ gcc/tree-vect-loop.c 2018-07-24 10:24:26.080281735 +0100 > @@ -894,9 +894,6 @@ _loop_vec_info::~_loop_vec_info () > for (j = 0; j < nbbs; j++) > { > basic_block bb = bbs[j]; > - for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si)) > - free_stmt_vec_info (gsi_stmt (si)); > - > for (si = gsi_start_bb (bb); !gsi_end_p (si); ) > { > gimple *stmt = gsi_stmt (si); > @@ -936,9 +933,6 @@ _loop_vec_info::~_loop_vec_info () > } > } > } > - > - /* Free stmt_vec_info. */ > - free_stmt_vec_info (stmt); > gsi_next (&si); > } > } > Index: gcc/tree-vect-slp.c > =================================================================== > --- gcc/tree-vect-slp.c 2018-07-24 10:24:22.680311942 +0100 > +++ gcc/tree-vect-slp.c 2018-07-24 10:24:26.080281735 +0100 > @@ -2490,17 +2490,8 @@ _bb_vec_info::~_bb_vec_info () > { > for (gimple_stmt_iterator si = region_begin; > gsi_stmt (si) != gsi_stmt (region_end); gsi_next (&si)) > - { > - gimple *stmt = gsi_stmt (si); > - stmt_vec_info stmt_info = vinfo_for_stmt (stmt); > - > - if (stmt_info) > - /* Free stmt_vec_info. */ > - free_stmt_vec_info (stmt); > - > - /* Reset region marker. */ > - gimple_set_uid (stmt, -1); > - } > + /* Reset region marker. */ > + gimple_set_uid (gsi_stmt (si), -1); > > bb->aux = NULL; > } > Index: gcc/tree-vectorizer.c > =================================================================== > --- gcc/tree-vectorizer.c 2018-07-24 10:24:22.684311906 +0100 > +++ gcc/tree-vectorizer.c 2018-07-24 10:24:26.084281700 +0100 > @@ -584,6 +584,7 @@ vec_info::lookup_dr (data_reference *dr) > vec_info::remove_stmt (stmt_vec_info stmt_info) > { > gcc_assert (!stmt_info->pattern_stmt_p); > + set_vinfo_for_stmt (stmt_info->stmt, NULL); > gimple_stmt_iterator si = gsi_for_stmt (stmt_info->stmt); > unlink_stmt_vdef (stmt_info->stmt); > gsi_remove (&si, true);