aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-05-27 11:18:01 +0200
committerRichard Biener <rguenther@suse.de>2020-05-27 13:08:22 +0200
commita5d8d86e8a72736bfd8a2ce8aa427dec896a442e (patch)
tree524f6bc72dad41a980d93dbfa733bbdf4c18c828 /gcc
parente247d59274f99520657403fd31320eeea6be92c8 (diff)
downloadgcc-a5d8d86e8a72736bfd8a2ce8aa427dec896a442e.zip
gcc-a5d8d86e8a72736bfd8a2ce8aa427dec896a442e.tar.gz
gcc-a5d8d86e8a72736bfd8a2ce8aa427dec896a442e.tar.bz2
tree-optimization/95335 - fix SLP nodes dropped to invariant
When we drop a SLP node to invariant because we cannot vectorize it we have to make sure to revisit it in the users. 2020-05-27 Richard Biener <rguenther@suse.de> PR tree-optimization/95335 * tree-vect-slp.c (vect_slp_analyze_node_operations): Reset lvisited for nodes made external. * gcc.dg/vect/bb-slp-pr95335.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/vect/bb-slp-pr95335.c13
-rw-r--r--gcc/tree-vect-slp.c7
2 files changed, 19 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr95335.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr95335.c
new file mode 100644
index 0000000..42a7022
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr95335.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+
+float *a;
+float b;
+void
+fn1(float p1[][3])
+{
+ float c, d, e, f;
+ f = a[1] * a[1] * d;
+ b = a[1] * a[2] * d;
+ p1[1][1] = f + c;
+ p1[1][2] = b + e;
+}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index c0c9afd..a6c5a9d 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -2915,7 +2915,12 @@ vect_slp_analyze_node_operations (vec_info *vinfo, slp_tree node,
/* If this node can't be vectorized, try pruning the tree here rather
than felling the whole thing. */
if (!res && vect_slp_convert_to_external (vinfo, node, node_instance))
- res = true;
+ {
+ /* We'll need to revisit this for invariant costing and number
+ of vectorized stmt setting. */
+ lvisited.remove (node);
+ res = true;
+ }
return res;
}