re PR tree-optimization/67800 (Missed vectorization opportunity on x86 (DOT_PROD_EXPR...
authorRichard Biener <rguenther@suse.de>
Thu, 3 Dec 2015 08:43:22 +0000 (08:43 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 3 Dec 2015 08:43:22 +0000 (08:43 +0000)
2015-12-03  Richard Biener  <rguenther@suse.de>

PR tree-optimization/67800
PR tree-optimization/68333
* tree-vect-patterns.c (vect_recog_dot_prod_pattern): Restore
restriction to reduction contexts but allow SLP reductions as well.
(vect_recog_sad_pattern): Likewise.
(vect_recog_widen_sum_pattern): Likewise.

* gcc.target/i386/vect-pr67800.c: New testcase.

From-SVN: r231221

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/vect-pr67800.c [new file with mode: 0644]
gcc/tree-vect-patterns.c

index 519242133135bfa2c0a91f4bd50514ca9c7fbe31..7072624fa7a526415e4ec40d8e019bca2b4ac0a4 100644 (file)
@@ -1,3 +1,12 @@
+2015-12-03  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/67800
+       PR tree-optimization/68333
+       * tree-vect-patterns.c (vect_recog_dot_prod_pattern): Restore
+       restriction to reduction contexts but allow SLP reductions as well.
+       (vect_recog_sad_pattern): Likewise.
+       (vect_recog_widen_sum_pattern): Likewise.
+
 2015-12-03  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/68639
index 738d5617ff5b7165813b3d8f71dc654d1e74fdcb..074cdceb5259958de6fd8bce441d4a5ef932ae6e 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-03  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/67800
+       PR tree-optimization/68333
+       * gcc.target/i386/vect-pr67800.c: New testcase.
+
 2015-12-03  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/68639
diff --git a/gcc/testsuite/gcc.target/i386/vect-pr67800.c b/gcc/testsuite/gcc.target/i386/vect-pr67800.c
new file mode 100644 (file)
index 0000000..3245108
--- /dev/null
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details" } */
+/* { dg-additional-options "-msse4.2" } */
+
+#define ubyte unsigned char
+#define byte char
+
+#define SCALE 8
+
+#define R2Y (76)
+#define G2Y (150)
+#define B2Y (30)
+#define R2I (127)
+#define G2I (-59)
+#define B2I (-68)
+#define R2Q (51)
+#define G2Q (-127)
+#define B2Q (76)
+
+void
+convert(ubyte *in, ubyte *out, unsigned n)
+{
+  ubyte r, g, b;
+  ubyte y = 0;
+  byte i, q;
+
+  while (--n) {
+         r = *in++;
+         g = *in++;
+         b = *in++;
+
+      y = (ubyte)(((R2Y * r) + (G2Y * g) + (B2Y * b) + (1 << (SCALE - 1))) >> SCALE);
+      i = (byte)(((R2I * r) + (G2I * g) + (B2I * b) + (1 << (SCALE - 1))) >> SCALE);
+      q = (byte)(((R2Q * r) + (G2Q * g) + (B2Q * b) + (1 << (SCALE - 1))) >> SCALE);
+
+      *out++ = y;
+         *out++ = i;
+         *out++ = q;
+  }
+}
+
+/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } } */
index cd142e139036ac7960763bc4205c8bf4dc9cd3af..4b225fbb4ca94295c2211e02470ce58ba5cc4a26 100644 (file)
@@ -312,6 +312,9 @@ vect_recog_dot_prod_pattern (vec<gimple *> *stmts, tree *type_in,
     {
       gimple *def_stmt;
 
+      if (STMT_VINFO_DEF_TYPE (stmt_vinfo) != vect_reduction_def
+         && ! STMT_VINFO_GROUP_FIRST_ELEMENT (stmt_vinfo))
+       return NULL;
       oprnd0 = gimple_assign_rhs1 (last_stmt);
       oprnd1 = gimple_assign_rhs2 (last_stmt);
       if (!types_compatible_p (TREE_TYPE (oprnd0), type)
@@ -531,6 +534,9 @@ vect_recog_sad_pattern (vec<gimple *> *stmts, tree *type_in,
     {
       gimple *def_stmt;
 
+      if (STMT_VINFO_DEF_TYPE (stmt_vinfo) != vect_reduction_def
+         && ! STMT_VINFO_GROUP_FIRST_ELEMENT (stmt_vinfo))
+       return NULL;
       plus_oprnd0 = gimple_assign_rhs1 (last_stmt);
       plus_oprnd1 = gimple_assign_rhs2 (last_stmt);
       if (!types_compatible_p (TREE_TYPE (plus_oprnd0), sum_type)
@@ -1152,6 +1158,10 @@ vect_recog_widen_sum_pattern (vec<gimple *> *stmts, tree *type_in,
   if (gimple_assign_rhs_code (last_stmt) != PLUS_EXPR)
     return NULL;
 
+  if (STMT_VINFO_DEF_TYPE (stmt_vinfo) != vect_reduction_def
+      && ! STMT_VINFO_GROUP_FIRST_ELEMENT (stmt_vinfo))
+    return NULL;
+
   oprnd0 = gimple_assign_rhs1 (last_stmt);
   oprnd1 = gimple_assign_rhs2 (last_stmt);
   if (!types_compatible_p (TREE_TYPE (oprnd0), type)