On Wed, 11 Sep 2019, Jakub Jelinek wrote: > 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?
OK. > 2019-09-11 Jakub Jelinek <ja...@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. > > --- 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 > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 247165 (AG München)