2012/6/11 Szabolcs Horvát <szhorvat@xxxxxxxxx> > > On 8 June 2012 00:50, Ian Lance Taylor <iant@xxxxxxxxxx> wrote: > > Szabolcs Horvát <szhorvat@xxxxxxxxx> writes: > > > >> I am using the Triangle library > >> <http://www.cs.cmu.edu/~quake/triangle.html> to generate Delaunay > >> triangulations of a large number of points. When I compile this > >> library using the -ftree-ter optimization option only, the library > >> gives me incorrect results for certain inputs. The -ftree-ter option > >> is enabled by optimization level -O1 or higher, which also cause the > >> library to return incorrect results. > >> > >> Question: Does this indicate that there is a bug in gcc or is it more > >> likely that there's a problem in how the library is written? > >> > >> Unfortunately I am not familiar with the code of Triangle, I just > >> compile it and use it. > >> > >> I tried this with gcc 4.6.3 on Ubuntu and gcc 4.7.0 on Windows (from > >> <http://nuwen.net/mingw.html>), both 32-bit. > > > > > > While a bug in GCC is always possible, it is more likely that there's a > > problem in how the library is written. > > > > Unfortunately I am not in a position to find out if it's a problem > with Triangle as I don't know in detail how it works. Triangle is > quite extensively used though, and it's last version is from 2005. I > wonder why the problem has not come out before. > > A strange thing is that I get a different kind of incorrect result if > I use the -O1 option or if I manually specify all the flags that -O1 > is supposed to turn on. What could be the reason for this? I got the > list of flags from here: > http://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Optimize-Options.html#Optimize-Options That page says "Not all optimizations are controlled directly by a flag. Only optimizations that have a flag are listed in this section." This means specifying -O1 is not equivalent to specifying all the listed options. > > Similarly, using -O1 -fno-tree-ter does NOT fix the problem. > Specifying all options that -O1 is supposed to imply according to the > docs, except -ftree-ter DOES fix the problem. > > What is the difference between -O1 and listing all options that it implies? The library's README file contains the following text: Some processors, including Intel x86 family and possibly Motorola 68xxx family chips, are IEEE conformant but have extended length internal floating-point registers that may defeat Triangle's exact arithmetic routines by failing to cause enough roundoff error! Typically, there is a way to set these internal registers so that they are rounded off to IEEE single or double precision format. I believe (but I'm not certain) that Triangle has the right incantations for x86 chips, if you have gcc running under Linux (define the LINUX compiler symbol) or Microsoft C (define the CPU86 compiler symbol). Unfortunately, the library has not been updated since 2005 and I think "the right incantation" may not work with a modern version of GCC. I suggest trying one of the following: - define LINUX or CPU86 - use the option -fexcess-precision=standard - if your program is not going to run on old hardware, use the options -mfpmath=sse -msse2 Dario