egcs optimization bug?

mike@kielich.amu.edu.pl mike@kielich.amu.edu.pl
Sat Jul 4 09:27:00 GMT 1998


When I compiled the program solvemc with egcs (egcs -v shows "gcc version 
egcs-2.90-27 980315 (egcs-1.0.2 release)") with any -O options (except -O0)
I got incorrect results. I noticed strange behavior of the variable dydx[] in
function rkqs in files rkqs.c and odeint1.c

egcs -02 version:

/* -------------------------------------------- */
/* ----- before rkqs ----- */
dydx[1]=0.00000000000000000000;
dydx[2]=0.00000000000000000000;
dydx[3]=0.00000000000000000000;
dydx[4]=0.00000000000000000000;
dydx[5]=0.00000000000000000000;
dydx[6]=0.00000000000000000000;
dydx[7]=0.00000000000000000000;
dydx[8]=0.00000000000000000000;
dydx[9]=0.00000000000000000000;
dydx[10]=-0.89999997615814208984;
dydx[11]=0.00000000000000000000;
dydx[12]=0.00000000000000000000;
dydx[13]=0.00000000000000000000;
dydx[14]=0.00000000000000000000;
dydx[15]=0.00000000000000000000;
dydx[16]=0.00000000000000000000;
dydx[17]=0.00000000000000000000;
dydx[18]=0.00000000000000000000;
dydx[19]=0.00000000000000000000;
dydx[20]=0.00000000000000000000;
/* ----- after rkqs ----- */
dydx[1]=0.00000000000000000000;
dydx[2]=0.00000000000000000000;
dydx[3]=0.00000000000000000000;
dydx[4]=0.00000000000000000000;
dydx[5]=0.00000000000000000000;
dydx[6]=0.00000000000000000000;
dydx[7]=0.00000000000000000000;
dydx[8]=0.00000000000000000000;
dydx[9]=0.00000000000000000000;
dydx[10]=-0.89999997615814208984;
dydx[11]=0.00000000000000000000;
dydx[12]=0.00000000000000000000;
dydx[13]=0.00000000000000000000;
dydx[14]=0.00000000000000000000;
dydx[15]=0.00000000000000000000;
dydx[16]=0.00000000000000000000;
dydx[17]=0.00000000000000000000;
dydx[18]=0.00000000000000000000;
dydx[19]=0.00000000000000000000;
dydx[20]=0.00000000000000000000;
/* ----- before rkqs ----- */
dydx[1]=0.00000000000000000000;
dydx[2]=0.00000000000000000000;
dydx[3]=0.00000000000000000000;
dydx[4]=0.00000000000000000000;
dydx[5]=0.00000000000000000000;
dydx[6]=0.00000000000000000000;
dydx[7]=0.00000000000000000000;
dydx[8]=0.00000000000000000000;
dydx[9]=0.00000000000000000000;
dydx[10]=0.00000000000000000000;           <--------------
dydx[11]=0.00000000000000000000;
dydx[12]=0.00000000000000000000;
dydx[13]=0.00000000000000000000;
dydx[14]=0.00000000000000000000;
dydx[15]=0.00000000000000000000;
dydx[16]=0.00000000000000000000;
dydx[17]=0.00000000000000000000;
dydx[18]=0.00000000000000000000;
dydx[19]=0.00000000000000000000;
dydx[20]=-0.88394492864608764648;          <--------------


Somewhere between the first and the second call of rkqs
dydx[10] mysteriously jumped into dydx[20].
If I compile the file "rkqs.c" with gcc (or egcs -O0)
there is no problem.   

gcc -O2 version:

/* -------------------------------------------- */
/* ----- before rkqs ----- */
dydx[1]=0.00000000000000000000;
dydx[2]=0.00000000000000000000;
dydx[3]=0.00000000000000000000;
dydx[4]=0.00000000000000000000;
dydx[5]=0.00000000000000000000;
dydx[6]=0.00000000000000000000;
dydx[7]=0.00000000000000000000;
dydx[8]=0.00000000000000000000;
dydx[9]=0.00000000000000000000;
dydx[10]=-0.89999997615814208984;
dydx[11]=0.00000000000000000000;
dydx[12]=0.00000000000000000000;
dydx[13]=0.00000000000000000000;
dydx[14]=0.00000000000000000000;
dydx[15]=0.00000000000000000000;
dydx[16]=0.00000000000000000000;
dydx[17]=0.00000000000000000000;
dydx[18]=0.00000000000000000000;
dydx[19]=0.00000000000000000000;
dydx[20]=0.00000000000000000000;
/* ----- after rkqs ----- */
dydx[1]=0.00000000000000000000;
dydx[2]=0.00000000000000000000;
dydx[3]=0.00000000000000000000;
dydx[4]=0.00000000000000000000;
dydx[5]=0.00000000000000000000;
dydx[6]=0.00000000000000000000;
dydx[7]=0.00000000000000000000;
dydx[8]=0.00000000000000000000;
dydx[9]=0.00000000000000000000;
dydx[10]=-0.89999997615814208984;
dydx[11]=0.00000000000000000000;
dydx[12]=0.00000000000000000000;
dydx[13]=0.00000000000000000000;
dydx[14]=0.00000000000000000000;
dydx[15]=0.00000000000000000000;
dydx[16]=0.00000000000000000000;
dydx[17]=0.00000000000000000000;
dydx[18]=0.00000000000000000000;
dydx[19]=0.00000000000000000000;
dydx[20]=0.00000000000000000000;
/* ----- before rkqs ----- */
dydx[1]=0.00000000000000000000;
dydx[2]=0.00000000000000000000;
dydx[3]=0.00000000000000000000;
dydx[4]=0.00000000000000000000;
dydx[5]=0.00000000000000000000;
dydx[6]=0.00000000000000000000;
dydx[7]=0.00000000000000000000;
dydx[8]=0.00000000000000000000;
dydx[9]=0.00000000000000000000;
dydx[10]=-0.88394492864608764648;         <-----------------
dydx[11]=0.00000000000000000000;
dydx[12]=0.00000000000000000000;
dydx[13]=0.00000000000000000000;
dydx[14]=0.00000000000000000000;
dydx[15]=0.00000000000000000000;
dydx[16]=0.00000000000000000000;
dydx[17]=0.00000000000000000000;
dydx[18]=0.00000000000000000000;
dydx[19]=0.00000000000000000000;
dydx[20]=0.00000000000000000000;          <-----------------


This effect does not depend on hardware (in i386 family).
So in my opinion this is egcs optimization bug.
I attach to this mail the solvemc sources and sample input file test.dat 


                                 Micha³ Tana¶
                                 mike@zon10.physd.amu.edu.pl





-------------- next part --------------
A non-text attachment was scrubbed...
Name: solvemc.tar.bz2
Type: application/x-bzip2
Size: 16681 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-bugs/attachments/19980704/3adb9da3/attachment.bz2>


More information about the Gcc-bugs mailing list