Bug 42294 - [4.5 Regression] ICE in code_motion_path_driver for 416.gamess
Summary: [4.5 Regression] ICE in code_motion_path_driver for 416.gamess
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: rtl-optimization (show other bugs)
Version: 4.5.0
: P2 normal
Target Milestone: 4.5.0
Assignee: Alexander Monakov
URL:
Keywords: ice-on-valid-code, patch
Depends on:
Blocks:
 
Reported: 2009-12-05 01:04 UTC by Janis Johnson
Modified: 2010-01-14 10:17 UTC (History)
8 users (show)

See Also:
Host:
Target: powerpc64-linux
Build:
Known to work:
Known to fail:
Last reconfirmed: 2009-12-07 18:23:47


Attachments
Minimized testcase. (445 bytes, text/plain)
2009-12-05 01:06 UTC, Janis Johnson
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Janis Johnson 2009-12-05 01:04:01 UTC
GCC trunk gets an internal compiler error when building SPEC CPU2000 test 416.gamess with "-O2 -fselective-scheduling2 -fsel-sched-pipelining -funroll-all-loops" on powerpc64-linux, as demonstrated by a minimized testcase that I'll attach to this PR.

elm3b187% /opt/gcc-nightly/trunk/bin/gfortran -c -O2 -fselective-scheduling2 -fsel-sched-pipelining -funroll-all-loops bug.f
bug.f: In function ‘orien’:
bug.f:35:0: internal compiler error: in code_motion_path_driver, at sel-sched.c:6532
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

The failure starts with this very large patch (Expand from SSA):

    http://gcc.gnu.org/viewcvs?view=rev&rev=146817

    r146817 | matz | 2009-04-26 19:35:04 +0000 (Sun, 26 Apr 2009)
