Allow scalar fallback for pattern root stmt

This adjusts the SLP build to allow a pattern root stmt to be
built from scalars.  I've noticed this in PR98211 where we fail
to promote a SLP subtree to a simple splat operation and instead
emit a series of uniform vector operations.  The bb-slp-div-1.c
testcase is now vectorized on x86_64 but only the store so I
adjusted it to expect the load to be vectorized.

2020-12-10  Richard Biener  <rguenther@suse.de>

	* tree-vect-slp.c (vect_get_and_check_slp_defs): Do
	not mark the defs to occur in a pattern if it is the
	pattern root and record the original stmt defs in that
	case.

	* gcc.dg/vect/bb-slp-div-1.c: Expect the load to be
	vectorized.
This commit is contained in:
Richard Biener 2020-12-10 10:34:32 +01:00
parent 8d63e3c229
commit 154e9b831b
2 changed files with 16 additions and 4 deletions

View File

@ -16,4 +16,7 @@ f (void)
x[7] /= 9;
}
/* { dg-final { scan-tree-dump "optimized: basic block" "slp2" { xfail *-*-* } } } */
/* We can vectorize the store from a CTOR built from scalar division
results but ideally we'd like to see vectorizing the load and the
division as well. */
/* { dg-final { scan-tree-dump "transform load" "slp2" { xfail *-*-* } } } */

View File

@ -544,12 +544,21 @@ vect_get_and_check_slp_defs (vec_info *vinfo, unsigned char swap,
continue;
}
if (def_stmt_info && is_pattern_stmt_p (def_stmt_info))
oprnd_info->any_pattern = true;
oprnd_info->def_stmts.quick_push (def_stmt_info);
oprnd_info->ops.quick_push (oprnd);
if (def_stmt_info
&& is_pattern_stmt_p (def_stmt_info))
{
if (STMT_VINFO_RELATED_STMT (vect_orig_stmt (def_stmt_info))
!= def_stmt_info)
oprnd_info->any_pattern = true;
else
/* If we promote this to external use the original stmt def. */
oprnd_info->ops.last ()
= gimple_get_lhs (vect_orig_stmt (def_stmt_info)->stmt);
}
/* If there's a extern def on a backedge make sure we can
code-generate at the region start.
??? This is another case that could be fixed by adjusting