OSDN Git Service

PR tree-optimization/49771
authorirar <irar@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Jul 2011 06:25:07 +0000 (06:25 +0000)
committerirar <irar@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Jul 2011 06:25:07 +0000 (06:25 +0000)
        * 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@176434 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr49771.c [new file with mode: 0644]
gcc/tree-vect-loop-manip.c

index f114c25..62293be 100644 (file)
@@ -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
index 7ccdad4..ffc6f0b 100644 (file)
@@ -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 (file)
index 0000000..777f615
--- /dev/null
@@ -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" } } */
index b8d6780..6039c16 100644 (file)
@@ -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)
     {