From: Ira Rosen Date: Tue, 21 Dec 2010 15:42:11 +0000 (+0000) Subject: re PR tree-optimization/47001 (segmentation fault in vect_mark_slp_stmts) X-Git-Tag: releases/gcc-4.6.0~1707 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c9c1e77571deb30d74b8b12226ef4cec8da78f7d;p=thirdparty%2Fgcc.git re PR tree-optimization/47001 (segmentation fault in vect_mark_slp_stmts) 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bbf05459912f..bc44e7bd4745 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-12-21 Ira Rosen + + 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 PR middle-end/45310 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 007baf400b90..b03b602e12d9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-12-21 Ira Rosen i + + PR tree-optimization/47001 + * gcc.dg/vect/pr47001.c: New. + 2010-12-21 Nicola Pero 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 index 000000000000..9c5d08dac5fe --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr47001.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ + +#include + +#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" } } */ diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index fdaaff2865b5..4f7c72c289a2 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -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. */