[PATCH] Allow useless type changes between vectype of builtin arguments (PR tree-optimization/91723)

Richard Sandiford richard.sandiford@arm.com
Wed Sep 11 08:13:00 GMT 2019


Jakub Jelinek <jakub@redhat.com> writes:

> Hi!
>
> This testcase used to be vectorized before r260348, but isn't any longer.
> The problem is that while we check with types_compatible_p:
>       /* We can only handle calls with arguments of the same type.  */
>       if (rhs_type
>           && !types_compatible_p (rhs_type, TREE_TYPE (op)))
> we required pointer equality for the corresponding vectypes, which isn't
> true on the testcase, where two arguments are const float and have const
> vector of float vectype, while the last one is float and has vector of float
> vectype.
>
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk and 9.3 after a while?
>
> 2019-09-11  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR tree-optimization/91723
> 	* tree-vect-stmts.c (vectorizable_call): Use types_compatible_p check
> 	instead of pointer equality when checking if argument vectypes are
> 	the same.
>
> 	* gcc.dg/vect/vect-fma-3.c: New test.

OK, thanks.

Richard

> --- gcc/tree-vect-stmts.c.jj	2019-08-27 23:01:31.000000000 +0200
> +++ gcc/tree-vect-stmts.c	2019-09-10 20:28:18.646389500 +0200
> @@ -3308,7 +3308,7 @@ vectorizable_call (stmt_vec_info stmt_in
>        if (!vectype_in)
>  	vectype_in = vectypes[i];
>        else if (vectypes[i]
> -	       && vectypes[i] != vectype_in)
> +	       && !types_compatible_p (vectypes[i], vectype_in))
>  	{
>  	  if (dump_enabled_p ())
>  	    dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
> --- gcc/testsuite/gcc.dg/vect/vect-fma-3.c.jj	2019-09-10 20:39:57.219889700 +0200
> +++ gcc/testsuite/gcc.dg/vect/vect-fma-3.c	2019-09-10 20:44:11.297055814 +0200
> @@ -0,0 +1,17 @@
> +/* PR tree-optimization/91723 */
> +/* { dg-do compile { target { scalar_all_fma || { i?86-*-* x86_64-*-* } } } } */
> +/* { dg-additional-options "-mfma" { target { i?86-*-* x86_64-*-* } } } */
> +
> +void
> +foo (double *restrict r, const double *restrict a,
> +     const double *restrict b, const double *restrict c)
> +{
> +  for (int i = 0; i < 1024; i++)
> +    {
> +      double x = __builtin_fma (a[i], b[i], c[i]);
> +      x = __builtin_fma (a[i], b[i], x);
> +      r[i] = x;
> +    }
> +}
> +
> +/* { dg-final { scan-tree-dump-times "LOOP VECTORIZED" 1 "vect" { target vect_double } } } */
>
> 	Jakub



More information about the Gcc-patches mailing list