[PATCH][RFC] Do some vectorizer-friendly canonicalization before vectorization

Richard Guenther rguenther@suse.de
Thu Nov 23 14:47:00 GMT 2006


On Thu, 23 Nov 2006, Dorit Nuzman wrote:

> Richard Guenther <rguenther@suse.de> wrote on 23/11/2006 12:39:40:
> 
> > The following passes for me on x86_64-unknown-linux-gnu.  Can you check
> > it works on ppc?
> >
> 
> sure:
> 
> the fast-math test passes, but the second test ICEs:
> 
> /home/dorit/mainline_dn/build/gcc/xgcc -B/home/dorit/mainline_dn/build/gcc/
> /home/dorit/mainline_dn/gcc/gcc/testsuite/gcc.dg/vect/no-math-errno-vect-pow-2.c
>    -O2 -ftree-vectorize -maltivec -fdump-tree-vect-details -fno-math-errno
> -fno-show-column -S  -o no-math-errno-vect-pow-2.s
> /home/dorit/mainline_dn/gcc/gcc/testsuite/gcc.dg/vect/no-math-errno-vect-pow-2.c:
>  In function ?foo?:
> /home/dorit/mainline_dn/gcc/gcc/testsuite/gcc.dg/vect/no-math-errno-vect-pow-2.c:7:
>  internal compiler error: Segmentation fault
> 
> gdb:
> Program received signal SIGSEGV, Segmentation fault.
> 0x104f9460 in vect_pattern_recog (loop_vinfo=Variable "loop_vinfo" is not
> available.
> ) at ../../gcc/gcc/tree-vect-patterns.c:631
> 631       if (VECTOR_MODE_P (TYPE_MODE (type_in)))
> (gdb)
> 
> This is because 'base' (in vect_recog_pow_pattern) is actually of type
> 'double' (not 'float' as we would have expected), because there's a cast to
> double - this is the dump before the vectorizer:
> 
> foo ()
> {
>   unsigned int ivtmp.34;
>   int pretmp.27;
>   int i;
>   float D.1999;
>   double D.1998;
>   double D.1997;
>   float D.1996;
> 
> <bb 2>:
> 
>   # ivtmp.34_1 = PHI <ivtmp.34_2(4), 256(2)>;
>   # i_15 = PHI <i_12(4), 0(2)>;
> <L0>:;
>   D.1996_7 = x[i_15];
>   D.1997_8 = (double) D.1996_7;
>   D.1998_9 = __builtin_pow (D.1997_8, 5.0e-1);
>   D.1999_10 = (float) D.1998_9;
>   x[i_15] = D.1999_10;
>   i_12 = i_15 + 1;
>   ivtmp.34_2 = ivtmp.34_1 - 1;
>   if (ivtmp.34_2 != 0) goto <L5>; else goto <L2>;
> 
> <L5>:;
>   goto <bb 3> (<L0>);
> 
> <L2>:;
>   return;
> 
> 
> So this line probably fails to find a vectype:
> *type_in = get_vectype_for_scalar_type (TREE_TYPE (base));
> and we don't check for that...
> 
> We need to check for target-support even if it's not a new tree-code, like
> it's done in the other vect_recog_X_pattern functions.

Ok, so consider the pow (x, 0.5) pattern matching removed until the
function vectorizing is approved (where we then can check for support).

Richard.

> 
> Gotta run now,
> 
> dorit
> 
> 
> > Thanks,
> > Richard.
> >
> > 2006-11-23  Richard Guenther  <rguenther@suse.de>
> >
> >    * tree-vect-patterns.c (vect_recog_pow_pattern): Set
> >    type_in to scalar type in recognition of squaring.
> >
> >    * gcc.dg/vect/vect.exp: Add support for -fno-math-errno tests.
> >    * gcc.dg/vect/vect-pow-1.c: Rename ...
> >    * gcc.dg/vect/fast-math-vect-pow-1.c: ... to this.  Use
> >    floats instead of doubles, check successful vectorization.
> >    * gcc.dg/vect/vect-pow-2.c: Rename ...
> >    * gcc.dg/vect/no-math-errno-vect-pow-1.c: .. to this.  Use
> >    floats instead of doubles.
> >
> > Index: tree-vect-patterns.c
> > ===================================================================
> > *** tree-vect-patterns.c   (revision 119115)
> > --- tree-vect-patterns.c   (working copy)
> > *************** vect_recog_pow_pattern (tree last_stmt,
> > *** 466,472 ****
> >     /* We now have a pow or powi builtin function call with a constant
> >        exponent.  */
> >
> > -   *type_in = get_vectype_for_scalar_type (TREE_TYPE (base));
> >     *type_out = NULL_TREE;
> >
> >     /* Catch squaring.  */
> > --- 466,471 ----
> > *************** vect_recog_pow_pattern (tree last_stmt,
> > *** 474,480 ****
> >          && tree_low_cst (exp, 0) == 2)
> >         || (TREE_CODE (exp) == REAL_CST
> >             && REAL_VALUES_EQUAL (TREE_REAL_CST (exp), dconst2)))
> > !     return build2 (MULT_EXPR, TREE_TYPE (base), base, base);
> >
> >     /* Catch square root.  */
> >     if (TREE_CODE (exp) == REAL_CST
> > --- 473,482 ----
> >          && tree_low_cst (exp, 0) == 2)
> >         || (TREE_CODE (exp) == REAL_CST
> >             && REAL_VALUES_EQUAL (TREE_REAL_CST (exp), dconst2)))
> > !     {
> > !       *type_in = TREE_TYPE (base);
> > !       return build2 (MULT_EXPR, TREE_TYPE (base), base, base);
> > !     }
> >
> >     /* Catch square root.  */
> >     if (TREE_CODE (exp) == REAL_CST
> > *************** vect_recog_pow_pattern (tree last_stmt,
> > *** 482,487 ****
> > --- 484,490 ----
> >       {
> >         tree newfn = mathfn_built_in (TREE_TYPE (base), BUILT_IN_SQRT);
> >         tree newarglist = build_tree_list (NULL_TREE, base);
> > +       *type_in = get_vectype_for_scalar_type (TREE_TYPE (base));
> >         return build_function_call_expr (newfn, newarglist);
> >       }
> 
> upto here it
> >
> > Index: testsuite/gcc.dg/vect/vect-pow-1.c
> > ===================================================================
> > *** testsuite/gcc.dg/vect/vect-pow-1.c   (revision 119115)
> > --- testsuite/gcc.dg/vect/vect-pow-1.c   (working copy)
> > ***************
> > *** 1,14 ****
> > - /* { dg-do compile } */
> > - /* { dg-options "-O2 -ftree-vectorize -ffast-math -fdump-tree-
> > vect-details" } */
> > -
> > - double x[256];
> > -
> > - void foo(void)
> > - {
> > -   int i;
> > -   for (i=0; i<256; ++i)
> > -     x[i] = x[i] * x[i];
> > - }
> > -
> > - /* { dg-final { scan-tree-dump "pattern recognized" "vect" } } */
> > - /* { dg-final { cleanup-tree-dump "vect" } } */
> > --- 0 ----
> > Index: testsuite/gcc.dg/vect/vect-pow-2.c
> > ===================================================================
> > *** testsuite/gcc.dg/vect/vect-pow-2.c   (revision 119115)
> > --- testsuite/gcc.dg/vect/vect-pow-2.c   (working copy)
> > ***************
> > *** 1,14 ****
> > - /* { dg-do compile } */
> > - /* { dg-options "-O2 -ftree-vectorize -fno-math-errno -fdump-tree-
> > vect-details" } */
> > -
> > - double x[256];
> > -
> > - void foo(void)
> > - {
> > -   int i;
> > -   for (i=0; i<256; ++i)
> > -     x[i] = __builtin_pow (x[i], 0.5);
> > - }
> > -
> > - /* { dg-final { scan-tree-dump "pattern recognized" "vect" } } */
> > - /* { dg-final { cleanup-tree-dump "vect" } } */
> > --- 0 ----
> > Index: testsuite/gcc.dg/vect/fast-math-vect-pow-1.c
> > ===================================================================
> > *** testsuite/gcc.dg/vect/fast-math-vect-pow-1.c   (revision 119115)
> > --- testsuite/gcc.dg/vect/fast-math-vect-pow-1.c   (working copy)
> > ***************
> > *** 1,7 ****
> >   /* { dg-do compile } */
> > ! /* { dg-options "-O2 -ftree-vectorize -ffast-math -fdump-tree-
> > vect-details" } */
> >
> > ! double x[256];
> >
> >   void foo(void)
> >   {
> > --- 1,7 ----
> >   /* { dg-do compile } */
> > ! /* { dg-require-effective-target vect_float } */
> >
> > ! float x[256];
> >
> >   void foo(void)
> >   {
> > *************** void foo(void)
> > *** 10,14 ****
> >       x[i] = x[i] * x[i];
> >   }
> >
> > ! /* { dg-final { scan-tree-dump "pattern recognized" "vect" } } */
> >   /* { dg-final { cleanup-tree-dump "vect" } } */
> > --- 10,14 ----
> >       x[i] = x[i] * x[i];
> >   }
> >
> > ! /* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } } */
> >   /* { dg-final { cleanup-tree-dump "vect" } } */
> > Index: testsuite/gcc.dg/vect/no-math-errno-vect-pow-1.c
> > ===================================================================
> > *** testsuite/gcc.dg/vect/no-math-errno-vect-pow-1.c   (revision 119115)
> > --- testsuite/gcc.dg/vect/no-math-errno-vect-pow-1.c   (working copy)
> > ***************
> > *** 1,13 ****
> >   /* { dg-do compile } */
> > ! /* { dg-options "-O2 -ftree-vectorize -fno-math-errno -fdump-tree-
> > vect-details" } */
> >
> > ! double x[256];
> >
> >   void foo(void)
> >   {
> >     int i;
> >     for (i=0; i<256; ++i)
> > !     x[i] = __builtin_pow (x[i], 0.5);
> >   }
> >
> >   /* { dg-final { scan-tree-dump "pattern recognized" "vect" } } */
> > --- 1,13 ----
> >   /* { dg-do compile } */
> > ! /* { dg-require-effective-target vect_float } */
> >
> > ! float x[256];
> >
> >   void foo(void)
> >   {
> >     int i;
> >     for (i=0; i<256; ++i)
> > !     x[i] = __builtin_powf (x[i], 0.5);
> >   }
> >
> >   /* { dg-final { scan-tree-dump "pattern recognized" "vect" } } */
> > Index: testsuite/gcc.dg/vect/vect.exp
> > ===================================================================
> > *** testsuite/gcc.dg/vect/vect.exp   (revision 119115)
> > --- testsuite/gcc.dg/vect/vect.exp   (working copy)
> > *************** lappend DEFAULT_VECTCFLAGS "-ffast-math"
> > *** 97,102 ****
> > --- 97,108 ----
> >   dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/fast-math-
> > vect*.\[cS\]]]  \
> >      "" $DEFAULT_VECTCFLAGS
> >
> > + # -fno-math-errno tests
> > + set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
> > + lappend DEFAULT_VECTCFLAGS "-fno-math-errno"
> > + dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/no-math-errno-
> > vect*.\[cS\]]]  \
> > +    "" $DEFAULT_VECTCFLAGS
> > +
> >   # -fwrapv tests
> >   set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
> >   lappend DEFAULT_VECTCFLAGS "-fwrapv"

--
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs



More information about the Gcc-patches mailing list