Bug 22619 - [3.4/4.0/4.1 regression] Compilation failure for real_const_1.f and real_const_2.f90
Summary: [3.4/4.0/4.1 regression] Compilation failure for real_const_1.f and real_cons...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: rtl-optimization (show other bugs)
Version: 4.1.0
: P2 normal
Target Milestone: 3.4.5
Assignee: Richard Henderson
URL:
Keywords: ice-on-valid-code
Depends on:
Blocks:
 
Reported: 2005-07-22 20:20 UTC by Thomas Koenig
Modified: 2005-07-29 05:04 UTC (History)
1 user (show)

See Also:
Host:
Target: i686-pc-linux-gnu
Build:
Known to work: 3.2.3 3.4.5 4.0.2
Known to fail: 3.3.3 3.4.0 4.0.0 4.1.0
Last reconfirmed: 2005-07-28 22:40:10


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Thomas Koenig 2005-07-22 20:20:04 UTC
$ gfortran -O3 real_const_2.f90
real_const_2.f90: In function 'MAIN__':
real_const_2.f90:23: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
$ cat real_const_2.f90
! { dg-do run }
!
! Free form test program for PR 17941 (signed constants with spaces)
!
program real_const_2
  complex c0, c1, c2, c3, c4
  real rp(4), rn(4)
  parameter (c0 = (-0.5, -     0.5))
  parameter (c1 = (-     0.5, +     0.5))
  parameter (c2 = (-    0.5E2, +0.5))
  parameter (c3 = (-0.5, +     0.5E-2))
  parameter (c4 = (-     1, +     1))
  data rn /- 1.0, - 1d0, - 1.d0, - 10.d-1/
  data rp /+ 1.0, + 1d0, + 1.d0, + 10.d-1/
  real, parameter :: del = 1.e-5

  if (abs(c0 - cmplx(-0.5,-0.5)) > del) call abort
  if (abs(c1 - cmplx(-0.5,+0.5)) > del) call abort
  if (abs(c2 - cmplx(-0.5E2,+0.5)) > del) call abort
  if (abs(c3 - cmplx(-0.5,+0.5E-2)) > del) call abort
  if (abs(c4 - cmplx(-1.0,+1.0)) > del) call abort
  if (any (abs (rp - 1.0) > del)) call abort
  if (any (abs (rn + 1.0) > del)) call abort
end program
$ gfortran -O3 real_const_2.f90
real_const_2.f90: In function 'MAIN__':
real_const_2.f90:23: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
$ cat real_const_2.f90
! { dg-do run }
!
! Free form test program for PR 17941 (signed constants with spaces)
!
program real_const_2
  complex c0, c1, c2, c3, c4
  real rp(4), rn(4)
  parameter (c0 = (-0.5, -     0.5))
  parameter (c1 = (-     0.5, +     0.5))
  parameter (c2 = (-    0.5E2, +0.5))
  parameter (c3 = (-0.5, +     0.5E-2))
  parameter (c4 = (-     1, +     1))
  data rn /- 1.0, - 1d0, - 1.d0, - 10.d-1/
  data rp /+ 1.0, + 1d0, + 1.d0, + 10.d-1/
  real, parameter :: del = 1.e-5

  if (abs(c0 - cmplx(-0.5,-0.5)) > del) call abort
  if (abs(c1 - cmplx(-0.5,+0.5)) > del) call abort
  if (abs(c2 - cmplx(-0.5E2,+0.5)) > del) call abort
  if (abs(c3 - cmplx(-0.5,+0.5E-2)) > del) call abort
  if (abs(c4 - cmplx(-1.0,+1.0)) > del) call abort
  if (any (abs (rp - 1.0) > del)) call abort
  if (any (abs (rn + 1.0) > del)) call abort
end program
$ gfortran -O3 real_const_2.f90
real_const_2.f90: In function 'MAIN__':
real_const_2.f90:23: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
$ gdb ~/libexec/gcc/i686-pc-linux-gnu/4.1.0/f951
GNU gdb 6.3-debian
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-linux"...Using host libthread_db library
"/lib/tls/libthread_db.so.1".

(gdb) r real_const_2.f90
Starting program: /home/ig25/libexec/gcc/i686-pc-linux-gnu/4.1.0/f951
real_const_2.f90
 MAIN__
Execution times (seconds)
 expand                :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 (50%) wall  12
kB ( 2%) ggc
 TOTAL                 :   0.01             0.00             0.02 573 kB
