Comments
Patch
===================================================================
@@ -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]);
+}
This fixes an ICE in data-dependence computation which doesn't expect data-references like MEM[(double &)&p + 32] = D.2212_95; ... p[0][j_7][0] = D.2168; do appear. This can now happen with mem-ref, and I believe could happen already before with whole array-assignments in the IL. The easiest solution is to punt here (note that MEM[(double &)&p + 32] is accessing a part of p[0][1][0]). Bootstrap and regtest running on x86_64-unknown-linux-gnu, will apply if that succeeds. Richard. 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. Index: gcc/tree-data-ref.c =================================================================== *** gcc/tree-data-ref.c (revision 161701) --- gcc/tree-data-ref.c (working copy) *************** initialize_data_dependence_relation (str *** 1452,1458 **** return res; } ! gcc_assert (DR_NUM_DIMENSIONS (a) == DR_NUM_DIMENSIONS (b)); DDR_AFFINE_P (res) = true; DDR_ARE_DEPENDENT (res) = NULL_TREE; --- 1452,1465 ---- return res; } ! /* 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;