aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIra Rosen <ira.rosen@linaro.org>2011-07-19 06:25:07 +0000
committerIra Rosen <irar@gcc.gnu.org>2011-07-19 06:25:07 +0000
commit338f655dae09fc11f3fa4bc693360d93d9e72bb6 (patch)
tree6cccd3872aa1d8d4da3bfbfd294117ba827a2837
parent24d71c2b563c0dd873523118edae4878275fdf2e (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr49771.c26
-rw-r--r--gcc/tree-vect-loop-manip.c11
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)
{