Extra diagnostic checks enabled; compiler may run slowly.
Configure with --disable-checking to disable checks.

Program exited normally.
(gdb) r -O3 real_const_2.f90
Starting program: /home/ig25/libexec/gcc/i686-pc-linux-gnu/4.1.0/f951 -O3
real_const_2.f90
 MAIN__
Analyzing compilation unitPerforming intraprocedural optimizations
Assembling functions:
 MAIN__
Program received signal SIGSEGV, Segmentation fault.
try_forward_edges (mode=Variable "mode" is not available.
) at ../../gcc-4.1/gcc/cfgcleanup.c:540
540                   if (NOTE_P (insn))
(gdb) bt
#0  try_forward_edges (mode=Variable "mode" is not available.
) at ../../gcc-4.1/gcc/cfgcleanup.c:540
#1  0x081484d7 in cleanup_cfg (mode=9) at ../../gcc-4.1/gcc/cfgcleanup.c:1982
#2  0x08167afe in rest_of_handle_cse () at ../../gcc-4.1/gcc/cse.c:7782
#3  0x08396714 in execute_one_pass (pass=0x85ae400)
    at ../../gcc-4.1/gcc/passes.c:790
#4  0x08396857 in execute_pass_list (pass=0x85ae400)
    at ../../gcc-4.1/gcc/passes.c:822
#5  0x0839686a in execute_pass_list (pass=0x85b56e0)
    at ../../gcc-4.1/gcc/passes.c:823
#6  0x080c51a6 in tree_rest_of_compilation (fndecl=0x4037d400)
    at ../../gcc-4.1/gcc/tree-optimize.c:419
#7  0x083e0da2 in cgraph_expand_function (node=0x4034d888)
    at ../../gcc-4.1/gcc/cgraphunit.c:1033
#8  0x083e3175 in cgraph_optimize () at ../../gcc-4.1/gcc/cgraphunit.c:1099
#9  0x08097dc5 in gfc_be_parse_file (set_yydebug=0)
    at ../../gcc-4.1/gcc/fortran/f95-lang.c:267
#10 0x08364d85 in toplev_main (argc=5, argv=0xbffff694)
    at ../../gcc-4.1/gcc/toplev.c:971
#11 0x40075974 in __libc_start_main () from /lib/tls/libc.so.6
#12 0x0804adb1 in _start () at ../sysdeps/i386/elf/start.S:102
Comment 1 Thomas Koenig 2005-07-22 20:22:48 UTC
I forget:

$ gfortran -v
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../gcc-4.1/configure --prefix=/home/ig25 --enable-languages=c,f95
Thread model: posix
gcc version 4.1.0 20050722 (experimental)
Comment 2 Andrew Pinski 2005-07-22 20:26:04 UTC
Note this is not reproducible on ppc-darwin.
Comment 3 Andrew Pinski 2005-07-22 20:36:49 UTC
Note -O2 -funroll-loops is enough to reproduce this.
Comment 4 Thomas Koenig 2005-07-23 07:06:01 UTC
The dump of the .optimzed contains a lot of statements like

Invalid sum of incoming frequencies 2731, should be 9500
<L28>:;
  if (ABS_EXPR <rp[1] - 1.0e+0> > 9.99999974737875163555145263671875e-6) goto <L
18>; else goto <L31>;

Invalid sum of incoming frequencies 9025, should be 9500
<L31>:;
  if (ABS_EXPR <rp[2] - 1.0e+0> > 9.99999974737875163555145263671875e-6) goto <L
18>; else goto <L34>;

I tried to convert this to C, but then optimization turned the program
into a no-op.
Comment 5 Francois-Xavier Coudert 2005-07-28 17:06:26 UTC
This does affect i686-linux and i386-freebsd, but not x86_64-linux. It appeared
between 20050716 and 20050717 (on both platforms).

