From 458135c0354f19eb2bd032d42c27076def8c31de Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 31 Jul 2018 14:26:26 +0000 Subject: [PATCH] [43/46] Make free_stmt_vec_info take a stmt_vec_info 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. 2018-07-31 Richard Sandiford 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. From-SVN: r263158 --- gcc/ChangeLog | 15 +++++++++++++++ gcc/tree-vect-loop.c | 6 ------ gcc/tree-vect-slp.c | 13 ++----------- gcc/tree-vect-stmts.c | 40 +++++++--------------------------------- gcc/tree-vectorizer.c | 1 + gcc/tree-vectorizer.h | 2 +- 6 files changed, 26 insertions(+), 51 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bee475c5994..8590a545bae 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2018-07-31 Richard Sandiford + + * 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. + 2018-07-31 Richard Sandiford * tree-vectorizer.h (vec_info::replace_stmt): Declare. diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 6a00695d7ee..840b38c162d 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -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); } } diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index abaddd7adf4..6b6861165b7 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -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; } diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 05f9c5cee8c..12f1cac9ab2 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -9918,7 +9918,7 @@ free_stmt_vec_infos (vec *v) 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 (); @@ -9928,44 +9928,18 @@ free_stmt_vec_infos (vec *v) /* 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); } diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c index 6e647abb694..bb6a154fab5 100644 --- a/gcc/tree-vectorizer.c +++ b/gcc/tree-vectorizer.c @@ -595,6 +595,7 @@ void 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); diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index c7b0515284c..b9aa9c454b5 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -1503,7 +1503,7 @@ extern bool supportable_narrowing_operation (enum tree_code, tree, tree, enum tree_code *, int *, vec *); 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); -- 2.30.2