diff options
author | Jan Hubicka <jh@suse.cz> | 2001-10-20 12:04:00 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2001-10-20 10:04:00 +0000 |
commit | b932f770f70d60b1d6c89d6ef1fe8dc88bdecda1 (patch) | |
tree | 8b850e82487dad7507a2357d498b653cbeb1d71e /gcc/flow.c | |
parent | 870628131ce6ff529817509e256c7ee035d37bfd (diff) | |
download | gcc-b932f770f70d60b1d6c89d6ef1fe8dc88bdecda1.zip gcc-b932f770f70d60b1d6c89d6ef1fe8dc88bdecda1.tar.gz gcc-b932f770f70d60b1d6c89d6ef1fe8dc88bdecda1.tar.bz2 |
basic-block.h (find_sub_basic_blocks): Use sbitmap parameter.
* basic-block.h (find_sub_basic_blocks): Use sbitmap parameter.
* cfgbuild.c (find_bb_boundaries, compute_outgoing_frequencies):
Break out from ...
(find_sub_basic_blocks): ... here;
(find_many_sub_basic_blocks): New.
* recog.c (split_all_insns): Update find_sub_basic_blocks call.
* i386.h (ASM_PREFERRED_EH_DATA_FORMAT): Define sdata4.
* i386.c (ix86_va_arg): Kill indirect_p handling; fix aliasing issues.:
* i386.c (split_di, split_ti): Revamp to use simplify_subreg.
* timevar.def (TV_LIFE, TV_LIFE_UPDATE, TV_MODE_SWITCH): new.
* flow.c (update_life_info): Measure time.
* c-decl.c: Include timevar.h
(c_expand_body): Measure time.
* toplev.c (rest_of_compilation): Measure time of mode switching
separately.
* Makefile.in (c-decl.o, cfgcleanup.o): Add dependancy.
* toplev.c (flag_asynchronous_unwind_tables): New global variable.
(lang_independent_options): Add asynchronous-unwind-tables
(toplev_main): flag_asynchronous_unwind_tables implies
flag_unwind_tables.
* flags.h (flag_asynchronous_unwind_tables): Declare.
* dwarf2out.c (dwarf2out_stack_adjust): Take into account
flag_asynchronous_unwind_tables.
(output_call_frame_info): Likewise.
* invoke.texi (-fasynchronous-unwind-tables): Document.
* i386.c (optimization_options): Enable
flag_asynchronous_unwind_tables.
* i386.c (ix86_expand_setcc): Always expect target to be QImode.
* i386.md (s* expanders): Destination is QImode.
* toplev.c (rest_of_compilation): Do not call clear_log_links.
* rtl.h (clear_log_links): Kill.
* flow.c (clear_log_links): Make static; accept blocks parameter;
do no clear life info.
(update_life_info): Call clear_log_links.
* cfganal.c (forwarder_block_p): Avoid active_insn_p calls.
From-SVN: r46374
Diffstat (limited to 'gcc/flow.c')
-rw-r--r-- | gcc/flow.c | 52 |
1 files changed, 32 insertions, 20 deletions
@@ -344,6 +344,7 @@ static void invalidate_mems_from_autoinc PARAMS ((struct propagate_block_info *, static void invalidate_mems_from_set PARAMS ((struct propagate_block_info *, rtx)); static void delete_dead_jumptables PARAMS ((void)); +static void clear_log_links PARAMS ((sbitmap)); void @@ -628,12 +629,19 @@ update_life_info (blocks, extent, prop_flags) tmp = INITIALIZE_REG_SET (tmp_head); + timevar_push ((extent == UPDATE_LIFE_LOCAL || blocks) + ? TV_LIFE_UPDATE : TV_LIFE); + /* Changes to the CFG are only allowed when doing a global update for the entire CFG. */ if ((prop_flags & PROP_ALLOW_CFG_CHANGES) && (extent == UPDATE_LIFE_LOCAL || blocks)) abort (); + /* Clear log links in case we are asked to (re)compute them. */ + if (prop_flags & PROP_LOG_LINKS) + clear_log_links (blocks); + /* For a global update, we go through the relaxation process again. */ if (extent != UPDATE_LIFE_LOCAL) { @@ -727,6 +735,8 @@ update_life_info (blocks, extent, prop_flags) } }); } + timevar_pop ((extent == UPDATE_LIFE_LOCAL || blocks) + ? TV_LIFE_UPDATE : TV_LIFE); } /* Free the variables allocated by find_basic_blocks. @@ -4088,31 +4098,33 @@ count_or_remove_death_notes (blocks, kill) return count; } -/* Clear LOG_LINKS fields of insns in a chain. - Also clear the global_live_at_{start,end} fields of the basic block - structures. */ +/* Clear LOG_LINKS fields of insns in a selected blocks or whole chain + if blocks is NULL. */ -void -clear_log_links (insns) - rtx insns; +static void +clear_log_links (blocks) + sbitmap blocks; { - rtx i; - int b; - - for (i = insns; i; i = NEXT_INSN (i)) - if (INSN_P (i)) - LOG_LINKS (i) = 0; + rtx insn; + int i; - for (b = 0; b < n_basic_blocks; b++) + if (!blocks) { - basic_block bb = BASIC_BLOCK (b); - - bb->global_live_at_start = NULL; - bb->global_live_at_end = NULL; + rtx insn; + for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) + if (INSN_P (insn)) + free_EXPR_LIST_list (&LOG_LINKS (insn)); } - - ENTRY_BLOCK_PTR->global_live_at_end = NULL; - EXIT_BLOCK_PTR->global_live_at_start = NULL; + else + EXECUTE_IF_SET_IN_SBITMAP (blocks, 0, i, + { + basic_block bb = BASIC_BLOCK (i); + rtx insn; + for (insn = bb->head; insn != NEXT_INSN (bb->end); + insn = NEXT_INSN (insn)) + if (INSN_P (insn)) + free_EXPR_LIST_list (&LOG_LINKS (insn)); + }); } /* Given a register bitmap, turn on the bits in a HARD_REG_SET that |