Bug 10979 - [3.4 regression] ICE in subst_stack_regs_pat with -O -ffast-math and atan2
Summary: [3.4 regression] ICE in subst_stack_regs_pat with -O -ffast-math and atan2
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 3.4.0
: P1 normal
Target Milestone: 3.4.0
Assignee: roger
Keywords: ice-on-valid-code
Depends on:
Reported: 2003-05-26 10:59 UTC by Martin Reinecke
Modified: 2004-01-17 04:22 UTC (History)
1 user (show)

See Also:
Host: i686-pc-linux-gnu
Target: i686-pc-linux-gnu
Build: i686-pc-linux-gnu
Known to work:
Known to fail:
Last reconfirmed: 2003-06-23 02:21:43

a testcase to reproduce the bug (246 bytes, text/plain)
2003-05-26 11:02 UTC, Martin Reinecke

Note You need to log in before you can comment on or make changes to this bug.
Description Martin Reinecke 2003-05-26 10:59:43 UTC
Consider he following code:

double atan2(double a,double b);

class vec3
    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:
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:
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
Comment 1 Martin Reinecke 2003-05-26 11:02:19 UTC
Created attachment 4076 [details]
a testcase to reproduce the bug
Comment 2 Andrew Pinski 2003-05-26 14:47:53 UTC
Yep this is a bug on the mainline (20030526).
Comment 3 Andrew Pinski 2003-06-22 03:27:10 UTC
Still exists on the mainline (20030621).
Comment 4 Andrew Pinski 2003-06-23 02:21:43 UTC
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);
Comment 5 Andrew Pinski 2003-07-07 13:44:21 UTC
This regression was introduced between 2003-05-14-trunk (#203) and 2003-05-15-trunk 
(#204).  Found using Phil's regression hunter.
Comment 6 GCC Commits 2003-07-08 00:28:49 UTC
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.


Comment 7 Dara Hazeghi 2003-07-10 00:28:29 UTC
Fixed by Roger's patch. Thanks!