diff options
author | Richard Biener <rguenther@suse.de> | 2019-10-28 13:42:03 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-10-28 13:42:03 +0000 |
commit | 97c6bea819ec0a773041308e62a7c05c33f093b0 (patch) | |
tree | fd82c1940beb67c5d5fae3fcd85d1f4ef7a94fc8 /gcc/tree-vect-loop.c | |
parent | 14c835a01ceac44e685589489b46ffaabd034177 (diff) | |
download | gcc-97c6bea819ec0a773041308e62a7c05c33f093b0.zip gcc-97c6bea819ec0a773041308e62a7c05c33f093b0.tar.gz gcc-97c6bea819ec0a773041308e62a7c05c33f093b0.tar.bz2 |
re PR tree-optimization/92241 (ice in vect_mark_pattern_st mts, at tree-vect-patterns.c:5175)
2019-10-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/92241
* tree-vect-loop.c (vect_fixup_scalar_cycles_with_patterns): When
we failed to update the reduction index do not use the pattern
stmts for the reduction chain.
(vectorizable_reduction): When the reduction chain is corrupt,
fail.
* tree-vect-patterns.c (vect_mark_pattern_stmts): Stop when we
fail to update the reduction chain.
* gcc.dg/torture/pr92241.c: New testcase.
From-SVN: r277516
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r-- | gcc/tree-vect-loop.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 14d072b..d11a1f9 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -689,13 +689,16 @@ vect_fixup_scalar_cycles_with_patterns (loop_vec_info loop_vinfo) stmt_vec_info next = REDUC_GROUP_NEXT_ELEMENT (first); while (next) { - if (! STMT_VINFO_IN_PATTERN_P (next)) + if (! STMT_VINFO_IN_PATTERN_P (next) + || STMT_VINFO_REDUC_IDX (STMT_VINFO_RELATED_STMT (next)) == -1) break; next = REDUC_GROUP_NEXT_ELEMENT (next); } - /* If not all stmt in the chain are patterns try to handle - the chain without patterns. */ - if (! next) + /* If not all stmt in the chain are patterns or if we failed + to update STMT_VINFO_REDUC_IDX try to handle the chain + without patterns. */ + if (! next + && STMT_VINFO_REDUC_IDX (STMT_VINFO_RELATED_STMT (first)) != -1) { vect_fixup_reduc_chain (first); LOOP_VINFO_REDUCTION_CHAINS (loop_vinfo)[i] @@ -5730,7 +5733,13 @@ vectorizable_reduction (stmt_vec_info stmt_info, slp_tree slp_node, { stmt_vec_info def = loop_vinfo->lookup_def (reduc_def); def = vect_stmt_to_vectorize (def); - gcc_assert (STMT_VINFO_REDUC_IDX (def) != -1); + if (STMT_VINFO_REDUC_IDX (def) == -1) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "reduction chain broken by patterns.\n"); + return false; + } if (!REDUC_GROUP_FIRST_ELEMENT (def)) only_slp_reduc_chain = false; reduc_def = gimple_op (def->stmt, 1 + STMT_VINFO_REDUC_IDX (def)); |