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.
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.
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
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
Thanks for reporting this.