diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d290dd235b3ff25c488d450832e81093d98d106..535d095bc11e9492a0371a8f7e7807d6eb6e5f4d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +Fri Mar 8 21:27:49 CET 2002 Jan Hubicka <jh@suse.cz> + + * cfgrtl.c (purge_dead_edges): Set BB_DRITY flags if edge has been + removed; fix return value. + * combine.c (combine_instructions): Dirtify blocks where we failed to + update liveness; purge dead edges; use update_life_info_in_dirty_blocks. + * toplev.c (rest_of_compilation): Do not purge_dead_edges after combine. + 2002-03-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * gcse.c (insert_insn_end_bb): Fix typo in last change. diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 7e3ebadbf04a287afd963338898f037bba24138c..6e929eb0dad7260a619990f18695e394df91ae70 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -2108,6 +2108,7 @@ purge_dead_edges (bb) if (e->flags & EDGE_EH) { remove_edge (e); + bb->flags |= BB_DIRTY; purged = true; } } @@ -2121,7 +2122,7 @@ purge_dead_edges (bb) if (!any_condjump_p (insn) && !returnjump_p (insn) && !simplejump_p (insn)) - return false; + return purged; /* Branch probability/prediction notes are defined only for condjumps. We've possibly turned condjump into simplejump. */ @@ -2154,12 +2155,13 @@ purge_dead_edges (bb) && returnjump_p (insn)) continue; + bb->flags |= BB_DIRTY; purged = true; remove_edge (e); } if (!bb->succ || !purged) - return false; + return purged; if (rtl_dump_file) fprintf (rtl_dump_file, "Purged edges from bb %i\n", bb->index); @@ -2206,7 +2208,11 @@ purge_dead_edges (bb) { next = e->succ_next; if (!(e->flags & EDGE_FALLTHRU)) - remove_edge (e), purged = true; + { + bb->flags |= BB_DIRTY; + remove_edge (e); + purged = true; + } } if (!bb->succ || bb->succ->succ_next) diff --git a/gcc/combine.c b/gcc/combine.c index c9a67033dc8601bcdca4894de4cb40c9af4a365e..b734231480bffa27724f45802de43f73a2af2e37 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -739,14 +739,16 @@ combine_instructions (f, nregs) ; } } + clear_bb_flags (); + EXECUTE_IF_SET_IN_SBITMAP (refresh_blocks, 0, this_basic_block, + BASIC_BLOCK (this_basic_block)->flags |= BB_DIRTY); + new_direct_jump_p |= purge_all_dead_edges (0); delete_noop_moves (f); - if (need_refresh) - { - update_life_info (refresh_blocks, UPDATE_LIFE_GLOBAL_RM_NOTES, - PROP_DEATH_NOTES); - } + update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES, + PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE + | PROP_KILL_DEAD_CODE); /* Clean up. */ sbitmap_free (refresh_blocks); diff --git a/gcc/toplev.c b/gcc/toplev.c index bd25b41baed54128a4ab481c42fa72c1c89c88ea..740bf89221940572b588cd2165d1c138e98abc87 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -3058,10 +3058,6 @@ rest_of_compilation (decl) rebuild_jump_labels_after_combine = combine_instructions (insns, max_reg_num ()); - /* Always purge dead edges, as we may eliminate an insn throwing - exception. */ - rebuild_jump_labels_after_combine |= purge_all_dead_edges (true); - /* Combining insns may have turned an indirect jump into a direct jump. Rebuid the JUMP_LABEL fields of jumping instructions. */