aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-07-02 12:05:59 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-07-02 12:05:59 +0000
commit19368333588ed6b99b62b0a48e54e007db380286 (patch)
treef8bf11107b22f897df0742d75fe33c354e2249c7
parent2334baf4907c77615b44d9ce15a6ae95246b548b (diff)
downloadgcc-19368333588ed6b99b62b0a48e54e007db380286.zip
gcc-19368333588ed6b99b62b0a48e54e007db380286.tar.gz
gcc-19368333588ed6b99b62b0a48e54e007db380286.tar.bz2
tree-data-ref.c (initialize_data_dependence_relation): Handle mismatching number of dimensions properly.
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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/torture/20100702-1.C37
-rw-r--r--gcc/tree-data-ref.c9
4 files changed, 54 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4d05ea2..8afb6f857 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9fe76bc..a05c06d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..3d223ff
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/20100702-1.C
@@ -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]);
+}
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index 7ab7779..e7aa277 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -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;