On September 8, 2014 9:09:56 PM CEST, Jakub Jelinek <ja...@redhat.com> wrote: >Hi! > >Cong's patch fixes these two PRs, I've bootstrapped/regtested the >backport >on 4.8 branch together with the new tests, ok for 4.8? >Are the new tests ok for trunk/4.9?
OK. Thanks, Richard. >2014-09-08 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/60196 > PR tree-optimization/63189 > Backported from mainline > 2013-09-17 Cong Hou <co...@google.com> > > * tree-vect-patterns.c (vect_recog_dot_prod_pattern): Fix a bug > when checking the dot production pattern. The type of rhs operand > of multiply is now checked correctly. > > * gcc.dg/vect/pr63189.c: New test. > * gcc.dg/vect/pr60196-1.c: New test. > * gcc.dg/vect/pr60196-2.c: New test. > > Backported from mainline > 2013-09-17 Cong Hou <co...@google.com> > > * gcc.dg/vect/vect-reduc-dot-s16c.c: Add a test case with dot product > on two arrays with short and int types. This should not be recognized > as a dot product pattern. > >--- gcc/tree-vect-patterns.c (revision 202662) >+++ gcc/tree-vect-patterns.c (revision 202663) >@@ -397,7 +397,7 @@ vect_recog_dot_prod_pattern (vec<gimple> > || !promotion) > return NULL; > oprnd00 = gimple_assign_rhs1 (def_stmt); >- if (!type_conversion_p (oprnd0, stmt, true, &half_type1, >&def_stmt, >+ if (!type_conversion_p (oprnd1, stmt, true, &half_type1, >&def_stmt, > &promotion) > || !promotion) > return NULL; >--- gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16c.c (revision 0) >+++ gcc/testsuite/gcc.dg/vect/vect-reduc-dot-s16c.c (revision 202663) >@@ -0,0 +1,73 @@ >+/* { dg-require-effective-target vect_int } */ >+ >+#include <stdarg.h> >+#include "tree-vect.h" >+ >+#define N 64 >+#define DOT 43680 >+ >+signed short X[N] __attribute__ >((__aligned__(__BIGGEST_ALIGNMENT__))); >+signed int Y[N] __attribute__ >((__aligned__(__BIGGEST_ALIGNMENT__))); >+ >+/* (short, int)->int->int dot product. >+ Not detected as a dot-product pattern. */ >+ >+__attribute__ ((noinline)) int >+foo (int len) >+{ >+ int i; >+ int result = 0; >+ >+ for (i = 0; i < len; i++) >+ { >+ result += (X[i] * Y[i]); >+ } >+ return result; >+} >+ >+ >+/* (int, short)->int->int dot product. >+ Not detected as a dot-product pattern. */ >+ >+__attribute__ ((noinline)) int >+bar (int len) >+{ >+ int i; >+ int result = 0; >+ >+ for (i = 0; i < len; i++) >+ { >+ result += (Y[i] * X[i]); >+ } >+ return result; >+} >+ >+int >+main (void) >+{ >+ int i; >+ int dot; >+ >+ check_vect (); >+ >+ for (i = 0; i < N; i++) >+ { >+ X[i] = i; >+ Y[i] = N - i; >+ __asm__ volatile (""); >+ } >+ >+ dot = foo (N); >+ if (dot != DOT) >+ abort (); >+ >+ dot = bar (N); >+ if (dot != DOT) >+ abort (); >+ >+ return 0; >+} >+ >+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { >target vect_unpack } } } */ >+/* { dg-final { cleanup-tree-dump "vect" } } */ >+ >--- gcc/testsuite/gcc.dg/vect/pr63189.c.jj 2014-09-08 >18:20:52.217190980 +0200 >+++ gcc/testsuite/gcc.dg/vect/pr63189.c 2014-09-08 18:23:03.088551066 >+0200 >@@ -0,0 +1,26 @@ >+/* PR tree-optimization/63189 */ >+/* { dg-do run } */ >+ >+#include "tree-vect.h" >+ >+short int d[16] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; >+ >+__attribute__((noinline, noclone)) void >+foo (void) >+{ >+ int j, s = 0; >+ for (j = 0; j < 8; j++) >+ s += d[j] * j; >+ if (s != 7) >+ abort (); >+} >+ >+int >+main () >+{ >+ check_vect (); >+ foo (); >+ return 0; >+} >+ >+/* { dg-final { cleanup-tree-dump "vect" } } */ >--- gcc/testsuite/gcc.dg/vect/pr60196-1.c.jj 2014-09-08 >18:24:54.184008171 +0200 >+++ gcc/testsuite/gcc.dg/vect/pr60196-1.c 2014-09-08 18:30:39.351317988 >+0200 >@@ -0,0 +1,34 @@ >+/* PR tree-optimization/63189 */ >+/* { dg-additional-options "-fwrapv" } */ >+/* { dg-do run } */ >+ >+#include "tree-vect.h" >+ >+__attribute__((noinline, noclone)) static int >+bar (const short *a, int len) >+{ >+ int x; >+ int x1 = 0; >+ >+ for (x = 0; x < len; x++) >+ x1 += x * a[x]; >+ return x1; >+} >+ >+__attribute__((noinline, noclone)) void >+foo (void) >+{ >+ short stuff[9] = {1, 1, 1, 1, 1, 1, 1, 1, 1 }; >+ if (bar (stuff, 9) != 36) >+ abort (); >+} >+ >+int >+main () >+{ >+ check_vect (); >+ foo (); >+ return 0; >+} >+ >+/* { dg-final { cleanup-tree-dump "vect" } } */ >--- gcc/testsuite/gcc.dg/vect/pr60196-2.c.jj 2014-09-08 >18:27:06.814356716 +0200 >+++ gcc/testsuite/gcc.dg/vect/pr60196-2.c 2014-09-08 18:30:30.964358841 >+0200 >@@ -0,0 +1,33 @@ >+/* PR tree-optimization/63189 */ >+/* { dg-do run } */ >+ >+#include "tree-vect.h" >+ >+static const short a[8] = {1, 1, 1, 1, 1, 1, 1, 1 }; >+static const unsigned char b[8] = {0, 0, 0, 0, 0, 0, 0, 0 }; >+ >+__attribute__((noinline, noclone)) static int >+bar (void) >+{ >+ int sum = 0, i; >+ for (i = 0; i < 8; ++i) >+ sum += a[i] * b[i]; >+ return sum; >+} >+ >+__attribute__((noinline, noclone)) void >+foo (void) >+{ >+ if (bar () != 0) >+ abort (); >+} >+ >+int >+main () >+{ >+ check_vect (); >+ foo (); >+ return 0; >+} >+ >+/* { dg-final { cleanup-tree-dump "vect" } } */ > > Jakub