aboutsummaryrefslogtreecommitdiff
path: root/gcc
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
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')
-rw-r--r--gcc/testsuite/gfortran.dg/vect/pr99721.f9011
-rw-r--r--gcc/tree-vect-slp.c15
2 files changed, 25 insertions, 1 deletions
diff --git a/gcc/testsuite/gfortran.dg/vect/pr99721.f90 b/gcc/testsuite/gfortran.dg/vect/pr99721.f90
new file mode 100644
index 0000000..651e86a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/vect/pr99721.f90
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! { dg-additional-options "-O3" }
+! { dg-additional-options "-march=armv8.3-a" { target aarch64-*-* } }
+subroutine sub_c
+ complex, dimension(2,3) :: at
+ complex, dimension(2,4) :: b
+ complex, dimension(3,4) :: c
+ data b / (41., 43.), 0, 0, 0, 0, 0, 0, 0/
+ c = matmul(transpose(at), b)
+ if (any (c /= cres)) stop
+end subroutine sub_c
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)