diff options
author | Richard Biener <rguenther@suse.de> | 2020-05-27 11:18:01 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-05-27 13:08:22 +0200 |
commit | a5d8d86e8a72736bfd8a2ce8aa427dec896a442e (patch) | |
tree | 524f6bc72dad41a980d93dbfa733bbdf4c18c828 /gcc | |
parent | e247d59274f99520657403fd31320eeea6be92c8 (diff) | |
download | gcc-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.c | 13 | ||||
-rw-r--r-- | gcc/tree-vect-slp.c | 7 |
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; } |