diff options
author | Richard Biener <rguenther@suse.de> | 2019-10-25 08:08:44 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-10-25 08:08:44 +0000 |
commit | ea133b14f48ed5730748a7e02e322fb07ccc2d85 (patch) | |
tree | c5952a91138d366ad57f8295ba59f1dd378ed1ab /gcc/tree-vect-patterns.c | |
parent | a0f9baa2952727d22ed55fdd8c6eb3c75a0864e0 (diff) | |
download | gcc-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.c | 52 |
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 |