aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-10-28 13:42:03 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-10-28 13:42:03 +0000
commit97c6bea819ec0a773041308e62a7c05c33f093b0 (patch)
treefd82c1940beb67c5d5fae3fcd85d1f4ef7a94fc8 /gcc/tree-vect-loop.c
parent14c835a01ceac44e685589489b46ffaabd034177 (diff)
downloadgcc-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.c19
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));