Bug 33644 - [4.3 Regression] ICE in local_cprop_pass with -ftrapv for crafty
Summary: [4.3 Regression] ICE in local_cprop_pass with -ftrapv for crafty
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: rtl-optimization (show other bugs)
Version: 4.3.0
: P1 normal
Target Milestone: 4.3.0
Assignee: Eric Botcazou
URL: http://gcc.gnu.org/ml/gcc-patches/200...
Keywords: ice-on-valid-code
Depends on:
Blocks:
 
Reported: 2007-10-03 18:07 UTC by Janis Johnson
Modified: 2007-10-22 19:31 UTC (History)
3 users (show)

See Also:
Host:
Target: powerpc-unknown-linux-gnu
Build:
Known to work:
Known to fail:
Last reconfirmed: 2007-10-11 18:12:09


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Janis Johnson 2007-10-03 18:07:07 UTC
Benchmark crafty from SPEC CPU2000 gets an ICE for 32-bit powerpc (linux, aix, darwin, eabi) when compiled with -O2 -ftrapv, as shown by this minimized test:

extern char *bar (const char *);
int *m, *b;

void
foo (void)
{
  int *mv;
  int p;
  char a[17];

  p = bar (a) - a;
  for (mv = m; mv < b; mv++)
    if (p && ((*mv  & 7) != p))
      *mv=0;
}

which gives the following output when compiled with -O2 -ftrapv:

bug.c: In function ‘foo’:
bug.c:15: internal compiler error: in local_cprop_pass, at gcse.c:3240
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
Comment 1 Janis Johnson 2007-10-03 18:08:25 UTC
A regression hunt identified the following patch:

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

    r125624 | dberlin | 2007-06-11 18:02:15 +0000 (Mon, 11 Jun 2007)

This is the merge of the dataflow branch into mainline.
Comment 2 Kenneth Zadeck 2007-10-15 13:11:27 UTC
Subject: Re:  [4.3 Regression] ICE in local_cprop_pass
 with -ftrapv for crafty

> On Sun, Oct 14, 2007 at 12:29:44PM -0400, Kenneth Zadeck wrote:

> > > I have not looked at this bug.  I am happy to if you want.  I am sure
> > > that it will be trivial to modify the pass that moved/created the insn
> > > in the middle of the libcall to inherit the LIB_CALL_ID from the
> > > previous insn. 
>   

> That is not desirable, if anything in this case the insn should be
> added before the whole libcall sequence rather than before the insn
> that actually needs it.  Otherwise, useless insns added to the libcall
> sequences wouldn't be ever DCEd.

> While it might be easy to modify the instantiate_virtual_regs, there
> are dozens of other passes that do similar things, so at least for 4.3 it is
> highly unlikely they will be all modified.

>	Jakub


Jakub, i will fix this by moving the insn before the libcall.  It may take me a day of so because i am under the weather.  But i will do it soon.

kenny

Comment 3 Eric Botcazou 2007-10-22 19:28:36 UTC
Subject: Bug 33644

Author: ebotcazou
Date: Mon Oct 22 19:28:23 2007
New Revision: 129556

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=129556
Log:
	PR rtl-optimization/33644
	* cfgcleanup.c: Do not include dce.h.
	* cfgrtl.c (delete_insn_chain_and_edges): Resurrect.
	* combine.c (distribute_notes): Delete REG_LIBCALL_ID case.
	* dce.c (something_changed): Delete.
	(libcall_dead_p): New predicate.
	(delete_unmarked_insns): Use it to delete dead libcalls.
	Deal with REG_LIBCALL and REG_RETVAL notes.
	(prescan_libcall_for_dce): New function.
	(prescan_insns_for_dce): Use it to deal with libcalls.
	(mark_reg_dependencies): Do nothing special for libcalls.
	(dce_process_block): Likewise.
	(fast_dce): Delete unused local variable.
	(run_fast_dce): Do not return a value.
	* dce.h (struct df): Delete.
	(run_fast_dce): Adjust prototype.
	* optabs.c (libcall_id): Delete.
	(maybe_encapsulate_block): Do not emit REG_LIBCALL_ID notes.
	(emit_no_conflict_block): Do not look for REG_LIBCALL_ID notes.
	* reload1.c (reload): Delete REG_LIBCALL_ID case.
	* rtl.h (delete_insn_chain_and_edges): Resurrect prototype.
	* see.c (see_update_relevancy): Look for REG_LIBCALL and REG_RETVAL
	notes instead of REG_LIBCALL_ID notes.
	* reg-notes.def (LIBCALL_ID): Delete.
	* Makefile.in (see.o): Add dce.h dependency.
	(cfgcleanup.o): Remove dce.h dependency.


Added:
    trunk/gcc/testsuite/gcc.dg/pr33644.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/Makefile.in
    trunk/gcc/cfgcleanup.c
    trunk/gcc/cfgrtl.c
    trunk/gcc/combine.c
    trunk/gcc/dce.c
    trunk/gcc/dce.h
    trunk/gcc/optabs.c
    trunk/gcc/reg-notes.def
    trunk/gcc/reload1.c
    trunk/gcc/rtl.h
    trunk/gcc/see.c
    trunk/gcc/testsuite/ChangeLog

Comment 4 Eric Botcazou 2007-10-22 19:31:47 UTC
Thanks for reporting this.