tree-optimization/101505 - properly determine stmt precision for PHIs

Loop vectorization pattern recog fails to walk PHIs when determining
stmt precisions.  This fails to recognize non-mask uses for bools
in PHIs and outer loop vectorization.

2021-07-19  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/101505
	* tree-vect-patterns.c (vect_determine_precisions): Walk
	PHIs also for loop vectorization.

	* gcc.dg/vect/pr101505.c: New testcase.
This commit is contained in:
Richard Biener 2021-07-19 13:29:16 +02:00
parent 9f2bc5077d
commit 8df3ee8f7d
2 changed files with 30 additions and 0 deletions

View File

@ -0,0 +1,16 @@
/* { dg-do compile } */
/* { dg-additional-options "-O1" } */
int n2;
__attribute__ ((simd)) char
w7 (void)
{
short int xb = n2;
int qp;
for (qp = 0; qp < 2; ++qp)
xb = xb < 1;
return xb;
}

View File

@ -5355,6 +5355,13 @@ vect_determine_precisions (vec_info *vinfo)
for (unsigned int i = 0; i < nbbs; i++)
{
basic_block bb = bbs[i];
for (auto gsi = gsi_start_phis (bb);
!gsi_end_p (gsi); gsi_next (&gsi))
{
stmt_vec_info stmt_info = vinfo->lookup_stmt (gsi.phi ());
if (stmt_info)
vect_determine_mask_precision (vinfo, stmt_info);
}
for (auto si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
if (!is_gimple_debug (gsi_stmt (si)))
vect_determine_mask_precision
@ -5368,6 +5375,13 @@ vect_determine_precisions (vec_info *vinfo)
if (!is_gimple_debug (gsi_stmt (si)))
vect_determine_stmt_precisions
(vinfo, vinfo->lookup_stmt (gsi_stmt (si)));
for (auto gsi = gsi_start_phis (bb);
!gsi_end_p (gsi); gsi_next (&gsi))
{
stmt_vec_info stmt_info = vinfo->lookup_stmt (gsi.phi ());
if (stmt_info)
vect_determine_stmt_precisions (vinfo, stmt_info);
}
}
}
else