Comment 1 Janis Johnson 2009-12-05 01:06:07 UTC
Created attachment 19233 [details]
Minimized testcase.
Comment 2 Janis Johnson 2009-12-05 01:07:35 UTC
The ICE occurs with a compiler built for powerpc64-linux but only for -m32 (the default for my compiler), not for -m64.  It does not occur for a powerpc-linux compiler.
Comment 3 Alexander Monakov 2009-12-07 18:23:47 UTC
Also not reproducible on x86_64->ppc64 cross.
While codegen differences on ppc/ppc64/x86_64 cross are certainly surprising, in the end this testcase most likely indicates a bug in sel-sched.
Comment 4 Alexander Monakov 2009-12-08 11:55:18 UTC
(In reply to comment #3)
> Also not reproducible on x86_64->ppc64 cross.
> While codegen differences on ppc/ppc64/x86_64 cross are certainly surprising,
> in the end this testcase most likely indicates a bug in sel-sched.

Reprodicible on x86_64->ppc64 cross with -fno-section-anchors appended to command line.  Native ppc64 compiler seems to not use section anchors on this testcase.
Comment 5 Richard Biener 2009-12-11 23:10:51 UTC
A regression because it works with 4.4.x?
Comment 6 Janis Johnson 2009-12-12 00:27:49 UTC
The testcase with the options shown in the submitter's description compiles cleanly with the current 4.4 branch and with GCC 4.4.1.
Comment 7 Andrey Belevantsev 2009-12-24 08:18:55 UTC
The problem here is in the incorrect handling of the transformation history.  When an insn is transformed (i.e. substituted/speculated), this is recorded so that the insn could be found during upward code motion.  Part of the data recorded is the uid of insn on which the transformation happened.  As this second insn could get removed while filling a parallel group, and its bookkeeping copy could be created, we need to undo the transformation while moving through this copy instead of original insn.  To do this, we also maintain a bitmap of insn uids that could generate the copy (INSN_ORIGINATORS), and we also check it on the copies.  The actual bug was that the bitmap should contain all "ancestor insns" of a copy, not only "parents", as the copy found could originated from another copy (yes, I was stupid of not thinking about this earlier).  The alternate solution would be to make the search function recurse on INSN_ORIGINATORS bitmap, but this one seemed clearer.

Patch by Alexander below, we would need to ask someone with access to ppc64 to test it (as a part of combined patch fixing other sel-sched bugs) in addition to our testing.

	* sel-sched-ir.h (struct _sel_insn_data): Update comment.
	* sel-sched.c (move_exprs_to_boundary): Transitively add all
	originators' originators.
---
 gcc/sel-sched-ir.h |    3 ++-
 gcc/sel-sched.c    |    9 +++++++++
 2 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/gcc/sel-sched-ir.h b/gcc/sel-sched-ir.h
index 1950a65..67b5b62 100644
--- a/gcc/sel-sched-ir.h
+++ b/gcc/sel-sched-ir.h
@@ -715,7 +715,8 @@ struct _sel_insn_data
   bitmap found_deps;
 
   /* An INSN_UID bit is set when this is a bookkeeping insn generated from
-     a parent with this uid.  */
+     a parent with this uid.  If a parent is a bookkeeping copy, all its
+     originators are transitively included in this set.  */
   bitmap originators;
 
   /* A hashtable caching the result of insn transformations through this one.  */
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index e5ebc57..9fcc633 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -5211,12 +5211,21 @@ move_exprs_to_boundary (bnd_t bnd, expr_t expr_vliw,
 
   EXECUTE_IF_SET_IN_BITMAP (current_copies, 0, book_uid, bi)
     {
+      unsigned uid;
+      bitmap_iterator bi;
+
       /* We allocate these bitmaps lazily.  */
       if (! INSN_ORIGINATORS_BY_UID (book_uid))
         INSN_ORIGINATORS_BY_UID (book_uid) = BITMAP_ALLOC (NULL);
 
       bitmap_copy (INSN_ORIGINATORS_BY_UID (book_uid),
                    current_originators);
+
+      /* Transitively add all originators' originators.  */
+      EXECUTE_IF_SET_IN_BITMAP (current_originators, 0, uid, bi)
+       if (INSN_ORIGINATORS_BY_UID (uid))
+	 bitmap_ior_into (INSN_ORIGINATORS_BY_UID (book_uid),
+			  INSN_ORIGINATORS_BY_UID (uid));
     }
 
   return should_move;
 
Comment 8 Andrey Belevantsev 2010-01-14 10:16:34 UTC
Subject: Bug 42294

Author: abel
Date: Thu Jan 14 10:16:01 2010
New Revision: 155889

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=155889
Log:
        PR rtl-optimization/42294
        * sel-sched.c (try_replace_dest_reg): When chosen register
        and original register is the same, do not bail out early, but
        still check all original insns for validity of replacing destination
        register.  Set EXPR_TARGET_AVAILABLE to 1 before leaving function
        in this case.


Added:
    trunk/gcc/testsuite/gcc.dg/pr42249.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/sel-sched.c
    trunk/gcc/testsuite/ChangeLog

Comment 9 Andrey Belevantsev 2010-01-14 10:17:56 UTC
Fixed by r155889.
Comment 10 Alexander Monakov 2010-01-14 10:47:17 UTC
Subject: Bug 42294

Author: amonakov
Date: Thu Jan 14 10:46:57 2010
New Revision: 155893

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=155893
Log:
2010-01-14  Alexander Monakov  <amonakov@ispras.ru>

	PR rtl-optimization/42294
	* sel-sched-ir.h (struct _sel_insn_data): Update comment.
	* sel-sched.c (move_exprs_to_boundary): Transitively add all
	originators' originators.

	* gfortran.dg/pr42294.f: New.


Added:
    trunk/gcc/testsuite/gfortran.dg/pr42294.f
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/sel-sched-ir.h
    trunk/gcc/sel-sched.c
    trunk/gcc/testsuite/ChangeLog

Comment 11 hjl@gcc.gnu.org 2010-02-07 04:44:33 UTC
Subject: Bug 42294

Author: hjl
Date: Sun Feb  7 04:41:22 2010
New Revision: 156562

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=156562
Log:
Backport testcases from mainline to 4.4.

2010-02-06  H.J. Lu  <hongjiu.lu@intel.com>

	Backport from mainline:
	2010-02-05  Dodji Seketeli  <dodji@redhat.com>

	PR c++/42915
	* g++.dg/other/crash-9.C: New test.

	2010-02-03  Jason Merrill  <jason@redhat.com>

	PR c++/40138
	* g++.dg/ext/builtin11.C: New.

	2010-02-03  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/42944
	* gcc.dg/errno-1.c: New testcase.

	2010-02-03  Richard Guenther  <rguenther@suse.de>

	PR middle-end/42927
	* gcc.c-torture/compile/pr42927.c: New testcase.

	2010-01-29  Dodji Seketeli  <dodji@redhat.com>

	PR c++/42758
	PR c++/42634
	PR c++/42336
	PR c++/42797
	PR c++/42880
	* g++.dg/other/crash-5.C: New test.
	* g++.dg/other/crash-7.C: New test.
	* g++.dg/other/crash-8.C: New test.

	2010-01-28  Uros Bizjak  <ubizjak@gmail.com>

	PR target/42891
	* gcc.target/i386/pr42891.c: New test.

	2010-01-28  Richard Guenther  <rguenther@suse.de>

	PR middle-end/42883
	* g++.dg/torture/pr42883.C: New testcase.

	2010-01-28  Michael Matz  <matz@suse.de>

	* gcc.target/i386/pr42881.c: New test.

	2010-01-28  Dodji Seketeli  <dodji@redhat.com>

	PR c++/42713
	PR c++/42820
	* g++.dg/template/typedef27.C: New test case.
	* g++.dg/template/typedef28.C: New test case.

	2010-01-27  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/42874
	* gcc.dg/vla-22.c: New test.

	2010-01-26  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/42250
	* gcc.dg/pr42250.c: New testcase.

	2010-01-25  Tobias Burnus  <burnus@net-b.de>

	PR fortran/42858
	* gfortran.dg/generic_21.f90: New test.

	2010-01-21  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/42585
	* gcc.dg/tree-ssa/pr42585.c: New test.

	2010-01-20  Alexandre Oliva  <aoliva@redhat.com>

	PR debug/42715
	* gcc.dg/pr42715.c: New.

	2010-01-20  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/42717
	* gcc.c-torture/compile/pr42717.c: New testcase.

	2010-01-19  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/42783
	* gfortran.dg/bounds_check_15.f90 : New test.

	2010-01-18  Dodji Seketeli  <dodji@redhat.com>

	PR c++/42766
	* g++.dg/conversion/op6.C: New test.

	2010-01-18  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/42781
	* gfortran.fortran-torture/compile/pr42781.f90: New testcase.

	2010-01-17  Richard Guenther  <rguenther@suse.de>

	PR middle-end/42248
	* gcc.c-torture/execute/pr42248.c: New testcase.

	2010-01-17  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/42677
	* gfortran.dg/interface_assignment_5.f90: New test.

	2010-01-15  Richard Guenther  <rguenther@suse.de>

	PR middle-end/42739
	* g++.dg/torture/pr42739.C: New testcase.

	2010-01-14 Jerry DeLisle <jvdelisle@gcc.gnu.org>

	PR fortran/42684
	* gfortran.dg/interface_31.f90: New test.

	2010-01-14  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/42706
	* gcc.dg/ipa/pr42706.c: New testcase.

	2010-01-14  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/42714
	* g++.dg/torture/pr42714.C: New test.

	2010-01-14  Alexander Monakov  <amonakov@ispras.ru>

	PR rtl-optimization/42388
	* gcc.dg/pr42388.c: New.

	2010-01-14  Alexander Monakov <amonakov@ispras.ru>

	PR rtl-optimization/42294
	* gfortran.dg/pr42294.f: New.

	2010-01-14  Ira Rosen  <irar@il.ibm.com>

	PR tree-optimization/42709
	* gcc.dg/vect/pr42709.c: New test.

	2010-01-13  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/42730
	* gcc.c-torture/compile/pr42730.c: New testcase.

	2010-01-13  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/42704
	* g++.dg/torture/pr42704.C: New test.

	2010-01-13  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/42703
	* gcc.c-torture/compile/pr42703.c: New test.

	2010-01-13  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/42705
	* gcc.c-torture/compile/pr42705.c: New testcase.

	2010-01-13  Richard Guenther  <rguenther@suse.de>

	PR middle-end/42716
	* gcc.c-torture/compile/pr42716.c: New testcase.

	2010-01-12  Joseph Myers  <joseph@codesourcery.com>

	PR c/42708
	* gcc.c-torture/compile/pr42708-1.c: New test.

	2010-01-09  Alexandre Oliva  <aoliva@redhat.com>

	PR middle-end/42363
	* gcc.dg/torture/pr42363.c: New.

	2010-01-09  Alexandre Oliva  <aoliva@redhat.com>

	PR debug/42604
	PR debug/42395
	* gcc.dg/vect/pr42604.c: New.
	* gcc.dg/vect/pr42395.c: New.

	2010-01-09  Richard Guenther  <rguenther@suse.de>

	PR middle-end/42512
	* gcc.c-torture/execute/pr42512.c: New testcase.

Added:
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/conversion/op6.C
      - copied unchanged from r156561, trunk/gcc/testsuite/g++.dg/conversion/op6.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/ext/builtin11.C
      - copied unchanged from r156561, trunk/gcc/testsuite/g++.dg/ext/builtin11.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/other/crash-5.C
      - copied unchanged from r156561, trunk/gcc/testsuite/g++.dg/other/crash-5.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/other/crash-7.C
      - copied unchanged from r156561, trunk/gcc/testsuite/g++.dg/other/crash-7.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/other/crash-8.C
      - copied unchanged from r156561, trunk/gcc/testsuite/g++.dg/other/crash-8.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/other/crash-9.C
      - copied unchanged from r156561, trunk/gcc/testsuite/g++.dg/other/crash-9.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/template/typedef27.C
      - copied unchanged from r156561, trunk/gcc/testsuite/g++.dg/template/typedef27.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/template/typedef28.C
      - copied unchanged from r156561, trunk/gcc/testsuite/g++.dg/template/typedef28.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/torture/pr42704.C
      - copied unchanged from r156561, trunk/gcc/testsuite/g++.dg/torture/pr42704.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/torture/pr42714.C
      - copied unchanged from r156561, trunk/gcc/testsuite/g++.dg/torture/pr42714.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/torture/pr42739.C
      - copied unchanged from r156561, trunk/gcc/testsuite/g++.dg/torture/pr42739.C
    branches/gcc-4_4-branch/gcc/testsuite/g++.dg/torture/pr42883.C
      - copied unchanged from r156561, trunk/gcc/testsuite/g++.dg/torture/pr42883.C
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42703.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.c-torture/compile/pr42703.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42705.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.c-torture/compile/pr42705.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42708-1.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.c-torture/compile/pr42708-1.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42716.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.c-torture/compile/pr42716.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42717.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.c-torture/compile/pr42717.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42730.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.c-torture/compile/pr42730.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/compile/pr42927.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.c-torture/compile/pr42927.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/execute/pr42248.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.c-torture/execute/pr42248.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.c-torture/execute/pr42512.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.c-torture/execute/pr42512.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/errno-1.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.dg/errno-1.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/ipa/pr42706.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.dg/ipa/pr42706.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/pr42250.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.dg/pr42250.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/pr42388.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.dg/pr42388.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/pr42715.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.dg/pr42715.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/torture/pr42363.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.dg/torture/pr42363.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/tree-ssa/pr42585.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.dg/tree-ssa/pr42585.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/vect/pr42395.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.dg/vect/pr42395.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/vect/pr42604.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.dg/vect/pr42604.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/vect/pr42709.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.dg/vect/pr42709.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/vla-22.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.dg/vla-22.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.target/i386/pr42881.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.target/i386/pr42881.c
    branches/gcc-4_4-branch/gcc/testsuite/gcc.target/i386/pr42891.c
      - copied unchanged from r156561, trunk/gcc/testsuite/gcc.target/i386/pr42891.c
    branches/gcc-4_4-branch/gcc/testsuite/gfortran.dg/bounds_check_15.f90
      - copied unchanged from r156561, trunk/gcc/testsuite/gfortran.dg/bounds_check_15.f90
    branches/gcc-4_4-branch/gcc/testsuite/gfortran.dg/generic_21.f90
      - copied unchanged from r156561, trunk/gcc/testsuite/gfortran.dg/generic_21.f90
    branches/gcc-4_4-branch/gcc/testsuite/gfortran.dg/interface_31.f90
      - copied unchanged from r156561, trunk/gcc/testsuite/gfortran.dg/interface_31.f90
    branches/gcc-4_4-branch/gcc/testsuite/gfortran.dg/interface_assignment_5.f90
      - copied unchanged from r156561, trunk/gcc/testsuite/gfortran.dg/interface_assignment_5.f90
    branches/gcc-4_4-branch/gcc/testsuite/gfortran.dg/pr42294.f
      - copied unchanged from r156561, trunk/gcc/testsuite/gfortran.dg/pr42294.f
    branches/gcc-4_4-branch/gcc/testsuite/gfortran.fortran-torture/compile/pr42781.f90
      - copied unchanged from r156561, trunk/gcc/testsuite/gfortran.fortran-torture/compile/pr42781.f90
Modified:
    branches/gcc-4_4-branch/gcc/testsuite/ChangeLog

Comment 12 Andrey Belevantsev 2010-08-24 08:55:49 UTC
Subject: Bug 42294

Author: abel
Date: Tue Aug 24 08:55:33 2010
New Revision: 163503

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=163503
Log:
Backport from mainline:
        PR rtl-optimization/42294
         * sel-sched.c (try_replace_dest_reg): When chosen register
         and original register is the same, do not bail out early, but
         still check all original insns for validity of replacing destination
         register.  Set EXPR_TARGET_AVAILABLE to 1 before leaving function
         in this case.


Added:
    branches/gcc-4_4-branch/gcc/testsuite/gcc.dg/pr42249.c
Modified:
    branches/gcc-4_4-branch/gcc/ChangeLog
    branches/gcc-4_4-branch/gcc/sel-sched.c
    branches/gcc-4_4-branch/gcc/testsuite/ChangeLog

Comment 13 Andrey Belevantsev 2010-08-24 09:00:05 UTC
Subject: Bug 42294

Author: abel
Date: Tue Aug 24 08:59:47 2010
New Revision: 163506

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=163506
Log:
Backport from mainline:
 2010-01-14  Alexander Monakov  <amonakov@ispras.ru>

        PR rtl-optimization/42294
        * sel-sched-ir.h (struct _sel_insn_data): Update comment.
        * sel-sched.c (move_exprs_to_boundary): Transitively add all
        originators' originators.


Modified:
    branches/gcc-4_4-branch/gcc/ChangeLog
    branches/gcc-4_4-branch/gcc/sel-sched-ir.h
    branches/gcc-4_4-branch/gcc/sel-sched.c
    branches/gcc-4_4-branch/gcc/testsuite/ChangeLog