This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
egcs optimization bug?
- To: egcs-bugs at cygnus dot com
- Subject: egcs optimization bug?
- From: mike at kielich dot amu dot edu dot pl
- Date: Sat, 4 Jul 1998 18:29:07 +0200 (CEST)
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