This is the mail archive of the gcc-bugs@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]

egcs optimization bug?


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





solvemc.tar.bz2


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