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-loop.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-loop.c')
-rw-r--r-- | gcc/tree-vect-loop.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 9c5ce47..d0fd7bdb 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -5719,7 +5719,19 @@ vectorizable_reduction (stmt_vec_info stmt_info, slp_tree slp_node, /* PHIs should not participate in patterns. */ gcc_assert (!STMT_VINFO_RELATED_STMT (phi_info)); gphi *reduc_def_phi = as_a <gphi *> (phi_info->stmt); - tree reduc_def = PHI_RESULT (reduc_def_phi); + + /* Verify following REDUC_IDX from the latch def leads us back to the PHI. */ + tree reduc_def = PHI_ARG_DEF_FROM_EDGE (reduc_def_phi, + loop_latch_edge (loop)); + while (reduc_def != PHI_RESULT (reduc_def_phi)) + { + stmt_vec_info def = loop_vinfo->lookup_def (reduc_def); + def = vect_stmt_to_vectorize (def); + gcc_assert (STMT_VINFO_REDUC_IDX (def) != -1); + reduc_def = gimple_op (def->stmt, 1 + STMT_VINFO_REDUC_IDX (def)); + } + + reduc_def = PHI_RESULT (reduc_def_phi); int reduc_index = -1; for (i = 0; i < op_type; i++) { |