------- Additional Comments From uros at kss-loka dot si 2005-08-26 09:35
-------
(In reply to comment #3)
> Unfortunatelly, ludcompf() result (the second one) is wrong when -O1 or -O2
> is used. It is correct without optimizations.
This is a problem of infamous i387 precision handling. The error can be found
in this part of the code:
...
if (u.sf[1] > t) { t = u.sf[1]; n = 1; }
if (u.sf[2] > t) { t = u.sf[2]; n = 2; }
if (u.sf[3] > t) { t = u.sf[3]; n = 3; }
...
Without optimizations, the values of u.sf[1] and t that are at some moment
loaded into x87 registers are:
u.sf[1] = 1.000000119...
t = 0.999999880...
and branch is taken. However, with optimizations, the values are different:
u.sf[1] = 0.999999642...
t = 0.999999821...
This is a problem of the i387 design and not the problem of gcc. In your case,
you should use -ffloat-store or -mfpmath=sse.
BTW: At the moment, I have very limited time, so I won't be able to create a
patch to fix the ICE for some time...
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23570