aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-patterns.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-10-25 08:08:44 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-10-25 08:08:44 +0000
commitea133b14f48ed5730748a7e02e322fb07ccc2d85 (patch)
treec5952a91138d366ad57f8295ba59f1dd378ed1ab /gcc/tree-vect-patterns.c
parenta0f9baa2952727d22ed55fdd8c6eb3c75a0864e0 (diff)
downloadgcc-ea133b14f48ed5730748a7e02e322fb07ccc2d85.zip
gcc-ea133b14f48ed5730748a7e02e322fb07ccc2d85.tar.gz
gcc-ea133b14f48ed5730748a7e02e322fb07ccc2d85.tar.bz2
tree-vect-loop.c (vectorizable_reduction): Verify STMT_VINFO_REDUC_IDX on the to be vectorized stmts is set up correctly.
2019-10-25 Richard Biener <rguenther@suse.de> * tree-vect-loop.c (vectorizable_reduction): Verify STMT_VINFO_REDUC_IDX on the to be vectorized stmts is set up correctly. * tree-vect-patterns.c (vect_mark_pattern_stmts): Transfer STMT_VINFO_REDUC_IDX from the original stmts to the pattern stmts. From-SVN: r277437
Diffstat (limited to 'gcc/tree-vect-patterns.c')
-rw-r--r--gcc/tree-vect-patterns.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
index b497ec9..31e9e2a 100644
--- a/gcc/tree-vect-patterns.c
+++ b/gcc/tree-vect-patterns.c
@@ -5075,6 +5075,7 @@ static inline void
vect_mark_pattern_stmts (stmt_vec_info orig_stmt_info, gimple *pattern_stmt,
tree pattern_vectype)
{
+ stmt_vec_info orig_stmt_info_saved = orig_stmt_info;
gimple *def_seq = STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt_info);
gimple *orig_pattern_stmt = NULL;
@@ -5134,6 +5135,57 @@ vect_mark_pattern_stmts (stmt_vec_info orig_stmt_info, gimple *pattern_stmt,
}
else
vect_set_pattern_stmt (pattern_stmt, orig_stmt_info, pattern_vectype);
+
+ /* Transfer reduction path info to the pattern. */
+ if (STMT_VINFO_REDUC_IDX (orig_stmt_info_saved) != -1)
+ {
+ vec_info *vinfo = orig_stmt_info_saved->vinfo;
+ tree lookfor = gimple_op (orig_stmt_info_saved->stmt,
+ 1 + STMT_VINFO_REDUC_IDX (orig_stmt_info));
+ /* Search the pattern def sequence and the main pattern stmt. Note
+ we may have inserted all into a containing pattern def sequence
+ so the following is a bit awkward. */
+ gimple_stmt_iterator si;
+ gimple *s;
+ if (def_seq)
+ {
+ si = gsi_start (def_seq);
+ s = gsi_stmt (si);
+ gsi_next (&si);
+ }
+ else
+ {
+ si = gsi_none ();
+ s = pattern_stmt;
+ }
+ do
+ {
+ bool found = false;
+ for (unsigned i = 1; i < gimple_num_ops (s); ++i)
+ if (gimple_op (s, i) == lookfor)
+ {
+ STMT_VINFO_REDUC_IDX (vinfo->lookup_stmt (s)) = i - 1;
+ lookfor = gimple_get_lhs (s);
+ found = true;
+ break;
+ }
+ if (found && s == pattern_stmt)
+ break;
+ if (s == pattern_stmt)
+ gcc_unreachable ();
+ if (gsi_end_p (si))
+ s = pattern_stmt;
+ else
+ {
+ s = gsi_stmt (si);
+ if (s == pattern_stmt)
+ /* Found the end inside a bigger pattern def seq. */
+ si = gsi_none ();
+ else
+ gsi_next (&si);
+ }
+ } while (1);
+ }
}
/* Function vect_pattern_recog_1