1 /* RTL dead code elimination.
2 Copyright (C) 2005-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
28 #include "hard-reg-set.h"
35 #include "tree-pass.h"
38 #include "emit-rtl.h" /* FIXME: Can go away once crtl is moved to rtl.h. */
41 /* -------------------------------------------------------------------------
42 Core mark/delete routines
43 ------------------------------------------------------------------------- */
45 /* True if we are invoked while the df engine is running; in this case,
46 we don't want to reenter it. */
47 static bool df_in_progress
= false;
49 /* True if we are allowed to alter the CFG in this pass. */
50 static bool can_alter_cfg
= false;
52 /* Instructions that have been marked but whose dependencies have not
53 yet been processed. */
54 static vec
<rtx_insn
*> worklist
;
56 /* Bitmap of instructions marked as needed indexed by INSN_UID. */
57 static sbitmap marked
;
59 /* Bitmap obstacks used for block processing by the fast algorithm. */
60 static bitmap_obstack dce_blocks_bitmap_obstack
;
61 static bitmap_obstack dce_tmp_bitmap_obstack
;
63 static bool find_call_stack_args (rtx_call_insn
*, bool, bool, bitmap
);
65 /* A subroutine for which BODY is part of the instruction being tested;
66 either the top-level pattern, or an element of a PARALLEL. The
67 instruction is known not to be a bare USE or CLOBBER. */
70 deletable_insn_p_1 (rtx body
)
72 switch (GET_CODE (body
))
76 /* The UNSPEC case was added here because the ia-64 claims that
77 USEs do not work after reload and generates UNSPECS rather
78 than USEs. Since dce is run after reload we need to avoid
79 deleting these even if they are dead. If it turns out that
80 USEs really do work after reload, the ia-64 should be
81 changed, and the UNSPEC case can be removed. */
86 return !volatile_refs_p (body
);
91 /* Return true if INSN is a normal instruction that can be deleted by
95 deletable_insn_p (rtx_insn
*insn
, bool fast
, bitmap arg_stores
)
102 /* We cannot delete calls inside of the recursive dce because
103 this may cause basic blocks to be deleted and this messes up
104 the rest of the stack of optimization passes. */
106 /* We cannot delete pure or const sibling calls because it is
107 hard to see the result. */
108 && (!SIBLING_CALL_P (insn
))
109 /* We can delete dead const or pure calls as long as they do not
111 && (RTL_CONST_OR_PURE_CALL_P (insn
)
112 && !RTL_LOOPING_CONST_OR_PURE_CALL_P (insn
)))
113 return find_call_stack_args (as_a
<rtx_call_insn
*> (insn
), false,
116 /* Don't delete jumps, notes and the like. */
117 if (!NONJUMP_INSN_P (insn
))
120 /* Don't delete insns that may throw if we cannot do so. */
121 if (!(cfun
->can_delete_dead_exceptions
&& can_alter_cfg
)
122 && !insn_nothrow_p (insn
))
125 /* If INSN sets a global_reg, leave it untouched. */
126 FOR_EACH_INSN_DEF (def
, insn
)
127 if (HARD_REGISTER_NUM_P (DF_REF_REGNO (def
))
128 && global_regs
[DF_REF_REGNO (def
)])
131 body
= PATTERN (insn
);
132 switch (GET_CODE (body
))
141 /* A CLOBBER of a dead pseudo register serves no purpose.
142 That is not necessarily true for hard registers until
145 return REG_P (x
) && (!HARD_REGISTER_P (x
) || reload_completed
);
148 /* Because of the way that use-def chains are built, it is not
149 possible to tell if the clobber is dead because it can
150 never be the target of a use-def chain. */
154 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
155 if (!deletable_insn_p_1 (XVECEXP (body
, 0, i
)))
160 return deletable_insn_p_1 (body
);
165 /* Return true if INSN has been marked as needed. */
168 marked_insn_p (rtx_insn
*insn
)
170 /* Artificial defs are always needed and they do not have an insn.
171 We should never see them here. */
173 return bitmap_bit_p (marked
, INSN_UID (insn
));
177 /* If INSN has not yet been marked as needed, mark it now, and add it to
181 mark_insn (rtx_insn
*insn
, bool fast
)
183 if (!marked_insn_p (insn
))
186 worklist
.safe_push (insn
);
187 bitmap_set_bit (marked
, INSN_UID (insn
));
189 fprintf (dump_file
, " Adding insn %d to worklist\n", INSN_UID (insn
));
192 && !SIBLING_CALL_P (insn
)
193 && (RTL_CONST_OR_PURE_CALL_P (insn
)
194 && !RTL_LOOPING_CONST_OR_PURE_CALL_P (insn
)))
195 find_call_stack_args (as_a
<rtx_call_insn
*> (insn
), true, fast
, NULL
);
200 /* A note_stores callback used by mark_nonreg_stores. DATA is the
201 instruction containing DEST. */
204 mark_nonreg_stores_1 (rtx dest
, const_rtx pattern
, void *data
)
206 if (GET_CODE (pattern
) != CLOBBER
&& !REG_P (dest
))
207 mark_insn ((rtx_insn
*) data
, true);
211 /* A note_stores callback used by mark_nonreg_stores. DATA is the
212 instruction containing DEST. */
215 mark_nonreg_stores_2 (rtx dest
, const_rtx pattern
, void *data
)
217 if (GET_CODE (pattern
) != CLOBBER
&& !REG_P (dest
))
218 mark_insn ((rtx_insn
*) data
, false);
222 /* Mark INSN if BODY stores to a non-register destination. */
225 mark_nonreg_stores (rtx body
, rtx_insn
*insn
, bool fast
)
228 note_stores (body
, mark_nonreg_stores_1
, insn
);
230 note_stores (body
, mark_nonreg_stores_2
, insn
);
234 /* Return true if store to MEM, starting OFF bytes from stack pointer,
235 is a call argument store, and clear corresponding bits from SP_BYTES
239 check_argument_store (rtx mem
, HOST_WIDE_INT off
, HOST_WIDE_INT min_sp_off
,
240 HOST_WIDE_INT max_sp_off
, bitmap sp_bytes
)
243 for (byte
= off
; byte
< off
+ GET_MODE_SIZE (GET_MODE (mem
)); byte
++)
245 if (byte
< min_sp_off
246 || byte
>= max_sp_off
247 || !bitmap_clear_bit (sp_bytes
, byte
- min_sp_off
))
254 /* Try to find all stack stores of CALL_INSN arguments if
255 ACCUMULATE_OUTGOING_ARGS. If all stack stores have been found
256 and it is therefore safe to eliminate the call, return true,
257 otherwise return false. This function should be first called
258 with DO_MARK false, and only when the CALL_INSN is actually
259 going to be marked called again with DO_MARK true. */
262 find_call_stack_args (rtx_call_insn
*call_insn
, bool do_mark
, bool fast
,
266 rtx_insn
*insn
, *prev_insn
;
268 HOST_WIDE_INT min_sp_off
, max_sp_off
;
271 gcc_assert (CALL_P (call_insn
));
272 if (!ACCUMULATE_OUTGOING_ARGS
)
277 gcc_assert (arg_stores
);
278 bitmap_clear (arg_stores
);
281 min_sp_off
= INTTYPE_MAXIMUM (HOST_WIDE_INT
);
284 /* First determine the minimum and maximum offset from sp for
286 for (p
= CALL_INSN_FUNCTION_USAGE (call_insn
); p
; p
= XEXP (p
, 1))
287 if (GET_CODE (XEXP (p
, 0)) == USE
288 && MEM_P (XEXP (XEXP (p
, 0), 0)))
290 rtx mem
= XEXP (XEXP (p
, 0), 0), addr
;
291 HOST_WIDE_INT off
= 0, size
;
292 if (!MEM_SIZE_KNOWN_P (mem
))
294 size
= MEM_SIZE (mem
);
295 addr
= XEXP (mem
, 0);
296 if (GET_CODE (addr
) == PLUS
297 && REG_P (XEXP (addr
, 0))
298 && CONST_INT_P (XEXP (addr
, 1)))
300 off
= INTVAL (XEXP (addr
, 1));
301 addr
= XEXP (addr
, 0);
303 if (addr
!= stack_pointer_rtx
)
307 /* If not fast, use chains to see if addr wasn't set to
312 struct df_link
*defs
;
315 FOR_EACH_INSN_USE (use
, call_insn
)
316 if (rtx_equal_p (addr
, DF_REF_REG (use
)))
322 for (defs
= DF_REF_CHAIN (use
); defs
; defs
= defs
->next
)
323 if (! DF_REF_IS_ARTIFICIAL (defs
->ref
))
329 set
= single_set (DF_REF_INSN (defs
->ref
));
333 if (GET_CODE (SET_SRC (set
)) != PLUS
334 || XEXP (SET_SRC (set
), 0) != stack_pointer_rtx
335 || !CONST_INT_P (XEXP (SET_SRC (set
), 1)))
338 off
+= INTVAL (XEXP (SET_SRC (set
), 1));
343 min_sp_off
= MIN (min_sp_off
, off
);
344 max_sp_off
= MAX (max_sp_off
, off
+ size
);
347 if (min_sp_off
>= max_sp_off
)
349 sp_bytes
= BITMAP_ALLOC (NULL
);
351 /* Set bits in SP_BYTES bitmap for bytes relative to sp + min_sp_off
352 which contain arguments. Checking has been done in the previous
354 for (p
= CALL_INSN_FUNCTION_USAGE (call_insn
); p
; p
= XEXP (p
, 1))
355 if (GET_CODE (XEXP (p
, 0)) == USE
356 && MEM_P (XEXP (XEXP (p
, 0), 0)))
358 rtx mem
= XEXP (XEXP (p
, 0), 0), addr
;
359 HOST_WIDE_INT off
= 0, byte
;
360 addr
= XEXP (mem
, 0);
361 if (GET_CODE (addr
) == PLUS
362 && REG_P (XEXP (addr
, 0))
363 && CONST_INT_P (XEXP (addr
, 1)))
365 off
= INTVAL (XEXP (addr
, 1));
366 addr
= XEXP (addr
, 0);
368 if (addr
!= stack_pointer_rtx
)
371 struct df_link
*defs
;
374 FOR_EACH_INSN_USE (use
, call_insn
)
375 if (rtx_equal_p (addr
, DF_REF_REG (use
)))
378 for (defs
= DF_REF_CHAIN (use
); defs
; defs
= defs
->next
)
379 if (! DF_REF_IS_ARTIFICIAL (defs
->ref
))
382 set
= single_set (DF_REF_INSN (defs
->ref
));
383 off
+= INTVAL (XEXP (SET_SRC (set
), 1));
385 for (byte
= off
; byte
< off
+ MEM_SIZE (mem
); byte
++)
387 if (!bitmap_set_bit (sp_bytes
, byte
- min_sp_off
))
392 /* Walk backwards, looking for argument stores. The search stops
393 when seeing another call, sp adjustment or memory store other than
396 for (insn
= PREV_INSN (call_insn
); insn
; insn
= prev_insn
)
401 if (insn
== BB_HEAD (BLOCK_FOR_INSN (call_insn
)))
404 prev_insn
= PREV_INSN (insn
);
409 if (!NONDEBUG_INSN_P (insn
))
412 set
= single_set (insn
);
413 if (!set
|| SET_DEST (set
) == stack_pointer_rtx
)
416 if (!MEM_P (SET_DEST (set
)))
419 mem
= SET_DEST (set
);
420 addr
= XEXP (mem
, 0);
422 if (GET_CODE (addr
) == PLUS
423 && REG_P (XEXP (addr
, 0))
424 && CONST_INT_P (XEXP (addr
, 1)))
426 off
= INTVAL (XEXP (addr
, 1));
427 addr
= XEXP (addr
, 0);
429 if (addr
!= stack_pointer_rtx
)
436 struct df_link
*defs
;
439 FOR_EACH_INSN_USE (use
, insn
)
440 if (rtx_equal_p (addr
, DF_REF_REG (use
)))
446 for (defs
= DF_REF_CHAIN (use
); defs
; defs
= defs
->next
)
447 if (! DF_REF_IS_ARTIFICIAL (defs
->ref
))
453 set
= single_set (DF_REF_INSN (defs
->ref
));
457 if (GET_CODE (SET_SRC (set
)) != PLUS
458 || XEXP (SET_SRC (set
), 0) != stack_pointer_rtx
459 || !CONST_INT_P (XEXP (SET_SRC (set
), 1)))
462 off
+= INTVAL (XEXP (SET_SRC (set
), 1));
468 if (GET_MODE_SIZE (GET_MODE (mem
)) == 0
469 || !check_argument_store (mem
, off
, min_sp_off
,
470 max_sp_off
, sp_bytes
))
473 if (!deletable_insn_p (insn
, fast
, NULL
))
477 mark_insn (insn
, fast
);
479 bitmap_set_bit (arg_stores
, INSN_UID (insn
));
481 if (bitmap_empty_p (sp_bytes
))
488 BITMAP_FREE (sp_bytes
);
489 if (!ret
&& arg_stores
)
490 bitmap_clear (arg_stores
);
496 /* Remove all REG_EQUAL and REG_EQUIV notes referring to the registers INSN
500 remove_reg_equal_equiv_notes_for_defs (rtx_insn
*insn
)
504 FOR_EACH_INSN_DEF (def
, insn
)
505 remove_reg_equal_equiv_notes_for_regno (DF_REF_REGNO (def
));
508 /* Scan all BBs for debug insns and reset those that reference values
509 defined in unmarked insns. */
512 reset_unmarked_insns_debug_uses (void)
515 rtx_insn
*insn
, *next
;
517 FOR_EACH_BB_REVERSE_FN (bb
, cfun
)
518 FOR_BB_INSNS_REVERSE_SAFE (bb
, insn
, next
)
519 if (DEBUG_INSN_P (insn
))
523 FOR_EACH_INSN_USE (use
, insn
)
525 struct df_link
*defs
;
526 for (defs
= DF_REF_CHAIN (use
); defs
; defs
= defs
->next
)
529 if (DF_REF_IS_ARTIFICIAL (defs
->ref
))
531 ref_insn
= DF_REF_INSN (defs
->ref
);
532 if (!marked_insn_p (ref_insn
))
537 /* ??? FIXME could we propagate the values assigned to
539 INSN_VAR_LOCATION_LOC (insn
) = gen_rtx_UNKNOWN_VAR_LOC ();
540 df_insn_rescan_debug_internal (insn
);
546 /* Delete every instruction that hasn't been marked. */
549 delete_unmarked_insns (void)
552 rtx_insn
*insn
, *next
;
553 bool must_clean
= false;
555 FOR_EACH_BB_REVERSE_FN (bb
, cfun
)
556 FOR_BB_INSNS_REVERSE_SAFE (bb
, insn
, next
)
557 if (NONDEBUG_INSN_P (insn
))
559 /* Always delete no-op moves. */
560 if (noop_move_p (insn
))
563 /* Otherwise rely only on the DCE algorithm. */
564 else if (marked_insn_p (insn
))
567 /* Beware that reaching a dbg counter limit here can result
568 in miscompiled file. This occurs when a group of insns
569 must be deleted together, typically because the kept insn
570 depends on the output from the deleted insn. Deleting
571 this insns in reverse order (both at the bb level and
572 when looking at the blocks) minimizes this, but does not
573 eliminate it, since it is possible for the using insn to
574 be top of a block and the producer to be at the bottom of
575 the block. However, in most cases this will only result
576 in an uninitialized use of an insn that is dead anyway.
578 However, there is one rare case that will cause a
579 miscompile: deletion of non-looping pure and constant
580 calls on a machine where ACCUMULATE_OUTGOING_ARGS is true.
581 In this case it is possible to remove the call, but leave
582 the argument pushes to the stack. Because of the changes
583 to the stack pointer, this will almost always lead to a
589 fprintf (dump_file
, "DCE: Deleting insn %d\n", INSN_UID (insn
));
591 /* Before we delete the insn we have to remove the REG_EQUAL notes
592 for the destination regs in order to avoid dangling notes. */
593 remove_reg_equal_equiv_notes_for_defs (insn
);
595 /* If a pure or const call is deleted, this may make the cfg
596 have unreachable blocks. We rememeber this and call
597 delete_unreachable_blocks at the end. */
601 /* Now delete the insn. */
602 delete_insn_and_edges (insn
);
605 /* Deleted a pure or const call. */
607 delete_unreachable_blocks ();
611 /* Go through the instructions and mark those whose necessity is not
612 dependent on inter-instruction information. Make sure all other
613 instructions are not marked. */
616 prescan_insns_for_dce (bool fast
)
619 rtx_insn
*insn
, *prev
;
620 bitmap arg_stores
= NULL
;
623 fprintf (dump_file
, "Finding needed instructions:\n");
625 if (!df_in_progress
&& ACCUMULATE_OUTGOING_ARGS
)
626 arg_stores
= BITMAP_ALLOC (NULL
);
628 FOR_EACH_BB_FN (bb
, cfun
)
630 FOR_BB_INSNS_REVERSE_SAFE (bb
, insn
, prev
)
631 if (NONDEBUG_INSN_P (insn
))
633 /* Don't mark argument stores now. They will be marked
634 if needed when the associated CALL is marked. */
635 if (arg_stores
&& bitmap_bit_p (arg_stores
, INSN_UID (insn
)))
637 if (deletable_insn_p (insn
, fast
, arg_stores
))
638 mark_nonreg_stores (PATTERN (insn
), insn
, fast
);
640 mark_insn (insn
, fast
);
642 /* find_call_stack_args only looks at argument stores in the
645 bitmap_clear (arg_stores
);
649 BITMAP_FREE (arg_stores
);
652 fprintf (dump_file
, "Finished finding needed instructions:\n");
656 /* UD-based DSE routines. */
658 /* Mark instructions that define artificially-used registers, such as
659 the frame pointer and the stack pointer. */
662 mark_artificial_uses (void)
665 struct df_link
*defs
;
668 FOR_ALL_BB_FN (bb
, cfun
)
669 FOR_EACH_ARTIFICIAL_USE (use
, bb
->index
)
670 for (defs
= DF_REF_CHAIN (use
); defs
; defs
= defs
->next
)
671 if (!DF_REF_IS_ARTIFICIAL (defs
->ref
))
672 mark_insn (DF_REF_INSN (defs
->ref
), false);
676 /* Mark every instruction that defines a register value that INSN uses. */
679 mark_reg_dependencies (rtx_insn
*insn
)
681 struct df_link
*defs
;
684 if (DEBUG_INSN_P (insn
))
687 FOR_EACH_INSN_USE (use
, insn
)
691 fprintf (dump_file
, "Processing use of ");
692 print_simple_rtl (dump_file
, DF_REF_REG (use
));
693 fprintf (dump_file
, " in insn %d:\n", INSN_UID (insn
));
695 for (defs
= DF_REF_CHAIN (use
); defs
; defs
= defs
->next
)
696 if (! DF_REF_IS_ARTIFICIAL (defs
->ref
))
697 mark_insn (DF_REF_INSN (defs
->ref
), false);
702 /* Initialize global variables for a new DCE pass. */
711 df_set_flags (DF_RD_PRUNE_DEAD_DEFS
);
712 df_chain_add_problem (DF_UD_CHAIN
);
722 bitmap_obstack_initialize (&dce_blocks_bitmap_obstack
);
723 bitmap_obstack_initialize (&dce_tmp_bitmap_obstack
);
724 can_alter_cfg
= false;
727 can_alter_cfg
= true;
729 marked
= sbitmap_alloc (get_max_uid () + 1);
730 bitmap_clear (marked
);
734 /* Free the data allocated by init_dce. */
739 sbitmap_free (marked
);
743 bitmap_obstack_release (&dce_blocks_bitmap_obstack
);
744 bitmap_obstack_release (&dce_tmp_bitmap_obstack
);
749 /* UD-chain based DCE. */
752 rest_of_handle_ud_dce (void)
758 prescan_insns_for_dce (false);
759 mark_artificial_uses ();
760 while (worklist
.length () > 0)
762 insn
= worklist
.pop ();
763 mark_reg_dependencies (insn
);
767 if (MAY_HAVE_DEBUG_INSNS
)
768 reset_unmarked_insns_debug_uses ();
770 /* Before any insns are deleted, we must remove the chains since
771 they are not bidirectional. */
772 df_remove_problem (df_chain
);
773 delete_unmarked_insns ();
782 const pass_data pass_data_ud_rtl_dce
=
786 OPTGROUP_NONE
, /* optinfo_flags */
788 0, /* properties_required */
789 0, /* properties_provided */
790 0, /* properties_destroyed */
791 0, /* todo_flags_start */
792 TODO_df_finish
, /* todo_flags_finish */
795 class pass_ud_rtl_dce
: public rtl_opt_pass
798 pass_ud_rtl_dce (gcc::context
*ctxt
)
799 : rtl_opt_pass (pass_data_ud_rtl_dce
, ctxt
)
802 /* opt_pass methods: */
803 virtual bool gate (function
*)
805 return optimize
> 1 && flag_dce
&& dbg_cnt (dce_ud
);
808 virtual unsigned int execute (function
*)
810 return rest_of_handle_ud_dce ();
813 }; // class pass_ud_rtl_dce
818 make_pass_ud_rtl_dce (gcc::context
*ctxt
)
820 return new pass_ud_rtl_dce (ctxt
);
824 /* -------------------------------------------------------------------------
826 ------------------------------------------------------------------------- */
828 /* Process basic block BB. Return true if the live_in set has
829 changed. REDO_OUT is true if the info at the bottom of the block
830 needs to be recalculated before starting. AU is the proper set of
831 artificial uses. Track global substitution of uses of dead pseudos
832 in debug insns using GLOBAL_DEBUG. */
835 word_dce_process_block (basic_block bb
, bool redo_out
,
836 struct dead_debug_global
*global_debug
)
838 bitmap local_live
= BITMAP_ALLOC (&dce_tmp_bitmap_obstack
);
841 struct dead_debug_local debug
;
845 /* Need to redo the live_out set of this block if when one of
846 the succs of this block has had a change in it live in
850 df_confluence_function_n con_fun_n
= df_word_lr
->problem
->con_fun_n
;
851 bitmap_clear (DF_WORD_LR_OUT (bb
));
852 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
858 fprintf (dump_file
, "processing block %d live out = ", bb
->index
);
859 df_print_word_regset (dump_file
, DF_WORD_LR_OUT (bb
));
862 bitmap_copy (local_live
, DF_WORD_LR_OUT (bb
));
863 dead_debug_local_init (&debug
, NULL
, global_debug
);
865 FOR_BB_INSNS_REVERSE (bb
, insn
)
866 if (DEBUG_INSN_P (insn
))
869 FOR_EACH_INSN_USE (use
, insn
)
870 if (DF_REF_REGNO (use
) >= FIRST_PSEUDO_REGISTER
871 && (GET_MODE_SIZE (GET_MODE (DF_REF_REAL_REG (use
)))
872 == 2 * UNITS_PER_WORD
)
873 && !bitmap_bit_p (local_live
, 2 * DF_REF_REGNO (use
))
874 && !bitmap_bit_p (local_live
, 2 * DF_REF_REGNO (use
) + 1))
875 dead_debug_add (&debug
, use
, DF_REF_REGNO (use
));
877 else if (INSN_P (insn
))
881 /* No matter if the instruction is needed or not, we remove
882 any regno in the defs from the live set. */
883 any_changed
= df_word_lr_simulate_defs (insn
, local_live
);
885 mark_insn (insn
, true);
887 /* On the other hand, we do not allow the dead uses to set
888 anything in local_live. */
889 if (marked_insn_p (insn
))
890 df_word_lr_simulate_uses (insn
, local_live
);
892 /* Insert debug temps for dead REGs used in subsequent debug
893 insns. We may have to emit a debug temp even if the insn
894 was marked, in case the debug use was after the point of
896 if (debug
.used
&& !bitmap_empty_p (debug
.used
))
900 FOR_EACH_INSN_DEF (def
, insn
)
901 dead_debug_insert_temp (&debug
, DF_REF_REGNO (def
), insn
,
903 && !control_flow_insn_p (insn
)
904 ? DEBUG_TEMP_AFTER_WITH_REG_FORCE
905 : DEBUG_TEMP_BEFORE_WITH_VALUE
);
910 fprintf (dump_file
, "finished processing insn %d live out = ",
912 df_print_word_regset (dump_file
, local_live
);
916 block_changed
= !bitmap_equal_p (local_live
, DF_WORD_LR_IN (bb
));
918 bitmap_copy (DF_WORD_LR_IN (bb
), local_live
);
920 dead_debug_local_finish (&debug
, NULL
);
921 BITMAP_FREE (local_live
);
922 return block_changed
;
926 /* Process basic block BB. Return true if the live_in set has
927 changed. REDO_OUT is true if the info at the bottom of the block
928 needs to be recalculated before starting. AU is the proper set of
929 artificial uses. Track global substitution of uses of dead pseudos
930 in debug insns using GLOBAL_DEBUG. */
933 dce_process_block (basic_block bb
, bool redo_out
, bitmap au
,
934 struct dead_debug_global
*global_debug
)
936 bitmap local_live
= BITMAP_ALLOC (&dce_tmp_bitmap_obstack
);
940 struct dead_debug_local debug
;
944 /* Need to redo the live_out set of this block if when one of
945 the succs of this block has had a change in it live in
949 df_confluence_function_n con_fun_n
= df_lr
->problem
->con_fun_n
;
950 bitmap_clear (DF_LR_OUT (bb
));
951 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
957 fprintf (dump_file
, "processing block %d lr out = ", bb
->index
);
958 df_print_regset (dump_file
, DF_LR_OUT (bb
));
961 bitmap_copy (local_live
, DF_LR_OUT (bb
));
963 df_simulate_initialize_backwards (bb
, local_live
);
964 dead_debug_local_init (&debug
, NULL
, global_debug
);
966 FOR_BB_INSNS_REVERSE (bb
, insn
)
967 if (DEBUG_INSN_P (insn
))
970 FOR_EACH_INSN_USE (use
, insn
)
971 if (!bitmap_bit_p (local_live
, DF_REF_REGNO (use
))
972 && !bitmap_bit_p (au
, DF_REF_REGNO (use
)))
973 dead_debug_add (&debug
, use
, DF_REF_REGNO (use
));
975 else if (INSN_P (insn
))
977 bool needed
= marked_insn_p (insn
);
979 /* The insn is needed if there is someone who uses the output. */
981 FOR_EACH_INSN_DEF (def
, insn
)
982 if (bitmap_bit_p (local_live
, DF_REF_REGNO (def
))
983 || bitmap_bit_p (au
, DF_REF_REGNO (def
)))
986 mark_insn (insn
, true);
990 /* No matter if the instruction is needed or not, we remove
991 any regno in the defs from the live set. */
992 df_simulate_defs (insn
, local_live
);
994 /* On the other hand, we do not allow the dead uses to set
995 anything in local_live. */
997 df_simulate_uses (insn
, local_live
);
999 /* Insert debug temps for dead REGs used in subsequent debug
1000 insns. We may have to emit a debug temp even if the insn
1001 was marked, in case the debug use was after the point of
1003 if (debug
.used
&& !bitmap_empty_p (debug
.used
))
1004 FOR_EACH_INSN_DEF (def
, insn
)
1005 dead_debug_insert_temp (&debug
, DF_REF_REGNO (def
), insn
,
1006 needed
&& !control_flow_insn_p (insn
)
1007 ? DEBUG_TEMP_AFTER_WITH_REG_FORCE
1008 : DEBUG_TEMP_BEFORE_WITH_VALUE
);
1011 dead_debug_local_finish (&debug
, NULL
);
1012 df_simulate_finalize_backwards (bb
, local_live
);
1014 block_changed
= !bitmap_equal_p (local_live
, DF_LR_IN (bb
));
1016 bitmap_copy (DF_LR_IN (bb
), local_live
);
1018 BITMAP_FREE (local_live
);
1019 return block_changed
;
1023 /* Perform fast DCE once initialization is done. If WORD_LEVEL is
1024 true, use the word level dce, otherwise do it at the pseudo
1028 fast_dce (bool word_level
)
1030 int *postorder
= df_get_postorder (DF_BACKWARD
);
1031 int n_blocks
= df_get_n_blocks (DF_BACKWARD
);
1032 /* The set of blocks that have been seen on this iteration. */
1033 bitmap processed
= BITMAP_ALLOC (&dce_blocks_bitmap_obstack
);
1034 /* The set of blocks that need to have the out vectors reset because
1035 the in of one of their successors has changed. */
1036 bitmap redo_out
= BITMAP_ALLOC (&dce_blocks_bitmap_obstack
);
1037 bitmap all_blocks
= BITMAP_ALLOC (&dce_blocks_bitmap_obstack
);
1038 bool global_changed
= true;
1040 /* These regs are considered always live so if they end up dying
1041 because of some def, we need to bring the back again. Calling
1042 df_simulate_fixup_sets has the disadvantage of calling
1043 bb_has_eh_pred once per insn, so we cache the information
1045 bitmap au
= &df
->regular_block_artificial_uses
;
1046 bitmap au_eh
= &df
->eh_block_artificial_uses
;
1048 struct dead_debug_global global_debug
;
1050 prescan_insns_for_dce (true);
1052 for (i
= 0; i
< n_blocks
; i
++)
1053 bitmap_set_bit (all_blocks
, postorder
[i
]);
1055 dead_debug_global_init (&global_debug
, NULL
);
1057 while (global_changed
)
1059 global_changed
= false;
1061 for (i
= 0; i
< n_blocks
; i
++)
1063 int index
= postorder
[i
];
1064 basic_block bb
= BASIC_BLOCK_FOR_FN (cfun
, index
);
1067 if (index
< NUM_FIXED_BLOCKS
)
1069 bitmap_set_bit (processed
, index
);
1075 = word_dce_process_block (bb
, bitmap_bit_p (redo_out
, index
),
1079 = dce_process_block (bb
, bitmap_bit_p (redo_out
, index
),
1080 bb_has_eh_pred (bb
) ? au_eh
: au
,
1082 bitmap_set_bit (processed
, index
);
1088 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
1089 if (bitmap_bit_p (processed
, e
->src
->index
))
1090 /* Be tricky about when we need to iterate the
1091 analysis. We only have redo the analysis if the
1092 bitmaps change at the top of a block that is the
1094 global_changed
= true;
1096 bitmap_set_bit (redo_out
, e
->src
->index
);
1102 /* Turn off the RUN_DCE flag to prevent recursive calls to
1104 int old_flag
= df_clear_flags (DF_LR_RUN_DCE
);
1106 /* So something was deleted that requires a redo. Do it on
1108 delete_unmarked_insns ();
1109 bitmap_clear (marked
);
1110 bitmap_clear (processed
);
1111 bitmap_clear (redo_out
);
1113 /* We do not need to rescan any instructions. We only need
1114 to redo the dataflow equations for the blocks that had a
1115 change at the top of the block. Then we need to redo the
1118 df_analyze_problem (df_word_lr
, all_blocks
, postorder
, n_blocks
);
1120 df_analyze_problem (df_lr
, all_blocks
, postorder
, n_blocks
);
1122 if (old_flag
& DF_LR_RUN_DCE
)
1123 df_set_flags (DF_LR_RUN_DCE
);
1125 prescan_insns_for_dce (true);
1129 dead_debug_global_finish (&global_debug
, NULL
);
1131 delete_unmarked_insns ();
1133 BITMAP_FREE (processed
);
1134 BITMAP_FREE (redo_out
);
1135 BITMAP_FREE (all_blocks
);
1139 /* Fast register level DCE. */
1142 rest_of_handle_fast_dce (void)
1151 /* Fast byte level DCE. */
1161 timevar_push (TV_DCE
);
1162 old_flags
= df_clear_flags (DF_DEFER_INSN_RESCAN
+ DF_NO_INSN_RESCAN
);
1163 df_word_lr_add_problem ();
1167 df_set_flags (old_flags
);
1168 timevar_pop (TV_DCE
);
1172 /* This is an internal call that is used by the df live register
1173 problem to run fast dce as a side effect of creating the live
1174 information. The stack is organized so that the lr problem is run,
1175 this pass is run, which updates the live info and the df scanning
1176 info, and then returns to allow the rest of the problems to be run.
1178 This can be called by elsewhere but it will not update the bit
1179 vectors for any other problems than LR. */
1182 run_fast_df_dce (void)
1186 /* If dce is able to delete something, it has to happen
1187 immediately. Otherwise there will be problems handling the
1190 df_clear_flags (DF_DEFER_INSN_RESCAN
+ DF_NO_INSN_RESCAN
);
1192 df_in_progress
= true;
1193 rest_of_handle_fast_dce ();
1194 df_in_progress
= false;
1196 df_set_flags (old_flags
);
1201 /* Run a fast DCE pass. */
1207 rest_of_handle_fast_dce ();
1213 const pass_data pass_data_fast_rtl_dce
=
1215 RTL_PASS
, /* type */
1216 "rtl_dce", /* name */
1217 OPTGROUP_NONE
, /* optinfo_flags */
1219 0, /* properties_required */
1220 0, /* properties_provided */
1221 0, /* properties_destroyed */
1222 0, /* todo_flags_start */
1223 TODO_df_finish
, /* todo_flags_finish */
1226 class pass_fast_rtl_dce
: public rtl_opt_pass
1229 pass_fast_rtl_dce (gcc::context
*ctxt
)
1230 : rtl_opt_pass (pass_data_fast_rtl_dce
, ctxt
)
1233 /* opt_pass methods: */
1234 virtual bool gate (function
*)
1236 return optimize
> 0 && flag_dce
&& dbg_cnt (dce_fast
);
1239 virtual unsigned int execute (function
*)
1241 return rest_of_handle_fast_dce ();
1244 }; // class pass_fast_rtl_dce
1249 make_pass_fast_rtl_dce (gcc::context
*ctxt
)
1251 return new pass_fast_rtl_dce (ctxt
);