On Wed, 7 Aug 2024, Xi Ruoyao wrote:

> The check was implemented incorrectly, so vec_widen_smult_{even,odd}_M
> was never used.  This is not good for targets with native even/odd
> widening multiplication but not lo/hi multiplication.
> 
> The fix is actually developed by Richard Biener.

OK.

Thanks,
Richard.

> gcc/ChangeLog:
> 
>       PR tree-optimization/116142
>       * tree-vect-stmts.cc (supportable_widening_operation): Remove an
>       redundant and incorrect vect_reduction_def check, and fix the
>       operand of another vect_reduction_def check.
> 
> gcc/testsuite/ChangeLog:
>       PR tree-optimization/116142
>       * gcc.target/i386/pr116142.c: New test.
> ---
> 
> Bootstrapped and regtested on x86_64-linux-gnu.  Ok for trunk?
> 
>  gcc/testsuite/gcc.target/i386/pr116142.c | 18 ++++++++++++++++++
>  gcc/tree-vect-stmts.cc                   |  3 +--
>  2 files changed, 19 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr116142.c
> 
> diff --git a/gcc/testsuite/gcc.target/i386/pr116142.c 
> b/gcc/testsuite/gcc.target/i386/pr116142.c
> new file mode 100644
> index 00000000000..d288a50b237
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr116142.c
> @@ -0,0 +1,18 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -mavx512f -fdump-tree-optimized" } */
> +/* { dg-final { scan-tree-dump "WIDEN_MULT_EVEN_EXPR" "optimized" } } */
> +/* { dg-final { scan-tree-dump "WIDEN_MULT_ODD_EXPR" "optimized" } } */
> +
> +typedef __INT32_TYPE__ i32;
> +typedef __INT64_TYPE__ i64;
> +
> +i32 x[16], y[16];
> +
> +i64
> +test (void)
> +{
> +  i64 ret = 0;
> +  for (int i = 0; i < 16; i++)
> +    ret ^= (i64) x[i] * y[i];
> +  return ret;
> +}
> diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
> index 20cae83e820..385e63163c2 100644
> --- a/gcc/tree-vect-stmts.cc
> +++ b/gcc/tree-vect-stmts.cc
> @@ -14179,7 +14179,6 @@ supportable_widening_operation (vec_info *vinfo,
>        are properly set up for the caller.  If we fail, we'll continue with
>        a VEC_WIDEN_MULT_LO/HI_EXPR check.  */
>        if (vect_loop
> -       && STMT_VINFO_RELEVANT (stmt_info) == vect_used_by_reduction
>         && !nested_in_vect_loop_p (vect_loop, stmt_info)
>         && supportable_widening_operation (vinfo, VEC_WIDEN_MULT_EVEN_EXPR,
>                                            stmt_info, vectype_out,
> @@ -14192,7 +14191,7 @@ supportable_widening_operation (vec_info *vinfo,
>               same operation.  One such an example is s += a * b, where 
> elements
>               in a and b cannot be reordered.  Here we check if the vector 
> defined
>               by STMT is only directly used in the reduction statement.  */
> -       tree lhs = gimple_assign_lhs (stmt_info->stmt);
> +       tree lhs = gimple_assign_lhs (vect_orig_stmt (stmt_info)->stmt);
>         stmt_vec_info use_stmt_info = loop_info->lookup_single_use (lhs);
>         if (use_stmt_info
>             && STMT_VINFO_DEF_TYPE (use_stmt_info) == vect_reduction_def)
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to