From: Ira Rosen Date: Tue, 19 Jul 2011 06:25:07 +0000 (+0000) Subject: re PR tree-optimization/49771 (wrong code with -ftree-vectorize) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=338f655dae09fc11f3fa4bc693360d93d9e72bb6;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f114c254423..62293beeaa1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-07-19 Ira Rosen + + 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 * ipa-prop.h: Include alloc-pool.h, all sorts of updates to general diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7ccdad4a835..ffc6f0baa73 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-07-19 Ira Rosen + + PR tree-optimization/49771 + * gcc.dg/vect/pr49771.c: New test. + 2011-07-18 Martin Jambor * 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 00000000000..777f615365c --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr49771.c @@ -0,0 +1,26 @@ +#include +#include + +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 b8d67804f77..6039c1609f4 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) {