2018-06-20 Richard Sandiford <richard.sandiford@arm.com>
+ * 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 <richard.sandiford@arm.com>
+
* 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.
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))
{
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);
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
{
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
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);
}
}
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