------- Comment #1 from zadeck at naturalbridge dot com 2007-06-17 20:13 ------- Subject: Re: [4.3 Regression] ICE in df_lr_verify_transfer_functions, at df-problems.c:1924
There are possibly two problems here. Fixing the first one fixes this ice. The first problem is that after a call to cse_main, a call to df_finish_pass is needed to get out of deferred rescanning mode and get everything up to date. The possible second problem is that something in one of delete_trivially_dead_insns rebuild_jump_labels cleanup_cfg may not work in deferred rescanning mode. This will wait for another bug report. It is too hard to debug this without first cleaning up what cse_main did and that makes the bug go away. ok to commit? Kenny 2007-06-17 Kenneth Zadeck <[EMAIL PROTECTED]> PR middle-end/32355 * gcse (rest_of_handle_gcse): Add call to df_finish_pass after cse_main. * df-problems.c (df_note_bb_compute): Fix dumping info. 2007-06-17 Kenneth Zadeck <[EMAIL PROTECTED]> * gcc.c-torture/compile/pr32355.c: New testcase. Index: testsuite/gcc.c-torture/compile/pr32355.c =================================================================== --- testsuite/gcc.c-torture/compile/pr32355.c (revision 0) +++ testsuite/gcc.c-torture/compile/pr32355.c (revision 0) @@ -0,0 +1,33 @@ +/* { dg-options "-O3" } */ + +typedef struct +{ +} +__sigset_t; +typedef struct +{ + char coredump; +} +EMode; +extern EMode Mode; +struct sigaction +{ + __sigset_t sa_mask; + int sa_flags; +}; +doSignalsSetup (void) +{ + static const int signals[] = { + 1, 2 , 3, 4, 6, 8, 11, 13, 14, 15, 10, 12, 17, 7 + }; + unsigned int i, sig; + struct sigaction sa; + for (i = 0; i < sizeof (signals) / sizeof (int); i++) + { + sig = signals[i]; + if (Mode.coredump && (sig == 4 || sig == 8)) + continue; + sa.sa_flags = (sig == 17); + sigemptyset (&sa.sa_mask); + } +} Index: gcse.c =================================================================== --- gcse.c (revision 125777) +++ gcse.c (working copy) @@ -6704,6 +6704,7 @@ rest_of_handle_gcse (void) { timevar_push (TV_CSE); tem2 = cse_main (get_insns (), max_reg_num ()); + df_finish_pass (); purge_all_dead_edges (); delete_trivially_dead_insns (get_insns (), max_reg_num ()); timevar_pop (TV_CSE); Index: df-problems.c =================================================================== --- df-problems.c (revision 125777) +++ df-problems.c (working copy) @@ -3867,8 +3867,10 @@ df_note_bb_compute (unsigned int bb_inde for (def_rec = df_get_artificial_defs (bb_index); *def_rec; def_rec++) { struct df_ref *def = *def_rec; +#ifdef REG_DEAD_DEBUGGING if (dump_file) fprintf (dump_file, "artificial def %d\n", DF_REF_REGNO (def)); +#endif if ((DF_REF_FLAGS (def) & DF_REF_AT_TOP) == 0) bitmap_clear_bit (live, DF_REF_REGNO (def)); -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32355