tree-optimization/98854 - avoid some PHI BB vectorization

This avoids cases of PHI node vectorization that just causes us
to insert vector CTORs inside loops for values only required
outside of the loop.

2021-01-27  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/98854
	* tree-vect-slp.c (vect_build_slp_tree_2): Also build
	PHIs from scalars when the number of CTORs matches the
	number of children.

	* gcc.dg/vect/bb-slp-pr98854.c: New testcase.
This commit is contained in:
Richard Biener 2021-01-27 15:20:58 +01:00
parent 3fd10728cb
commit c91db798ec
2 changed files with 28 additions and 1 deletions

View File

@ -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" } } */

View File

@ -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;