diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr98854.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr98854.c new file mode 100644 index 0000000000000000000000000000000000000000..0c8141e1d17ad5e5e8c909cc65776b6b8f182ec6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr98854.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ + +double a[1024]; + +int bar(); +void foo (int n) +{ + double x = 0, y = 0; + int i = 1023; + do + { + x += a[i] + a[i+1]; + y += a[i] / a[i+1]; + if (bar ()) + break; + } + while (--i); + /* We want to avoid vectorizing the LC PHI and insert vector CTORs + inside of the loop where it is only needed here. */ + a[0] = x; + a[1] = y; +} + +/* { dg-final { scan-tree-dump-not "vectorizing SLP node starting from: ._\[0-9\]+ = PHI" "slp1" } } */ diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 4465cf7494ee1608e34ed1091ac2c0428cd4de2e..10b876ff5ede8896eb95abd22f716e458c99416d 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -1896,7 +1896,10 @@ fail: n_vector_builds++; } } - if (all_uniform_p || n_vector_builds > 1) + if (all_uniform_p + || n_vector_builds > 1 + || (n_vector_builds == children.length () + && is_a <gphi *> (stmt_info->stmt))) { /* Roll back. */ matches[0] = false;