From: Richard Sandiford Date: Wed, 20 Jun 2018 08:06:27 +0000 (+0000) Subject: [2/n] PR85694: Attach a DEF_SEQ only to the original statement X-Git-Tag: upstream/12.2.0~30858 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e3947d809d75c6bc47e600ce490c238006c2de2b;p=platform%2Fupstream%2Fgcc.git [2/n] PR85694: Attach a DEF_SEQ only to the original statement A pattern's PATTERN_DEF_SEQ was attached to both the original statement and the main pattern statement, which made it harder to update later. This patch attaches it to just the original statement. In practice, anything that cared had ready access to both. 2018-06-20 Richard Sandiford gcc/ * tree-vectorizer.h (_stmt_vec_info): Note above pattern_def_seq that the sequence is attached to the original statement rather than the pattern statement. * tree-vect-loop.c (vect_determine_vf_for_stmt): Take the PATTERN_DEF_SEQ from the original statement rather than the main pattern statement. * tree-vect-stmts.c (free_stmt_vec_info): Likewise. * tree-vect-patterns.c (vect_recog_dot_prod_pattern): Likewise. (vect_mark_pattern_stmts): Don't copy the PATTERN_DEF_SEQ. From-SVN: r261785 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 983143f..09ab7d8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,17 @@ 2018-06-20 Richard Sandiford + * tree-vectorizer.h (_stmt_vec_info): Note above pattern_def_seq + that the sequence is attached to the original statement rather + than the pattern statement. + * tree-vect-loop.c (vect_determine_vf_for_stmt): Take the + PATTERN_DEF_SEQ from the original statement rather than + the main pattern statement. + * tree-vect-stmts.c (free_stmt_vec_info): Likewise. + * tree-vect-patterns.c (vect_recog_dot_prod_pattern): Likewise. + (vect_mark_pattern_stmts): Don't copy the PATTERN_DEF_SEQ. + +2018-06-20 Richard Sandiford + * tree-vect-stmts.c (vect_analyze_stmt): Move the handling of pattern definition statements before the early exit for statements that aren't live or relevant. diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index b07fcde..5a73a97 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -224,10 +224,10 @@ vect_determine_vf_for_stmt (stmt_vec_info stmt_info, poly_uint64 *vf, if (STMT_VINFO_IN_PATTERN_P (stmt_info) && STMT_VINFO_RELATED_STMT (stmt_info)) { + gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info); stmt_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info)); /* If a pattern statement has def stmts, analyze them too. */ - gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info); for (gimple_stmt_iterator si = gsi_start (pattern_def_seq); !gsi_end_p (si); gsi_next (&si)) { @@ -2247,10 +2247,10 @@ again: STMT_SLP_TYPE (stmt_info) = loop_vect; if (STMT_VINFO_IN_PATTERN_P (stmt_info)) { + gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info); stmt_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info)); STMT_SLP_TYPE (stmt_info) = loop_vect; - for (gimple_stmt_iterator pi - = gsi_start (STMT_VINFO_PATTERN_DEF_SEQ (stmt_info)); + for (gimple_stmt_iterator pi = gsi_start (pattern_def_seq); !gsi_end_p (pi); gsi_next (&pi)) { gimple *pstmt = gsi_stmt (pi); diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index 19d4ea9..5d0543f 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -405,13 +405,13 @@ vect_recog_dot_prod_pattern (vec *stmts, tree *type_in, stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo); if (gimple_assign_rhs_code (stmt) != WIDEN_MULT_EXPR) return NULL; + STMT_VINFO_PATTERN_DEF_SEQ (vinfo_for_stmt (last_stmt)) + = STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo); stmt_vinfo = vinfo_for_stmt (stmt); gcc_assert (stmt_vinfo); gcc_assert (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_internal_def); oprnd00 = gimple_assign_rhs1 (stmt); oprnd01 = gimple_assign_rhs2 (stmt); - STMT_VINFO_PATTERN_DEF_SEQ (vinfo_for_stmt (last_stmt)) - = STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo); } else { @@ -4433,28 +4433,23 @@ vect_mark_pattern_stmts (gimple *orig_stmt, gimple *pattern_stmt, STMT_VINFO_VECTYPE (pattern_stmt_info) = pattern_vectype; STMT_VINFO_IN_PATTERN_P (orig_stmt_info) = true; STMT_VINFO_RELATED_STMT (orig_stmt_info) = pattern_stmt; - STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info) - = STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt_info); - if (STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info)) - { - gimple_stmt_iterator si; - for (si = gsi_start (STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info)); - !gsi_end_p (si); gsi_next (&si)) - { - def_stmt = gsi_stmt (si); - def_stmt_info = vinfo_for_stmt (def_stmt); - if (def_stmt_info == NULL) - { - def_stmt_info = new_stmt_vec_info (def_stmt, vinfo); - set_vinfo_for_stmt (def_stmt, def_stmt_info); - } - gimple_set_bb (def_stmt, gimple_bb (orig_stmt)); - STMT_VINFO_RELATED_STMT (def_stmt_info) = orig_stmt; - STMT_VINFO_DEF_TYPE (def_stmt_info) = vect_internal_def; - if (STMT_VINFO_VECTYPE (def_stmt_info) == NULL_TREE) - STMT_VINFO_VECTYPE (def_stmt_info) = pattern_vectype; - } - } + if (gimple *def_seq = STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt_info)) + for (gimple_stmt_iterator si = gsi_start (def_seq); + !gsi_end_p (si); gsi_next (&si)) + { + def_stmt = gsi_stmt (si); + def_stmt_info = vinfo_for_stmt (def_stmt); + if (def_stmt_info == NULL) + { + def_stmt_info = new_stmt_vec_info (def_stmt, vinfo); + set_vinfo_for_stmt (def_stmt, def_stmt_info); + } + gimple_set_bb (def_stmt, gimple_bb (orig_stmt)); + STMT_VINFO_RELATED_STMT (def_stmt_info) = orig_stmt; + STMT_VINFO_DEF_TYPE (def_stmt_info) = vect_internal_def; + if (STMT_VINFO_VECTYPE (def_stmt_info) == NULL_TREE) + STMT_VINFO_VECTYPE (def_stmt_info) = pattern_vectype; + } } /* Function vect_pattern_recog_1 diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 047edcd..af58d91 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -9876,29 +9876,26 @@ free_stmt_vec_info (gimple *stmt) too. */ if (STMT_VINFO_IN_PATTERN_P (stmt_info)) { + 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_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info)); if (patt_info) { - gimple_seq seq = STMT_VINFO_PATTERN_DEF_SEQ (patt_info); gimple *patt_stmt = STMT_VINFO_STMT (patt_info); gimple_set_bb (patt_stmt, NULL); tree lhs = gimple_get_lhs (patt_stmt); if (lhs && TREE_CODE (lhs) == SSA_NAME) release_ssa_name (lhs); - if (seq) - { - gimple_stmt_iterator si; - for (si = gsi_start (seq); !gsi_end_p (si); gsi_next (&si)) - { - gimple *seq_stmt = gsi_stmt (si); - gimple_set_bb (seq_stmt, NULL); - lhs = gimple_get_lhs (seq_stmt); - if (lhs && TREE_CODE (lhs) == SSA_NAME) - release_ssa_name (lhs); - free_stmt_vec_info (seq_stmt); - } - } free_stmt_vec_info (patt_stmt); } } diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 8bb9e3e..fce3238 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -796,7 +796,9 @@ typedef struct _stmt_vec_info { pattern). */ gimple *related_stmt; - /* Used to keep a sequence of def stmts of a pattern stmt if such exists. */ + /* Used to keep a sequence of def stmts of a pattern stmt if such exists. + The sequence is attached to the original statement rather than the + pattern statement. */ gimple_seq pattern_def_seq; /* List of datarefs that are known to have the same alignment as the dataref