]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/47001 (segmentation fault in vect_mark_slp_stmts)
authorIra Rosen <irar@gcc.gnu.org>
Tue, 21 Dec 2010 15:42:11 +0000 (15:42 +0000)
committerIra Rosen <irar@gcc.gnu.org>
Tue, 21 Dec 2010 15:42:11 +0000 (15:42 +0000)
        PR tree-optimization/47001
        * tree-vect-slp.c (vect_supported_load_permutation_p): Check
        that the loads in reduction are different and there are no gaps
        between them.

From-SVN: r168123

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr47001.c [new file with mode: 0644]
gcc/tree-vect-slp.c

index bbf05459912f042569cc9c336d54545a5244ff6a..bc44e7bd474504300bc13b320c21fdee47382232 100644 (file)
@@ -1,3 +1,10 @@
+2010-12-21  Ira Rosen  <irar@il.ibm.com>
+
+       PR tree-optimization/47001
+       * tree-vect-slp.c (vect_supported_load_permutation_p): Check that
+       the loads in reduction are different and there are no gaps between
+       them.
+
 2010-12-21  Steven Bosscher  <steven@gcc.gnu.org>
 
        PR middle-end/45310
index 007baf400b90ee06412766dee195b60a53ecce73..b03b602e12d99a311e12b126f9e487f3c64ef71e 100644 (file)
@@ -1,3 +1,8 @@
+2010-12-21  Ira Rosen  <irar@il.ibm.com>i
+
+       PR tree-optimization/47001
+       * gcc.dg/vect/pr47001.c: New.
+
 2010-12-21  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        PR libobjc/16110
diff --git a/gcc/testsuite/gcc.dg/vect/pr47001.c b/gcc/testsuite/gcc.dg/vect/pr47001.c
new file mode 100644 (file)
index 0000000..9c5d08d
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+
+#include <stdlib.h>
+
+#define N 128
+
+int a[N];
+
+int main1 (int res0, int res1)
+{
+  int i;
+  int sum0 = 0, sum1 = 0;
+
+  for (i = 0; i < N/2; i++) {
+    sum1 += a[2*i];
+    sum0 += a[2*i];
+  }
+
+  /* Check results:  */
+  if (sum0 != res0
+      || sum1 != res1)
+    abort ();
+
+  return 0;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
index fdaaff2865b5da4b7b5895fadd22517f4932aea7..4f7c72c289a2694e235dc0d1c7f88043d0860875 100644 (file)
@@ -1002,7 +1002,36 @@ vect_supported_load_permutation_p (slp_instance slp_instn, int group_size,
 
       if (!bad_permutation)
         {
-          /* This permutaion is valid for reduction.  Since the order of the
+          /* Check that the loads in the first sequence are different and there
+             are no gaps between them.  */
+          load_index = sbitmap_alloc (group_size);
+          sbitmap_zero (load_index);
+          for (k = 0; k < group_size; k++)
+            {
+              first_group_load_index = VEC_index (int, load_permutation, k);
+              if (TEST_BIT (load_index, first_group_load_index))
+                {
+                  bad_permutation = true;
+                  break;
+                }
+
+              SET_BIT (load_index, first_group_load_index);
+            }
+
+          if (!bad_permutation)
+            for (k = 0; k < group_size; k++)
+              if (!TEST_BIT (load_index, k))
+                {
+                  bad_permutation = true;
+                  break;
+                }
+
+          sbitmap_free (load_index);
+        }
+
+      if (!bad_permutation)
+        {
+          /* This permutation is valid for reduction.  Since the order of the
              statements in the nodes is not important unless they are memory
              accesses, we can rearrange the statements in all the nodes 
              according to the order of the loads.  */