re PR tree-optimization/68806 (internal compiler error: Segmentation fault)
authorRichard Biener <rguenther@suse.de>
Thu, 10 Dec 2015 09:00:58 +0000 (09:00 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 10 Dec 2015 09:00:58 +0000 (09:00 +0000)
2015-12-10  Richard Biener  <rguenther@suse.de>

PR tree-optimization/68806
* tree-vect-loop.c (vect_analyze_loop_2): Properly detect
reduction chains and ignore SLP reductions.

* gcc.dg/torture/pr68806.c: New testcase.

From-SVN: r231493

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr68806.c [new file with mode: 0644]
gcc/tree-vect-loop.c

index 856a88f..c990fc3 100644 (file)
@@ -1,5 +1,11 @@
 2015-12-10  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/68806
+       * tree-vect-loop.c (vect_analyze_loop_2): Properly detect
+       reduction chains and ignore SLP reductions.
+
+2015-12-10  Richard Biener  <rguenther@suse.de>
+
        * tree-if-conv.c (if_convertible_loop_p_1): Do not compute
        dependences.
        (if_convertible_loop_p): Adjust.
index ef7857a..a24de42 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-10  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/68806
+       * gcc.dg/torture/pr68806.c: New testcase.
+
 2015-12-08  Jan Hubicka  <hubicka@ucw.cz>
 
        PR ipa/61886
diff --git a/gcc/testsuite/gcc.dg/torture/pr68806.c b/gcc/testsuite/gcc.dg/torture/pr68806.c
new file mode 100644 (file)
index 0000000..dbb743b
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+
+int sad(const unsigned char *p1, long p2)
+{
+  int a = 0;
+  for (int y = 0; y < 16; y++)
+    {
+      for (int x = 0; x < 12; x++)
+       a += p1[x];
+      p1 += p2;
+    }
+  return a;
+}
index ee32166..77ad760 100644 (file)
@@ -2123,9 +2123,12 @@ again:
   if (!slp)
     return false;
 
+  /* If there are reduction chains re-trying will fail anyway.  */
+  if (! LOOP_VINFO_REDUCTION_CHAINS (loop_vinfo).is_empty ())
+    return false;
+
   /* Likewise if the grouped loads or stores in the SLP cannot be handled
-     via interleaving or lane instructions or if there were any SLP
-     reductions.  */
+     via interleaving or lane instructions.  */
   slp_instance instance;
   slp_tree node;
   unsigned i, j;
@@ -2135,7 +2138,7 @@ again:
       vinfo = vinfo_for_stmt
          (SLP_TREE_SCALAR_STMTS (SLP_INSTANCE_TREE (instance))[0]);
       if (! STMT_VINFO_GROUPED_ACCESS (vinfo))
-       return false;
+       continue;
       vinfo = vinfo_for_stmt (STMT_VINFO_GROUP_FIRST_ELEMENT (vinfo));
       unsigned int size = STMT_VINFO_GROUP_SIZE (vinfo);
       tree vectype = STMT_VINFO_VECTYPE (vinfo);