diff options
author | Jan Hubicka <jh@suse.cz> | 2002-03-06 11:17:23 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2002-03-06 10:17:23 +0000 |
commit | 3dec4024284c5108d43f436b4696edc0f40db749 (patch) | |
tree | 1a7be85532d6be381af338d07dbdca5f8fd08db0 /gcc/cfgcleanup.c | |
parent | 9533dec17344558707c2338385daeab4474305d0 (diff) | |
download | gcc-3dec4024284c5108d43f436b4696edc0f40db749.zip gcc-3dec4024284c5108d43f436b4696edc0f40db749.tar.gz gcc-3dec4024284c5108d43f436b4696edc0f40db749.tar.bz2 |
cfgrtl.c (delete_insn_and_edges, [...]): New.
* cfgrtl.c (delete_insn_and_edges, delete_insn_chain_and_edges): New.
* rtl.h (delete_insn_and_edges, delete_insn_chain_and_edges): Declare
* basic-block.h (update_life_info, update_life_info_in_dirty_blocks,
delete_noop_moves): Return indeger.
* flow.c (ndead): New variable.
(propagate_block_delete_insn): Use delete_insn_and_edges; remove
BB argument; update callers.
(propagate_block_delete_libcall): Use delete_insn_chain_and_edges.
(life_analysis): Do not call purge_all_dead_edges.
(update_life_info): Return number of deleted insns; print statistics.
(update_life_info_in_dirty_blocks): likewise.
(delete_noop_moves): Use delete_insn_and_edges; print statistics;
return number of insns deleted.
* cse.c: Include timevar.h
(delete_trivially_dead_insns): Kill preserve_basic_blocks argument;
iterate until stabilizes; print statistics; return number of killed
insns.
* Makefile.in: (cse.o): Add timevar.h dependency
* rtl.h (delete_trivially_dead_insns): New.
* timever.def: Add TV_DELETE_TRIVIALLY_DEAD timer.
* toplev.c (rest_of_compilation): Update callers.
* cfgcleanup.c (try_optimize_cfg): Kill blocks.
(try_optimize_cfg): Do not update liveness.
(cleanup-cfg): Loop until try_optimize_cfg and dead code
removal stabilizes; use delete_trivially_dead_insns.
* cfgrtl.c (verify_flow_info): Sanity check outgoing edges.
From-SVN: r50355
Diffstat (limited to 'gcc/cfgcleanup.c')
-rw-r--r-- | gcc/cfgcleanup.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index 017a4aa..a4dccbe 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -1510,7 +1510,6 @@ try_optimize_cfg (mode) bool changed_overall = false; bool changed; int iterations = 0; - sbitmap blocks; if (mode & CLEANUP_CROSSJUMP) add_noreturn_fake_exit_edges (); @@ -1673,11 +1672,6 @@ try_optimize_cfg (mode) if (mode & CLEANUP_CROSSJUMP) remove_fake_edges (); - if ((mode & CLEANUP_UPDATE_LIFE) && changed_overall) - update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL, - PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE - | PROP_KILL_DEAD_CODE | PROP_LOG_LINKS); - for (i = 0; i < n_basic_blocks; i++) BASIC_BLOCK (i)->aux = NULL; @@ -1720,9 +1714,39 @@ cleanup_cfg (mode) bool changed = false; timevar_push (TV_CLEANUP_CFG); - changed = delete_unreachable_blocks (); - if (try_optimize_cfg (mode)) - delete_unreachable_blocks (), changed = true; + if (delete_unreachable_blocks ()) + { + changed = true; + /* We've possibly created trivially dead code. Cleanup it right + now to introduce more oppurtunities for try_optimize_cfg. */ + if (!(mode & (CLEANUP_UPDATE_LIFE | CLEANUP_PRE_SIBCALL)) + && !reload_completed) + delete_trivially_dead_insns (get_insns(), max_reg_num ()); + } + while (try_optimize_cfg (mode)) + { + delete_unreachable_blocks (), changed = true; + if (mode & CLEANUP_UPDATE_LIFE) + { + /* Cleaning up CFG introduces more oppurtunities for dead code + removal that in turn may introduce more oppurtunities for + cleaning up the CFG. */ + if (!update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL, + PROP_DEATH_NOTES + | PROP_SCAN_DEAD_CODE + | PROP_KILL_DEAD_CODE + | PROP_LOG_LINKS)) + break; + } + else if (!(mode & CLEANUP_PRE_SIBCALL) && !reload_completed) + { + if (!delete_trivially_dead_insns (get_insns(), max_reg_num ())) + break; + } + else + break; + delete_dead_jumptables (); + } /* Kill the data we won't maintain. */ free_EXPR_LIST_list (&label_value_list); |