aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-slp.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-03-23 09:10:17 +0100
committerRichard Biener <rguenther@suse.de>2021-03-23 10:50:04 +0100
commitffa6a7fba1f87b6b47763882be411a339061492d (patch)
tree0b5285e83c389a7c14bf01d65845ab6f26f0434f /gcc/tree-vect-slp.c
parentfffefe3d9d1715f83c82331f2265e040f42d09fe (diff)
downloadgcc-ffa6a7fba1f87b6b47763882be411a339061492d.zip
gcc-ffa6a7fba1f87b6b47763882be411a339061492d.tar.gz
gcc-ffa6a7fba1f87b6b47763882be411a339061492d.tar.bz2
tree-optimization/99721 - avoid SLP nodes we cannot schedule
This makes sure we'll not run into SLP scheduling issues later by rejecting all-constant children nodes without any scalar stmts early. 2021-03-23 Richard Biener <rguenther@suse.de> PR tree-optimization/99721 * tree-vect-slp.c (vect_slp_analyze_node_operations): Make sure we can schedule the node. * gfortran.dg/vect/pr99721.f90: New testcase.
Diffstat (limited to 'gcc/tree-vect-slp.c')
-rw-r--r--gcc/tree-vect-slp.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 0d24be7..f1a2b5d 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -3893,7 +3893,7 @@ vect_slp_analyze_node_operations (vec_info *vinfo, slp_tree node,
{
if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location,
- "Failed cyclic SLP reference in %p", node);
+ "Failed cyclic SLP reference in %p\n", node);
return false;
}
gcc_assert (SLP_TREE_DEF_TYPE (node) == vect_internal_def);
@@ -3907,6 +3907,7 @@ vect_slp_analyze_node_operations (vec_info *vinfo, slp_tree node,
bool res = true;
unsigned visited_rec_start = visited_vec.length ();
unsigned cost_vec_rec_start = cost_vec->length ();
+ bool seen_non_constant_child = false;
FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child)
{
res = vect_slp_analyze_node_operations (vinfo, child, node_instance,
@@ -3914,6 +3915,18 @@ vect_slp_analyze_node_operations (vec_info *vinfo, slp_tree node,
cost_vec);
if (!res)
break;
+ if (child && SLP_TREE_DEF_TYPE (child) != vect_constant_def)
+ seen_non_constant_child = true;
+ }
+ /* We're having difficulties scheduling nodes with just constant
+ operands and no scalar stmts since we then cannot compute a stmt
+ insertion place. */
+ if (!seen_non_constant_child && SLP_TREE_SCALAR_STMTS (node).is_empty ())
+ {
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_NOTE, vect_location,
+ "Cannot vectorize all-constant op node %p\n", node);
+ res = false;
}
if (res)