Once again, sufficient testing would have revealed this. And inclusion of
gfortran in the automatic regtester wouldn't have hurt.
Comment 6 Andrew Pinski 2005-07-28 18:29:52 UTC
Here is a C testcase:
void f(void)
{
  int S3;
  _Bool test2;
  int S1;
  _Bool test0;
  static float rn[4] = {-1.0e+0, -1.0e+0, -1.0e+0, -1.0e+0};
  static float rp[4] =  {1.0e+0, 1.0e+0, 1.0e+0, 1.0e+0};
  _Bool D493;
  int D489;
  _Bool D487;
  int D483;
  test0 = 0;
  S1 = 1;
do{
  if (S1 > 4) break;
  D483 = S1 + -1;
  D487 = __builtin_fabsf (rp[D483] - 1.0f) > 1.e-5f;
  if (D487 != 0)
  {
    test0 = 1;
    break;
  }
  S1 = S1 +1;
  }while(1);
  if (test0) __builtin_abort();
  S3 = 1;
  test2 = 0;
do {
  if (S3 > 4) break;
  D489 = S3 + -1;
  D493 = __builtin_fabsf (rn[D489] + 1.0f) > 1.e-5f;
  if (D493 != 0){
    test2 = 1;
    break;
  }
  S3 = S3 + 1;
} while(1);
  if (test2) __builtin_abort();
}
Comment 7 Andrew Pinski 2005-07-28 18:43:52 UTC
And here is a testcase which fails from 3.3 and upwards at -O2 (on the mainline you have to supply 
-fno-tree-ccp -fno-tree-store-ccp as we optimize it at the tree level):
void f (void)
{
  static const float rp[4] = {1.0e+0, 1.0e+0, 1.0e+0, 1.0e+0};
  static const float rn[4] = {-1.0e+0, -1.0e+0, -1.0e+0, -1.0e+0};

  if (__builtin_fabsf(rp[0] - 1.0e+0f) > 9.99999974737875163555145263671875e-6f) goto L16; else 
goto L24;

L3:;
  if (__builtin_fabsf(rn[0] + 1.0e+0f) > 9.99999974737875163555145263671875e-6f) goto L18; else 
goto L33;

L10:;
  return;

L16:;
  __builtin_abort ();

L18:;
  __builtin_abort ();

L24:;
  if (__builtin_fabsf (rp[1] - 1.0e+0f) > 9.99999974737875163555145263671875e-6) goto L16; else 
goto L27;

L27:;
  if (__builtin_fabsf (rp[2] - 1.0e+0f) > 9.99999974737875163555145263671875e-6f) goto L16; else 
goto L30;

L30:;
  if (__builtin_fabsf (rp[3] - 1.0e+0f) > 9.99999974737875163555145263671875e-6f) goto L16; else 
goto L3;

L33:;
  if (__builtin_fabsf(rn[1] + 1.0e+0f) > 9.99999974737875163555145263671875e-6f) goto L18; else 
goto L36;

L36:;
  if (__builtin_fabsf(rn[2] + 1.0e+0f) > 9.99999974737875163555145263671875e-6f) goto L18; else 
goto L39;

L39:;
  if (__builtin_fabsf(rn[3] + 1.0e+0f) > 9.99999974737875163555145263671875e-6f) goto L18; else 
goto L10;

}
Comment 8 CVS Commits 2005-07-29 00:46:15 UTC
Subject: Bug 22619

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	rth@gcc.gnu.org	2005-07-29 00:45:59

Modified files:
	gcc            : ChangeLog cfgcleanup.c 

Log message:
	PR rtl-opt/22619
	* cfgcleanup.c (try_forward_edges): Watch out for end of
	insn chain.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.9592&r2=2.9593
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cfgcleanup.c.diff?cvsroot=gcc&r1=1.150&r2=1.151

Comment 9 CVS Commits 2005-07-29 00:51:33 UTC
Subject: Bug 22619

CVSROOT:	/cvs/gcc
Module name:	gcc
Branch: 	gcc-3_4-branch
Changes by:	rth@gcc.gnu.org	2005-07-29 00:51:20

Modified files:
	gcc            : ChangeLog cfgcleanup.c 

Log message:
	PR rtl-opt/22619
	* cfgcleanup.c (try_forward_edges): Watch out for end of
	insn chain.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=2.2326.2.890&r2=2.2326.2.891
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cfgcleanup.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.99.2.5&r2=1.99.2.6

Comment 10 CVS Commits 2005-07-29 00:55:53 UTC
Subject: Bug 22619

CVSROOT:	/cvs/gcc
Module name:	gcc
Branch: 	gcc-4_0-branch
Changes by:	rth@gcc.gnu.org	2005-07-29 00:55:38

Modified files:
	gcc            : ChangeLog cfgcleanup.c 

Log message:
	PR rtl-opt/22619
	* cfgcleanup.c (try_forward_edges): Watch out for end of
	insn chain.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=2.7592.2.340&r2=2.7592.2.341
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cfgcleanup.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.141.2.1&r2=1.141.2.2

Comment 11 Richard Henderson 2005-07-29 00:57:24 UTC
Fixed.