Bug 42084 - [4.5 Regression] Wrong result with -Os -fno-delete-null-pointer-checks
Summary: [4.5 Regression] Wrong result with -Os -fno-delete-null-pointer-checks
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: rtl-optimization (show other bugs)
Version: 4.5.0
: P1 normal
Target Milestone: 4.5.0
Assignee: Michael Matz
URL:
Keywords: wrong-code
Depends on:
Blocks:
 
Reported: 2009-11-17 21:06 UTC by Yang Chen
Modified: 2016-03-24 17:20 UTC (History)
5 users (show)

See Also:
Host: i686-pc-linux-gnu
Target: i686-pc-linux-gnu
Build: i686-pc-linux-gnu
Known to work: 4.4.2
Known to fail: 4.5.0
Last reconfirmed: 2009-11-27 14:25:12


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Yang Chen 2009-11-17 21:06:54 UTC
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)
Comment 1 Yang Chen 2009-11-17 21:13:41 UTC
The inconsistent results also show up with the following combinations:

-O3 -fno-delete-null-pointer-checks
-O2 -fno-delete-null-pointer-checks
Comment 2 Yang Chen 2009-11-17 21:21:27 UTC
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. 
Comment 3 Richard Biener 2009-11-18 09:57:52 UTC
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.
Comment 4 Richard Biener 2009-11-27 13:22:04 UTC
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.
Comment 5 Richard Biener 2009-11-27 13:22:49 UTC
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;
}
Comment 6 Michael Matz 2009-11-27 14:25:12 UTC
Mine.
Comment 7 Michael Matz 2009-11-27 15:36:06 UTC
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

Comment 8 Michael Matz 2009-11-27 15:37:43 UTC
Fixed.
Comment 9 hjl@gcc.gnu.org 2009-12-11 23:38:13 UTC
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