OSDN Git Service

2007-12-19 Sebastian Pop <sebastian.pop@amd.com>
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Jan 2008 02:38:24 +0000 (02:38 +0000)
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 3 Jan 2008 02:38:24 +0000 (02:38 +0000)
PR tree-optimization/34635
* tree-data-ref.c (add_other_self_distances): Make sure that the
evolution step is constant.

* gcc.dg/tree-ssa/pr34635.c: New.
* gcc.dg/tree-ssa/pr34635-1.c: New.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr34635-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr34635.c [new file with mode: 0644]
gcc/tree-data-ref.c

index f08d3af..f5516e7 100644 (file)
@@ -1,3 +1,9 @@
+2007-12-19  Sebastian Pop  <sebastian.pop@amd.com>
+
+       PR tree-optimization/34635
+       * tree-data-ref.c (add_other_self_distances): Make sure that the
+       evolution step is constant.
+
 2008-01-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/34608
 2008-01-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/34608
index 0c00eb6..ff42813 100644 (file)
@@ -1,3 +1,9 @@
+2007-12-19  Sebastian Pop  <sebastian.pop@amd.com>
+
+       PR tree-optimization/34635
+       * gcc.dg/tree-ssa/pr34635.c: New.
+       * gcc.dg/tree-ssa/pr34635-1.c: New.
+
 2008-01-02  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        PR middle-end/34562
 2008-01-02  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        PR middle-end/34562
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr34635-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr34635-1.c
new file mode 100644 (file)
index 0000000..5afc6db
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+void foo(int x[])
+{
+ int i, j;
+
+ for (i = 0; i < 2; i++)
+   for (j = 0; j < 2; j++)
+   {
+     x[i] = x[i+j];
+     x[i] = x[i+j];
+   }
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr34635.c b/gcc/testsuite/gcc.dg/tree-ssa/pr34635.c
new file mode 100644 (file)
index 0000000..5b4253c
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+void foo(int x[])
+{
+ int i, j;
+
+ for (i = 0; i < 2; i++)
+   for (j = 0; j < 2; j++)
+   {
+     x[i] = x[i*j];
+     x[i] = x[i*j];
+   }
+}
index 07b311a..88f6347 100644 (file)
@@ -2818,9 +2818,9 @@ constant_access_functions (const struct data_dependence_relation *ddr)
   return true;
 }
 
   return true;
 }
 
-
 /* Helper function for the case where DDR_A and DDR_B are the same
 /* Helper function for the case where DDR_A and DDR_B are the same
-   multivariate access function.  */
+   multivariate access function with a constant step.  For an example
+   see pr34635-1.c.  */
 
 static void
 add_multivariate_self_dist (struct data_dependence_relation *ddr, tree c_2)
 
 static void
 add_multivariate_self_dist (struct data_dependence_relation *ddr, tree c_2)
@@ -2890,7 +2890,17 @@ add_other_self_distances (struct data_dependence_relation *ddr)
                  return;
                }
 
                  return;
                }
 
-             add_multivariate_self_dist (ddr, DR_ACCESS_FN (DDR_A (ddr), 0));
+             access_fun = DR_ACCESS_FN (DDR_A (ddr), 0);
+
+             if (TREE_CODE (CHREC_LEFT (access_fun)) == POLYNOMIAL_CHREC)
+               add_multivariate_self_dist (ddr, access_fun);
+             else
+               /* The evolution step is not constant: it varies in
+                  the outer loop, so this cannot be represented by a
+                  distance vector.  For example in pr34635.c the
+                  evolution is {0, +, {0, +, 4}_1}_2.  */
+               DDR_AFFINE_P (ddr) = false;
+
              return;
            }
 
              return;
            }