[Bug c++/37936] New: Conditional operator optimization error with const int&

jeff_harris at kentrox dot com gcc-bugzilla@gcc.gnu.org
Tue Oct 28 13:26:00 GMT 2008


I have found an error in the optimizer that is causing it to over-optimze a
conditional operator, ?:.  The optimizer will always choose the first option
regardless of the value of the condition.  In the code, the call to setHelpInt1
is always passed the value for UP even though DOWN is the correct option at
runtime.  Subsequent uses of the same condition produce the correct output. 
Swapping UP and DOWN in getState() causes DOWN to be forced.

The incorrect output generated is:
setInt 1 to 1
setInt 2 to 2
val: 2

The correct output is:
setInt 1 to 2
setInt 2 to 2
val: 2


A slight change in the code will cause the error to not occur.  Any of the
following changes will cause the optimizer to work correctly:
- Make getState() not inlined
- Change the getState() function to write out the conditional operator as an
if/else statement
- Remove the if(gok) test in main()
- Change if(gok) to if(gflags) in main()
- Compile with -O instead of -O2
- Change the signature of setHelpInt2 to take a const int instead of a const
int&.  This is the strangest 'fix' as it occurs after the call to setHelpInt1.

The error is present on a RHEL 5.1 64-bit system with GCC 4.1.2 with the
specified configuration:
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--enable-checking=release --with-system-zlib --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-libgcj-multifile
--enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk
--disable-dssi --enable-plugin
--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic
--host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20070626 (Red Hat 4.1.2-14)
 /usr/libexec/gcc/x86_64-redhat-linux/4.1.2/cc1plus -E -quiet -v -D_GNU_SOURCE
badref2.cpp -mtune=generic -Wall -O2 -fpch-preprocess -o badref2.ii
ignoring nonexistent directory
"/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/x86_64-redhat-linux
 /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/backward
 /usr/local/include
 /usr/lib/gcc/x86_64-redhat-linux/4.1.2/include
 /usr/include
End of search list.
 /usr/libexec/gcc/x86_64-redhat-linux/4.1.2/cc1plus -fpreprocessed badref2.ii
-quiet -dumpbase badref2.cpp -mtune=generic -auxbase badref2 -O2 -Wall -version
-o badref2.s
GNU C++ version 4.1.2 20070626 (Red Hat 4.1.2-14) (x86_64-redhat-linux)
        compiled by GNU C version 4.1.2 20070626 (Red Hat 4.1.2-14).
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 6f6d1884a37abf7abe8da2d985ac9045
 as -V -Qy -o badref2.o badref2.s
GNU assembler version 2.17.50.0.6-5.el5 (x86_64-redhat-linux) using BFD version
2.17.50.0.6-5.el5 20061020
 /usr/libexec/gcc/x86_64-redhat-linux/4.1.2/collect2 --eh-frame-hdr -m
elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbegin.o
-L/usr/lib/gcc/x86_64-redhat-linux/4.1.2
-L/usr/lib/gcc/x86_64-redhat-linux/4.1.2
-L/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64 -L/lib/../lib64
-L/usr/lib/../lib64 badref2.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtend.o
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crtn.o

It has also been reproduced on a PPC cross-compiler with GCC 4.2.1.  Both
systems exhibit the same behavior regarding the changes that fix the problem.
Using built-in specs.
Target: powerpc-ai-linux
Configured with: /tmphome/jeffh/dev/toolkit-rh5/modules/gcc/configure
--prefix=/usr/local/ai/ppc826x-lx2.4-1.70
--srcdir=/tmphome/jeffh/dev/toolkit-rh5/modules/gcc --enable-languages=c,c++
--target=powerpc-ai-linux
--with-libs=/usr/local/ai/ppc826x-lx2.4-1.70/target/lib
--with-headers=/usr/local/ai/ppc826x-lx2.4-1.70/target/usr/include
--enable-shared --disable-nls --with-cpu=603e --enable-threads
--enable-__cxa_atexit --with-gnu-ld --with-gnu-as
Thread model: posix
gcc version 4.2.1
 /usr/local/ai/ppc826x-lx2.4-1.70/libexec/gcc/powerpc-ai-linux/4.2.1/cc1plus -E
-quiet -v -D_GNU_SOURCE -D__unix__ -D__gnu_linux__ -D__linux__ -Dunix -D__unix
-Dlinux -D__linux -Asystem=linux -Asystem=unix -Asystem=posix badref2.cpp
-mcpu=603e -O2 -fpch-preprocess -o badref2.ii
#include "..." search starts here:
#include <...> search starts here:

/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/../../../../powerpc-ai-linux/include/c++/4.2.1

/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/../../../../powerpc-ai-linux/include/c++/4.2.1/powerpc-ai-linux

/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/../../../../powerpc-ai-linux/include/c++/4.2.1/backward
 /usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/include

/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/../../../../powerpc-ai-linux/sys-include

/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/../../../../powerpc-ai-linux/include
End of search list.
 /usr/local/ai/ppc826x-lx2.4-1.70/libexec/gcc/powerpc-ai-linux/4.2.1/cc1plus
-fpreprocessed badref2.ii -quiet -dumpbase badref2.cpp -mcpu=603e -auxbase
badref2 -O2 -version -o badref2.s
GNU C++ version 4.2.1 (powerpc-ai-linux)
        compiled by GNU C version 4.2.1.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: e4edbb3391ee1d6def0b3ae5cb8fda9a

/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/../../../../powerpc-ai-linux/bin/as
-mppc -many -V -Qy -o badref2.o badref2.s
GNU assembler version 2.17.50.0.17 (powerpc-ai-linux) using BFD version
(Linux/GNU Binutils) 2.17.50.0.17.20070615
 /usr/local/ai/ppc826x-lx2.4-1.70/libexec/gcc/powerpc-ai-linux/4.2.1/collect2
--eh-frame-hdr -V -Qy -m elf32ppclinux -dynamic-linker /lib/ld.so.1 -o
/tmphome/jeffh/dev/remote/staging/a.out
/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/../../../../powerpc-ai-linux/lib/crt1.o
/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/../../../../powerpc-ai-linux/lib/crti.o
/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/crtbegin.o
-L/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1
-L/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/../../../../powerpc-ai-linux/lib
badref2.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/crtsavres.o
/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/crtend.o
/usr/local/ai/ppc826x-lx2.4-1.70/lib/gcc/powerpc-ai-linux/4.2.1/../../../../powerpc-ai-linux/lib/crtn.o
GNU ld (Linux/GNU Binutils) 2.17.50.0.17.20070615
  Supported emulations:
   elf32ppclinux
   elf32ppc
   elf32ppcsim


-- 
           Summary: Conditional operator optimization error with const int&
           Product: gcc
           Version: 4.1.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jeff_harris at kentrox dot com
  GCC host triplet: x86_64-redhat-linux
GCC target triplet: x86_64-redhat-linux


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



More information about the Gcc-bugs mailing list