tree-data-ref.c (initialize_data_dependence_relation): Handle mismatching number...
authorRichard Guenther <rguenther@suse.de>
Fri, 2 Jul 2010 12:05:59 +0000 (12:05 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 2 Jul 2010 12:05:59 +0000 (12:05 +0000)
2010-07-02  Richard Guenther  <rguenther@suse.de>

* tree-data-ref.c (initialize_data_dependence_relation): Handle
mismatching number of dimensions properly.

* g++.dg/torture/20100702-1.C: New testcase.

From-SVN: r161705

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/20100702-1.C [new file with mode: 0644]
gcc/tree-data-ref.c

index 4d05ea2757ab313ef0c7e7be48610901cbb9934d..8afb6f85744d3f599b3ba18e4be0b143f8657da1 100644 (file)
@@ -1,3 +1,8 @@
+2010-07-02  Richard Guenther  <rguenther@suse.de>
+
+       * tree-data-ref.c (initialize_data_dependence_relation): Handle
+       mismatching number of dimensions properly.
+
 2010-07-02  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
 
        PR target/44707
index 9fe76bc4ac59e73d9d321abc7f2943a74db4e15a..a05c06d0492ad10c23d987ff45ba9122d7e650b3 100644 (file)
@@ -1,3 +1,7 @@
+2010-07-02  Richard Guenther  <rguenther@suse.de>
+
+       * g++.dg/torture/20100702-1.C: New testcase.
+
 2010-07-02  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
 
        PR target/44707
diff --git a/gcc/testsuite/g++.dg/torture/20100702-1.C b/gcc/testsuite/g++.dg/torture/20100702-1.C
new file mode 100644 (file)
index 0000000..3d223ff
--- /dev/null
@@ -0,0 +1,37 @@
+// { dg-do compile }
+// { dg-options "-fprefetch-loop-arrays -w" }
+
+class ggPoint3 {
+public:
+    ggPoint3();
+    inline double &x() {
+       return e[0];
+    }
+    inline double &y() {
+       return e[1];
+    }
+    ggPoint3(const ggPoint3 &p);
+    double e[3];
+};
+class ggBox3 {
+public:
+    ggPoint3 min() const;
+};
+class ggHAffineMatrix3;
+ggPoint3 operator*(const ggHAffineMatrix3 &m, const ggPoint3 &v);
+void foo (ggPoint3 *);
+void SetMatrix(ggHAffineMatrix3& toworld, ggBox3& box)
+{
+  ggPoint3 p[2][2][2];
+  int i, j, k;
+  for (i = 0; i < 2; j++)
+    for (k = 0; k < 2; k++)
+      {
+       if (i == 0)
+         p[i][j][k].x() = box.min().x();
+       if (j == 0)
+         p[i][j][k].y() = box.min().y();
+       p[i][j][k] = toworld * p[i][j][k];
+      }
+  foo (&p[0][0][0]);
+}
index 7ab7779c5691b3c80ac0c92ef67d5bca728e2739..e7aa277a69f04d76b79d42e307dad06b323b4720 100644 (file)
@@ -1452,7 +1452,14 @@ initialize_data_dependence_relation (struct data_reference *a,
       return res;
     }
 
-  gcc_assert (DR_NUM_DIMENSIONS (a) == DR_NUM_DIMENSIONS (b));
+  /* If the number of dimensions of the access to not agree we can have
+     a pointer access to a component of the array element type and an
+     array access while the base-objects are still the same.  Punt.  */
+  if (DR_NUM_DIMENSIONS (a) != DR_NUM_DIMENSIONS (b))
+    {
+      DDR_ARE_DEPENDENT (res) = chrec_dont_know;
+      return res;
+    }
 
   DDR_AFFINE_P (res) = true;
   DDR_ARE_DEPENDENT (res) = NULL_TREE;