We found an inconsistent result when we were testing the options used to build Linux kernels. See the code below. BTW, I am using r154188. yang@yang-working:~$ svngcc -O1 -o small_1 small.c yang@yang-working:~$ ./small_1 g = 2 yang@yang-working:~$ svngcc -Os -fno-delete-null-pointer-checks -o small_s small.c yang@yang-working:~$ ./small_s g = 1 yang@yang-working:~$ cat small.c #include <stdio.h> int g = 0; static int foo(int ui1, int ui2) { if (ui2 == 0) return ui1; else return ui1 + ui2; } void func_2(long long p); void func_2(long long p) { if ((g > p) == (g <= foo(8, (&g != 0)))) { g = 1; } else { g = 2; } } int main(void) { func_2(1); printf("g = %d\n", g); return 0; } yang@yang-working:~$ svngcc -v Using built-in specs. COLLECT_GCC=svngcc COLLECT_LTO_WRAPPER=/home/yang/compilers/libexec/gcc/i686-pc-linux-gnu/4.5.0/lto-wrapper Target: i686-pc-linux-gnu Configured with: ../configure --enable-lto --prefix=/home/yang/compilers --program-prefix=svn --enable-languages=c,c++ --with-libelf=/home/yang/compilers : (reconfigured) ../configure --enable-lto --prefix=/home/yang/compilers --program-prefix=svn --with-libelf=/home/yang/compilers --enable-languages=c,lto,c++ --no-create --no-recursion : (reconfigured) ../configure --enable-lto --prefix=/home/yang/compilers --program-prefix=svn --with-libelf=/home/yang/compilers --enable-languages=c,c++,lto --no-create --no-recursion : (reconfigured) ../configure --enable-lto --prefix=/home/yang/compilers --program-prefix=svn --with-libelf=/home/yang/compilers --enable-languages=c,c++,lto --no-create --no-recursion : (reconfigured) ../configure --enable-lto --prefix=/home/yang/compilers --program-prefix=svn --with-libelf=/home/yang/compilers --enable-languages=c,c++,lto --no-create --no-recursion : (reconfigured) ../configure --enable-lto --prefix=/home/yang/compilers --program-prefix=svn --with-libelf=/home/yang/compilers --enable-languages=c,c++,lto --no-create --no-recursion Thread model: posix gcc version 4.5.0 20091115 (experimental) (GCC)
The inconsistent results also show up with the following combinations: -O3 -fno-delete-null-pointer-checks -O2 -fno-delete-null-pointer-checks
I am sorry I should also mention that the code works with "-Os", or "-O3" or "-O2", but not with the extra flag -fno-delete-null-pointer-checks.
Confirmed. Only fails with -m32 on x86_64. It is VRP that triggers the miscompile, thus -O1 -ftree-vrp -fno-delete-null-pointer-checks is enough.
Actually it is some RTL optimization pass that miscompiles this (func_2). With -fno-delete-null-pointer-checks we defer evaluating &g != 0 until expansion which then exposes CCP opportunities. With -O1 -fno-delete-null-pointer-checks -m32 -ftree-vrp -fno-if-conversion we generate func_2: pushl %ebp movl %esp, %ebp cmpl $9, g jg .L5 movl $1, g jmp .L1 .L5: movl $2, g .L1: popl %ebp ret which looks good apart from that we have deleted the comparison against p. This seems to happen between initial/final RTL during expansion.
int g = 0; static int foo(int ui1, int ui2) { if (ui2 == 0) return ui1; else return ui1 + ui2; } void func_2(long long p) { if ((g > p) == (g <= foo(8, (&g != 0)))) g = 1; else g = 2; } extern void abort (void); int main(void) { func_2(1); if (g != 2) abort (); return 0; }
Mine.
Subject: Bug 42084 Author: matz Date: Fri Nov 27 15:35:50 2009 New Revision: 154709 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=154709 Log: PR rtl-optimization/42084 * cfgexpand.c (maybe_cleanup_end_of_block): Add new parameter, use it to stop walking. (expand_gimple_cond): Adjust call to above. testsuite/ * gcc.dg/pr42084.c: New test. Added: trunk/gcc/testsuite/gcc.dg/pr42084.c Modified: trunk/gcc/ChangeLog trunk/gcc/cfgexpand.c trunk/gcc/testsuite/ChangeLog
Fixed.
Subject: Bug 42084 Author: hjl Date: Fri Dec 11 23:36:24 2009 New Revision: 155184 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=155184 Log: Backport testcases from trunk. 2009-12-11 H.J. Lu <hongjiu.lu@intel.com> Backport from mainline: 2009-12-11 Dodji Seketeli <dodji@redhat.com> PR c++/42225 * g++.dg/template/typedef24.C: New test. * g++.dg/template/typedef25.C: New test. 2009-12-11 Dodji Seketeli <dodji@redhat.com> PR c++/42251 * g++.dg/template/const3.C: New test. 2009-12-10 Jakub Jelinek <jakub@redhat.com> PR c++/42317 * g++.dg/opt/dtor2.C: New test. * g++.dg/opt/dtor2.h: New file. * g++.dg/opt/dtor2-aux.cc: New file. 2009-12-10 Jan Hubicka <jh@suse.cz> PR middle-end/42110 * g++.dg/torture/pr42110.C: new file. 2009-12-07 Jakub Jelinek <jakub@redhat.com> PR debug/42244 * gcc.dg/debug/pr42244.c: New test. 2009-12-04 David Daney <ddaney@caviumnetworks.com> PR rtl-optimization/42164 * gcc.c-torture/compile/pr42164.c: New test. 2009-12-03 Jason Merrill <jason@redhat.com> PR c++/41611 * g++.dg/abi/guard2.C: New. 2009-12-03 Dodji Seketeli <dodji@redhat.com> PR c++/42217 * g++.dg/other/bitfield4.C: New test. 2009-12-03 Jakub Jelinek <jakub@redhat.com> PR c++/42256 * g++.dg/inherit/thunk11.C: New test. * g++.dg/inherit/thunk11.h: New file. * g++.dg/inherit/thunk11-aux.cc: New file. 2009-12-01 Martin Jambor <mjambor@suse.cz> PR tree-optimization/42237 * gcc.c-torture/compile/pr42237.c: New test. 2009-12-01 Paolo Carlini <paolo.carlini@oracle.com> PR c++/42057 * g++.dg/parse/crash54.C: New. 2009-11-30 Martin Jambor <mjambor@suse.cz> PR middle-end/42196 * gcc.c-torture/compile/pr42196-1.c: New test. * gcc.c-torture/compile/pr42196-2.c: New test. * gcc.c-torture/compile/pr42196-3.c: New test. 2009-11-30 Dodji Seketeli <dodji@redhat.com> PR c++/42069 * g++.dg/template/typedef23.C: New test. 2009-11-29 H.J. Lu <hongjiu.lu@intel.com> PR tree-optimization/41961 * g++.dg/tree-ssa/pr41961.C: New. 2009-11-29 Ira Rosen <irar@il.ibm.com> PR tree-optimization/42193 * gcc.dg/vect/pr42193.c: New test. 2009-11-28 Richard Guenther <rguenther@suse.de> PR tree-optimization/42183 * g++.dg/torture/pr42183.C: New testcase. 2009-11-27 Martin Jambor <mjambor@suse.cz> PR middle-end/42006 * gcc.c-torture/execute/pr42006.c: New test. 2009-11-27 Michael Matz <matz@suse.de> PR rtl-optimization/42084 * gcc.dg/pr42084.c: New test. 2009-11-27 Michael Matz <matz@suse.de> PR c++/41906 * g++.dg/tree-ssa/pr41906.C: New testcase. 2009-11-26 Michael Matz <matz@suse.de> PR tree-optimization/41905 * g++.dg/tree-ssa/pr41905.C: New testcase. 2009-11-24 Richard Guenther <rguenther@suse.de> PR tree-optimization/42142 * gcc.c-torture/execute/pr42142.c: New testcase. 2009-11-24 Martin Jambor <mjambor@suse.cz> PR tree-optimization/42154 * gcc.c-torture/execute/pr42154.c: New test. 2009-11-21 Martin Jambor <mjambor@suse.cz> PR middle-end/42025 * gcc.c-torture/compile/pr42025-1.c: New test. * gcc.c-torture/compile/pr42025-2.c: New test. 2009-11-21 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/42078 * gcc.dg/pr42078.c: New test. Added: branches/gcc-4_4-branch/gcc/testsuite/g++.dg/abi/guard2.C - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/abi/guard2.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/inherit/thunk11-aux.cc branches/gcc-4_4-branch/gcc/testsuite/g++.dg/inherit/thunk11.C - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/inherit/thunk11.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/inherit/thunk11.h - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/inherit/thunk11.h branches/gcc-4_4-branch/gcc/testsuite/g++.dg/opt/dtor2-aux.cc - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/opt/dtor2-aux.cc branches/gcc-4_4-branch/gcc/testsuite/g++.dg/opt/dtor2.C - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/opt/dtor2.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/opt/dtor2.h - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/opt/dtor2.h branches/gcc-4_4-branch/gcc/testsuite/g++.dg/other/bitfield4.C - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/other/bitfield4.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/parse/crash54.C - copied unchanged from r155172, trunk/gcc/testsuite/g++.dg/parse/crash54.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/template/const3.C - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/template/const3.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/template/typedef23.C - copied unchanged from r155181, trunk/gcc/testsuite/g++.dg/template/typedef23.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/template/typedef24.C - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/template/typedef24.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/template/typedef25.C - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/template/typedef25.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/torture/pr42110.C - copied unchanged from r155170, trunk/gcc/testsuite/g++.dg/torture/pr42110.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/torture/pr42183.C - copied unchanged from r155181, trunk/gcc/testsuite/g++.dg/torture/pr42183.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/tree-ssa/pr41905.C - copied unchanged from r155182, trunk/gcc/testsuite/g++.dg/tree-ssa/pr41905.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/tree-ssa/pr41906.C - copied unchanged from r155182, trunk/gcc/testsuite/g++.dg/tree-ssa/pr41906.C branches/gcc-4_4-branch/gcc/testsuite/g++.dg/tree-ssa/pr41961.C - copied unchanged from r155181, trunk/gcc/testsuite/g++.dg/tree-ssa/pr41961.C branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42025-1.c - copied unchanged from r155182, trunk/gcc/testsuite/gcc.c-torture/compile/pr42025-1.c branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42025-2.c - copied unchanged from r155182, trunk/gcc/testsuite/gcc.c-torture/compile/pr42025-2.c branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42164.c - copied unchanged from r155170, trunk/gcc/testsuite/gcc.c-torture/compile/pr42164.c branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42196-1.c - copied unchanged from r155181, trunk/gcc/testsuite/gcc.c-torture/compile/pr42196-1.c branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42196-2.c - copied unchanged from r155181, trunk/gcc/testsuite/gcc.c-torture/compile/pr42196-2.c branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42196-3.c - copied unchanged from r155181, trunk/gcc/testsuite/gcc.c-torture/compile/pr42196-3.c branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42237.c - copied unchanged from r155171, trunk/gcc/testsuite/gcc.c-torture/compile/pr42237.c branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/execute/pr42006.c - copied unchanged from r155181, trunk/gcc/testsuite/gcc.c-torture/execute/pr42006.c branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/execute/pr42142.c - copied unchanged from r155182, trunk/gcc/testsuite/gcc.c-torture/execute/pr42142.c branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/execute/pr42154.c - copied unchanged from r155182, trunk/gcc/testsuite/gcc.c-torture/execute/pr42154.c branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/debug/pr42244.c - copied unchanged from r155170, trunk/gcc/testsuite/gcc.dg/debug/pr42244.c branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/pr42078.c - copied unchanged from r155182, trunk/gcc/testsuite/gcc.dg/pr42078.c branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/pr42084.c - copied unchanged from r155182, trunk/gcc/testsuite/gcc.dg/pr42084.c branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/vect/pr42193.c - copied unchanged from r155181, trunk/gcc/testsuite/gcc.dg/vect/pr42193.c Modified: branches/gcc-4_4-branch/gcc/testsuite/ChangeLog