Does this indicate a bug of gcc version 3 ?
Please compile the following program by any of gcc version 3 and
by gcc version 2.95, and run the program as follows.
% gcc-3.3 -g -O0 this_program.c -o program_compiled_by_3.3
% program_compiled_by_3.3
First access
loop-C 1422606 = &C[0][0][0][1][0] - &C0[0][0][0][1][0]
loop-C 1422606 = &C[0][0][0][1][1] - &C0[0][0][0][1][1]
...
loop-B -134217962 = &C[0][1][0][0][2] - &C0[0][1][0][0][2]
Second access
%
% gcc-2.95 -g -O0 this_program.c -o program_compiled_by_2.95
% program_compiled_by_2.95
First access
Second access
%
If the program is compiled by gcc version 3, the program will
outpur error messages which tell us that &C[i][j][k][l][m] is not
equal to &C0[i][j][k][l][m], but if gcc version 2.95 is used,
no such errors will occur; of course after C = C0 is excuted.
Does this indicate a bug in the Gcc version 3 or in my program?
===============
# Please compile the following program by
# % gcc-3.3 -g -O0 this_program.c -o program_compiled_by_3.3
# % program_compiled_by_3.3
# First access
# loop-C 1422606 = &C[0][0][0][1][0] - &C0[0][0][0][1][0]
# ...
# Second access
# % gcc-2.95 -g -O0 this_program.c -o program_compiled_by_2.95
# % program_compiled_by_2.95
# First access
# Second access
#include <stdio.h>
#define LPMAX 1
#define LEMAX 1
#define KEMAX 1
int
main(void)
{
int lpmax = LPMAX;
int lemax = LEMAX;
int kemax = KEMAX;
int lp, mp, le, me, ke;
int kePkemax;
int status = 0;
int i;
double C0[lpmax + 1][lpmax + 1][lemax + 1][lemax + 1][kemax * 2 + 1];
double (*C)[lpmax + 1][lemax + 1][lemax + 1][kemax * 2 + 1];
C = C0;
fprintf(stderr,"First access\n");
for ( lp = 0; lp <= lpmax; lp++ ) {
for ( mp = -lp; mp < 0; mp++ ) {
for ( le = 0; le <= lemax; le++ ) {
for ( me = -le; me < 0; me++ ) {
for ( ke = -kemax; ke <= kemax; ke++ ) {
kePkemax = ke + kemax;
i = &C[lp + mp][lp][le + me][le][kePkemax] - &C0[lp + mp][lp][le + me][le][kePkemax];
#ifndef DEBUG
if ( i != 0 )
#endif
fprintf(stderr,"loop-A %d = &C[%d][%d][%d][%d][%d] - &C0[%d][%d][%d][%d][%d] \n",
i, lp + mp, lp, le + me, le, kePkemax,
lp + mp, lp, le + me, le, kePkemax);
}
}
for ( me = 0; me <= le; me++ ) {
for ( ke = -kemax; ke <= kemax; ke++ ) {
kePkemax = ke + kemax;
i = &C[lp + mp][lp][le][le - me][kePkemax] - &C0[lp + mp][lp][le][le - me][kePkemax];
#ifndef DEBUG
if ( i != 0 )
#endif
fprintf(stderr,"loop-B %d = &C[%d][%d][%d][%d][%d] - &C0[%d][%d][%d][%d][%d] \n",
i, lp + mp, lp, le, le - me, kePkemax,
lp + mp, lp, le, le - me, kePkemax);
}
}
}
}
for ( mp = 0; mp <= lp; mp++ ) {
for ( le = 0; le <= lemax; le++ ) {
for ( me = -le; me < 0; me++ ) {
for ( ke = -kemax; ke <= kemax; ke++ ) {
kePkemax = ke + kemax;
i = &C[lp][lp - mp][le + me][le][kePkemax] - &C0[lp][lp - mp][le + me][le][kePkemax];
#ifndef DEBUG
if ( i != 0 )
#endif
fprintf(stderr,"loop-C %d = &C[%d][%d][%d][%d][%d] - &C0[%d][%d][%d][%d][%d] \n",
i, lp, lp - mp, le + me, le, kePkemax,
lp, lp - mp, le + me, le, kePkemax);
}
}
for ( me = 0; me <= le; me++ ) {
for ( ke = -kemax; ke <= kemax; ke++ ) {
kePkemax = ke + kemax;
i = &C[lp][lp - mp][le][le - me][kePkemax] - &C0[lp][lp - mp][le][le - me][kePkemax];
#ifndef DEBUG
if ( i != 0 )
#endif
fprintf(stderr,"loop-D %d = &C[%d][%d][%d][%d][%d] - &C0[%d][%d][%d][%d][%d] \n",
i, lp, lp - mp, le, le - me, kePkemax,
lp, lp - mp, le, le - me, kePkemax);
}
}
}
}
}
fprintf(stderr,"Second access\n");
for ( lp = 0; lp <= lpmax; lp++ ) {
for ( mp = 0; mp <= lpmax; mp++ ) {
for ( le = 0; le <= lemax; le++ ) {
for ( me = 0; me <= lemax; me++ ) {
for ( ke = 0; ke <= kemax * 2; ke++ ) {
{
int i;
i = &C[lp][mp][le][me][ke] - &C0[lp][mp][le][me][ke];
#ifndef DEBUG
if ( i != 0 )
#endif
fprintf(stderr,"loop %d = &C[%d][%d][%d][%d][%d] - &C0[%d][%d][%d][%d][%d] \n",
i, lp, mp, le, me, ke,
lp, mp, le, me, ke);
}
}
}
}
}
}
return(status);
}
Reply to: