This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Simple loops not interchanged?


Hi!

I expected -ftree-loop-linear to exchange loops in

double foo(double *a)
{
        int i,j;
        double r = 0.0;
	for (i=0; i<8; ++i)
                for (j=0; j<8; ++j)
			r += a[j*8+i];
        return r;
}

but it tells me (regardless of loop order) that
"Won't transform loop. Optimal transform is the identity transform"
which I cannot believe, obviously.

>From further experiments, if I don't pass a as a function parameter,
but make its declaration globally available, the transform succeeds.

The main difference in tree dumps before the transformation attempt
is the data access:

 <L1>:;
   D.1129_12 = j_4 * 8;
   D.1130_13 = i_3 + D.1129_12;
-  D.1131_14 = (unsigned int) D.1130_13;
-  D.1132_15 = D.1131_14 * 8;
-  D.1133_16 = (double *) D.1132_15;
-  D.1134_18 = D.1133_16 + a_17;
-  D.1135_19 = *D.1134_18;
+  D.1131_15 = a[D.1130_13];
   r_6 = r_5 + D.1131_15;
   j_17 = j_4 + 1;
   if (N_7 > j_17) goto <L16>; else goto <L3>;

which is just D.1131_15 = a[D.1130_13] in case of the global.  Note
that is the difference starting from the generic tree dump.

What's going wrong here?

Richard.

--
Richard Guenther <richard dot guenther at uni-tuebingen dot de>
WWW: http://www.tat.physik.uni-tuebingen.de/~rguenth/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]