diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-10-16 20:24:41 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-10-16 20:24:41 +0000 |
commit | 3c6c0b50fcc63a7fe6433b83c3e41b7862f4087e (patch) | |
tree | e3c7cff2c37353901231c1b5d89d9ca3540607ba /gcc/dce.c | |
parent | 4825c722991c8b820538256e1b80d7b89ec3a2ed (diff) | |
download | gcc-3c6c0b50fcc63a7fe6433b83c3e41b7862f4087e.tar.gz |
* dce.c (init_dce): Only initialize the obstacks for the fast pass.
(fini_dce): Only release them for the fast pass.
(end_ud_dce): Delete.
(rest_of_handle_ud_dce): Do not modify df_in_progress.
Call fini_dce instead of end_ud_dce.
(rest_of_handle_fast_dce): Do not modify df_in_progress.
(run_fast_df_dce): Reset df_in_progress to false on exit.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129384 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dce.c')
-rw-r--r-- | gcc/dce.c | 116 |
1 files changed, 61 insertions, 55 deletions
diff --git a/gcc/dce.c b/gcc/dce.c index b892d84f89d..e38e79732da 100644 --- a/gcc/dce.c +++ b/gcc/dce.c @@ -42,7 +42,8 @@ DEF_VEC_ALLOC_I(int,heap); Core mark/delete routines ------------------------------------------------------------------------- */ -/* The data-flow information needed by this pass. */ +/* True if we are invoked while the df engine is running; in this case, + we don't want to reenter it. */ static bool df_in_progress = false; /* True if we deleted at least one instruction. */ @@ -52,10 +53,13 @@ static bool something_changed; yet been processed. */ static VEC(rtx,heap) *worklist; +/* Bitmap of instructions marked as needed indexed by INSN_UID. */ +static sbitmap marked; + +/* Bitmap obstacks used for block processing by the fast algorithm. */ static bitmap_obstack dce_blocks_bitmap_obstack; static bitmap_obstack dce_tmp_bitmap_obstack; -static sbitmap marked = NULL; /* A subroutine for which BODY is part of the instruction being tested; either the top-level pattern, or an element of a PARALLEL. The @@ -88,6 +92,7 @@ deletable_insn_p_1 (rtx body) } } + /* Return true if INSN is a normal instruction that can be deleted by the DCE pass. */ @@ -133,7 +138,7 @@ deletable_insn_p (rtx insn, bool fast) } -/* Return true if INSN has not been marked as needed. */ +/* Return true if INSN has been marked as needed. */ static inline int marked_insn_p (rtx insn) @@ -198,28 +203,6 @@ mark_nonreg_stores (rtx body, rtx insn, bool fast) } -/* Initialize global variables for a new DCE pass. */ - -static void -init_dce (bool fast) -{ - if (!df_in_progress) - { - if (!fast) - df_chain_add_problem (DF_UD_CHAIN); - df_analyze (); - } - - if (dump_file) - df_dump (dump_file); - - bitmap_obstack_initialize (&dce_blocks_bitmap_obstack); - bitmap_obstack_initialize (&dce_tmp_bitmap_obstack); - marked = sbitmap_alloc (get_max_uid () + 1); - sbitmap_zero (marked); -} - - /* Delete all REG_EQUAL notes of the registers INSN writes, to prevent bad dangling REG_EQUAL notes. */ @@ -263,6 +246,7 @@ delete_unmarked_insns (void) rtx insn, next; something_changed = false; + FOR_EACH_BB (bb) FOR_BB_INSNS_SAFE (bb, insn, next) if (INSN_P (insn)) @@ -309,6 +293,7 @@ delete_unmarked_insns (void) /* Mark all insns using DELETE_PARM in the libcall that contains START_INSN. */ + static void mark_libcall (rtx start_insn, bool delete_parm) { @@ -416,6 +401,7 @@ mark_artificial_uses (void) } } + /* Mark every instruction that defines a register value that INSN uses. */ static void @@ -443,11 +429,44 @@ mark_reg_dependencies (rtx insn) } +/* Initialize global variables for a new DCE pass. */ + static void -end_ud_dce (void) +init_dce (bool fast) +{ + if (!df_in_progress) + { + if (!fast) + df_chain_add_problem (DF_UD_CHAIN); + df_analyze (); + } + + if (dump_file) + df_dump (dump_file); + + if (fast) + { + bitmap_obstack_initialize (&dce_blocks_bitmap_obstack); + bitmap_obstack_initialize (&dce_tmp_bitmap_obstack); + } + + marked = sbitmap_alloc (get_max_uid () + 1); + sbitmap_zero (marked); +} + + +/* Free the data allocated by init_dce. */ + +static void +fini_dce (bool fast) { sbitmap_free (marked); - gcc_assert (VEC_empty (rtx, worklist)); + + if (fast) + { + bitmap_obstack_release (&dce_blocks_bitmap_obstack); + bitmap_obstack_release (&dce_tmp_bitmap_obstack); + } } @@ -458,7 +477,6 @@ rest_of_handle_ud_dce (void) { rtx insn; - df_in_progress = false; init_dce (false); prescan_insns_for_dce (false); @@ -468,12 +486,13 @@ rest_of_handle_ud_dce (void) insn = VEC_pop (rtx, worklist); mark_reg_dependencies (insn); } + /* Before any insns are deleted, we must remove the chains since they are not bidirectional. */ df_remove_problem (df_chain); delete_unmarked_insns (); - end_ud_dce (); + fini_dce (false); return 0; } @@ -503,25 +522,12 @@ struct tree_opt_pass pass_ud_rtl_dce = 'w' /* letter */ }; + /* ------------------------------------------------------------------------- Fast DCE functions ------------------------------------------------------------------------- */ - -/* Free the data allocated by init_dce. */ - -static void -fini_dce (void) -{ - sbitmap_free (marked); - bitmap_obstack_release (&dce_blocks_bitmap_obstack); - bitmap_obstack_release (&dce_tmp_bitmap_obstack); - df_in_progress = false; -} - - -/* Process basic block BB. Return true if the live_in set has - changed. */ +/* Process basic block BB. Return true if the live_in set has changed. */ static bool dce_process_block (basic_block bb, bool redo_out) @@ -655,12 +661,14 @@ dce_process_block (basic_block bb, bool redo_out) return block_changed; } + +/* Perform fast DCE once initialization is done. */ + static void fast_dce (void) { int *postorder = df_get_postorder (DF_BACKWARD); int n_blocks = df_get_n_blocks (DF_BACKWARD); - int i; /* The set of blocks that have been seen on this iteration. */ bitmap processed = BITMAP_ALLOC (&dce_blocks_bitmap_obstack); /* The set of blocks that need to have the out vectors reset because @@ -668,8 +676,7 @@ fast_dce (void) bitmap redo_out = BITMAP_ALLOC (&dce_blocks_bitmap_obstack); bitmap all_blocks = BITMAP_ALLOC (&dce_blocks_bitmap_obstack); bool global_changed = true; - - int loop_count = 0; + int i, loop_count = 0; prescan_insns_for_dce (true); @@ -745,15 +752,14 @@ fast_dce (void) } -/* Callback for running pass_rtl_dce. */ +/* Fast DCE. */ static unsigned int rest_of_handle_fast_dce (void) { init_dce (true); fast_dce (); - fini_dce (); - df_in_progress = false; + fini_dce (true); return 0; } @@ -765,8 +771,7 @@ rest_of_handle_fast_dce (void) info, and then returns to allow the rest of the problems to be run. This can be called by elsewhere but it will not update the bit - vectors for any other problems than LR. -*/ + vectors for any other problems than LR. */ void run_fast_df_dce (void) @@ -781,10 +786,13 @@ run_fast_df_dce (void) df_in_progress = true; rest_of_handle_fast_dce (); + df_in_progress = false; + df_set_flags (old_flags); } } + static bool gate_fast_dce (void) { @@ -792,8 +800,7 @@ gate_fast_dce (void) } -/* Run a fast DCE pass and return true if any instructions were - deleted. */ +/* Run a fast DCE pass and return true if any instructions were deleted. */ bool run_fast_dce (void) @@ -820,4 +827,3 @@ struct tree_opt_pass pass_fast_rtl_dce = TODO_ggc_collect, /* todo_flags_finish */ 'w' /* letter */ }; - |