This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH][RFC] Do some vectorizer-friendly canonicalization before vectorization
- From: Dorit Nuzman <DORIT at il dot ibm dot com>
- To: Richard Guenther <rguenther at suse dot de>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Thu, 23 Nov 2006 16:21:31 +0200
- Subject: Re: [PATCH][RFC] Do some vectorizer-friendly canonicalization before vectorization
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.
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"