+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
+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
--- /dev/null
+/* { 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" } } */
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. */