diff options
author | Ira Rosen <ira.rosen@linaro.org> | 2011-07-19 06:25:07 +0000 |
---|---|---|
committer | Ira Rosen <irar@gcc.gnu.org> | 2011-07-19 06:25:07 +0000 |
commit | 338f655dae09fc11f3fa4bc693360d93d9e72bb6 (patch) | |
tree | 6cccd3872aa1d8d4da3bfbfd294117ba827a2837 /gcc | |
parent | 24d71c2b563c0dd873523118edae4878275fdf2e (diff) | |
download | gcc-338f655dae09fc11f3fa4bc693360d93d9e72bb6.zip gcc-338f655dae09fc11f3fa4bc693360d93d9e72bb6.tar.gz gcc-338f655dae09fc11f3fa4bc693360d93d9e72bb6.tar.bz2 |
re PR tree-optimization/49771 (wrong code with -ftree-vectorize)
PR tree-optimization/49771
* tree-vect-loop-manip.c (vect_vfa_segment_size): In case of
zero step, set segment length to the size of the data-ref's type.
From-SVN: r176434
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr49771.c | 26 | ||||
-rw-r--r-- | gcc/tree-vect-loop-manip.c | 11 |
4 files changed, 45 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f114c25..62293be 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-07-19 Ira Rosen <ira.rosen@linaro.org> + + PR tree-optimization/49771 + * tree-vect-loop-manip.c (vect_vfa_segment_size): In case of + zero step, set segment length to the size of the data-ref's type. + 2011-07-18 Martin Jambor <mjambor@suse.cz> * ipa-prop.h: Include alloc-pool.h, all sorts of updates to general diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7ccdad4..ffc6f0b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-07-19 Ira Rosen <ira.rosen@linaro.org> + + PR tree-optimization/49771 + * gcc.dg/vect/pr49771.c: New test. + 2011-07-18 Martin Jambor <mjambor@suse.cz> * gcc.dg/ipa/ipa-1.c: Updated testcase dump scan. diff --git a/gcc/testsuite/gcc.dg/vect/pr49771.c b/gcc/testsuite/gcc.dg/vect/pr49771.c new file mode 100644 index 0000000..777f615 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr49771.c @@ -0,0 +1,26 @@ +#include <stdlib.h> +#include <stdarg.h> + +static int a[1000]; + +int +foo (void) +{ + int j; + int i; + for (i = 0; i < 1000; i++) + for (j = 0; j < 1000; j++) + a[j] = a[i] + 1; + return a[0]; +} + +int +main (void) +{ + int res = foo (); + if (res != 1999) + abort (); + return 0; +} + +/* { dg-final { cleanup-tree-dump "vect" } } */ diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c index b8d6780..6039c16 100644 --- a/gcc/tree-vect-loop-manip.c +++ b/gcc/tree-vect-loop-manip.c @@ -2356,9 +2356,14 @@ static tree vect_vfa_segment_size (struct data_reference *dr, tree length_factor) { tree segment_length; - segment_length = size_binop (MULT_EXPR, - fold_convert (sizetype, DR_STEP (dr)), - fold_convert (sizetype, length_factor)); + + if (!compare_tree_int (DR_STEP (dr), 0)) + segment_length = TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (dr))); + else + segment_length = size_binop (MULT_EXPR, + fold_convert (sizetype, DR_STEP (dr)), + fold_convert (sizetype, length_factor)); + if (vect_supportable_dr_alignment (dr, false) == dr_explicit_realign_optimized) { |