-fgcse (only at optimization level -O1 or higher) causes the compare at line
3639 of the pre-processed linprog.i (attached) to fire with only one of its
operands on the stack. This leads to non-sensical results such as normal
floating point number being declared less than itself.

If the je .L345 is change to a je .L365 in the resulting assembly, the code
functions correctly.

The following input (on stdin) triggers the problem:
4 3 0 1
-2 -3   1 -204
 7  4   1  408
-5  6   1    0
 1  1   0  102
 0  0 102

This should report that 102 (0x4059800000000000) is less than itself.

The compiler output follows:

gcc -Wall -v -lm -O1 -fgcse -save-temps linprog.c -o linprog-bug
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: /var/tmp/portage/sys-devel/gcc-4.2.2/work/gcc-4.2.2/configure
--prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/4.2.2
--includedir=/usr/lib/gcc/i686-pc-linux-gnu/4.2.2/include
--datadir=/usr/share/gcc-data/i686-pc-linux-gnu/4.2.2
--mandir=/usr/share/gcc-data/i686-pc-linux-gnu/4.2.2/man
--infodir=/usr/share/gcc-data/i686-pc-linux-gnu/4.2.2/info
--with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/4.2.2/include/g++-v4
--host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec
--enable-nls --without-included-gettext --with-system-zlib --disable-checking
--disable-werror --enable-secureplt --disable-libunwind-exceptions
--disable-multilib --enable-libmudflap --disable-libssp --disable-libgcj
--with-arch=i686 --enable-languages=c,c++,treelang,fortran --enable-shared
--enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu
Thread model: posix
gcc version 4.2.2 (Gentoo 4.2.2 p1.0)
 /usr/libexec/gcc/i686-pc-linux-gnu/4.2.2/cc1 -E -quiet -v linprog.c
-mtune=generic -march=i686 -Wall -fgcse -O1 -fpch-preprocess -o linprog.i
ignoring nonexistent directory
"/usr/lib/gcc/i686-pc-linux-gnu/4.2.2/../../../../i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-pc-linux-gnu/4.2.2/include
 /usr/include
End of search list.
 /usr/libexec/gcc/i686-pc-linux-gnu/4.2.2/cc1 -fpreprocessed linprog.i -quiet
-dumpbase linprog.c -mtune=generic -march=i686 -auxbase linprog -O1 -Wall
-version -fgcse -o linprog.s
GNU C version 4.2.2 (Gentoo 4.2.2 p1.0) (i686-pc-linux-gnu)
        compiled by GNU C version 4.2.2 (Gentoo 4.2.2 p1.0).
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: b5268e820b5e470b4c5cb18dc589783e
linprog.c: In function ‘lp_solve_phase0’:
linprog.c:77: warning: suggest parentheses around && within ||
linprog.c:78: warning: suggest parentheses around && within ||
linprog.c: In function ‘lp_solve_phase1’:
linprog.c:163: warning: suggest parentheses around && within ||
linprog.c: In function ‘lp_solve_impl’:
linprog.c:49: warning: ‘jmax’ may be used uninitialized in this function
linprog.c:49: note: ‘jmax’ was declared here
linprog.c:141: warning: ‘imin’ may be used uninitialized in this function
linprog.c:141: note: ‘imin’ was declared here
 /usr/lib/gcc/i686-pc-linux-gnu/4.2.2/../../../../i686-pc-linux-gnu/bin/as -V
-Qy -o linprog.o linprog.s
GNU assembler version 2.18 (i686-pc-linux-gnu) using BFD version (GNU Binutils)
2.18
 /usr/libexec/gcc/i686-pc-linux-gnu/4.2.2/collect2 --eh-frame-hdr -m elf_i386
-dynamic-linker /lib/ld-linux.so.2 -o linprog-bug
/usr/lib/gcc/i686-pc-linux-gnu/4.2.2/../../../crt1.o
/usr/lib/gcc/i686-pc-linux-gnu/4.2.2/../../../crti.o
/usr/lib/gcc/i686-pc-linux-gnu/4.2.2/crtbegin.o
-L/usr/lib/gcc/i686-pc-linux-gnu/4.2.2 -L/usr/lib/gcc/i686-pc-linux-gnu/4.2.2
-L/usr/lib/gcc/i686-pc-linux-gnu/4.2.2/../../../../i686-pc-linux-gnu/lib
-L/usr/lib/gcc/i686-pc-linux-gnu/4.2.2/../../.. -lm linprog.o -lgcc --as-needed
-lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/lib/gcc/i686-pc-linux-gnu/4.2.2/crtend.o
/usr/lib/gcc/i686-pc-linux-gnu/4.2.2/../../../crtn.o


-- 
           Summary: gcse+O1 triggers invalid floating point stack management
           Product: gcc
           Version: 4.2.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: tterribe at xiph dot org
 GCC build triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34951

Reply via email to