+2017-07-27 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/81571
+ * tree-vect-slp.c (vect_build_slp_tree): Properly verify reduction
+ PHIs.
+
2017-07-27 Eric Botcazou <ebotcazou@adacore.com>
* config/sparc/sparc.c (sparc_option_override): Set MASK_FSMULD flag
+2017-07-27 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/81571
+ * gcc.dg/torture/pr81571.c: New testcase.
+
2017-07-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/81502
the recursion. */
if (gimple_code (stmt) == GIMPLE_PHI)
{
+ vect_def_type def_type = STMT_VINFO_DEF_TYPE (vinfo_for_stmt (stmt));
/* Induction from different IVs is not supported. */
- if (STMT_VINFO_DEF_TYPE (vinfo_for_stmt (stmt)) == vect_induction_def)
- FOR_EACH_VEC_ELT (stmts, i, stmt)
- if (stmt != stmts[0])
- return NULL;
+ if (def_type == vect_induction_def)
+ {
+ FOR_EACH_VEC_ELT (stmts, i, stmt)
+ if (stmt != stmts[0])
+ return NULL;
+ }
+ else
+ {
+ /* Else def types have to match. */
+ FOR_EACH_VEC_ELT (stmts, i, stmt)
+ {
+ /* But for reduction chains only check on the first stmt. */
+ if (GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt))
+ && GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)) != stmt)
+ continue;
+ if (STMT_VINFO_DEF_TYPE (vinfo_for_stmt (stmt)) != def_type)
+ return NULL;
+ }
+ }
node = vect_create_new_slp_node (stmts);
return node;
}