Consider he following code: double atan2(double a,double b); class vec3 { public: double x, y, z; vec3 &operator*= (double fact); double Length () const; }; using namespace std; void toAxisAngle (vec3 &axis, double &angle) { double c2=8; axis.x=9; axis.y=7; axis.z=7; double s2 = 0; angle = atan2(s2,c2); axis *= 1/s2; } Without optimization, the compilation succeeds, but when -O -ffast-math are added the compiler crashes with the following output: ~/data/planck/LevelS/cxxmod>g++ -c -O -ffast-math -v bla.cc Reading specs from /afs/mpa/data/martin/ugcc/lib/gcc-lib/i686-pc-linux-gnu/3.4/specs Configured with: /scratch/gcc/configure --prefix=/afs/mpa/data/martin/ugcc --enable-languages=c++ --enable-namespaces Thread model: posix gcc version 3.4 20030526 (experimental) /afs/mpa/data/martin/ugcc/lib/gcc-lib/i686-pc-linux-gnu/3.4/cc1plus -quiet -v -D_GNU_SOURCE bla.cc -quiet -dumpbase bla.cc -auxbase bla -O -version -ffast-math -o /tmp/cc8c9jQa.s ignoring nonexistent directory "/afs/mpa/data/martin/ugcc/i686-pc-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /afs/mpa/data/martin/ugcc/include/c++/3.4 /afs/mpa/data/martin/ugcc/include/c++/3.4/i686-pc-linux-gnu /afs/mpa/data/martin/ugcc/include/c++/3.4/backward /usr/local/include /afs/mpa/data/martin/ugcc/include /afs/mpa/data/martin/ugcc/lib/gcc-lib/i686-pc-linux-gnu/3.4/include /usr/include End of search list. GNU C++ version 3.4 20030526 (experimental) (i686-pc-linux-gnu) compiled by GNU C version 3.4 20030526 (experimental). GGC heuristics: --param ggc-min-expand=64 --param ggc-min-heapsize=64489 bla.cc: In function `void toAxisAngle(vec3&, double&)': bla.cc:22: internal compiler error: in subst_stack_regs_pat, at reg-stack.c: 1468 Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://gcc.gnu.org/bugs.html> for instructions.
Created attachment 4076 [details] a testcase to reproduce the bug
Yep this is a bug on the mainline (20030526).
Still exists on the mainline (20030621).
This looks like it is caused by Roger Sayle <roger@eyesopen.com>'s patches to make atan2 a builtin and a pattern for i386, he fixed log but it looks like atan2 is not fixed. Here is a smaller example (also a C example): void t(double); double atan2(double,double); void temp(double *c) { double c2 = 8; double s2 = 0; *c = atan2(s2,c2); t(1/s2); }
This regression was introduced between 2003-05-14-trunk (#203) and 2003-05-15-trunk (#204). Found using Phil's regression hunter.
Subject: Bug 10979 CVSROOT: /cvs/gcc Module name: gcc Changes by: sayle@gcc.gnu.org 2003-07-08 00:28:47 Modified files: gcc : ChangeLog gcc/config/i386: i386.md gcc/testsuite : ChangeLog Added files: gcc/testsuite/gcc.dg: 20030707-1.c Log message: PR target/10979 * config/i386/i386.md (atan2df3, atan2sf3, atan2xf3, atan2tf3): Changed to define_expand patterns that copy operand[1] to prevent it from being clobbered before emitting an atan2?f3_1 insn. (atan2df3_1, atan2sf3_1, atan2xf_1, atan2tf3_1): New define_insn patterns that actually specify the behaviour of x87's FPATAN. * gcc.dg/20030707-1.c: New testcase. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.385&r2=2.386 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/i386/i386.md.diff?cvsroot=gcc&r1=1.474&r2=1.475 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.2847&r2=1.2848 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/20030707-1.c.diff?cvsroot=gcc&r1=NONE&r2=1.1
Fixed by Roger's patch. Thanks!