This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Simple loops not interchanged?
- From: Richard Guenther <rguenth at tat dot physik dot uni-tuebingen dot de>
- To: gcc at gcc dot gnu dot org
- Date: Fri, 10 Dec 2004 16:36:35 +0100 (CET)
- Subject: 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/