1 /* RTL dead code elimination.
2 Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
3 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
29 #include "hard-reg-set.h"
36 #include "tree-pass.h"
39 #include "emit-rtl.h" /* FIXME: Can go away once crtl is moved to rtl.h. */
42 /* -------------------------------------------------------------------------
43 Core mark/delete routines
44 ------------------------------------------------------------------------- */
46 /* True if we are invoked while the df engine is running; in this case,
47 we don't want to reenter it. */
48 static bool df_in_progress
= false;
50 /* True if we are allowed to alter the CFG in this pass. */
51 static bool can_alter_cfg
= false;
53 /* Instructions that have been marked but whose dependencies have not
54 yet been processed. */
55 static vec
<rtx
> worklist
;
57 /* Bitmap of instructions marked as needed indexed by INSN_UID. */
58 static sbitmap marked
;
60 /* Bitmap obstacks used for block processing by the fast algorithm. */
61 static bitmap_obstack dce_blocks_bitmap_obstack
;
62 static bitmap_obstack dce_tmp_bitmap_obstack
;
64 static bool find_call_stack_args (rtx
, bool, bool, bitmap
);
66 /* A subroutine for which BODY is part of the instruction being tested;
67 either the top-level pattern, or an element of a PARALLEL. The
68 instruction is known not to be a bare USE or CLOBBER. */
71 deletable_insn_p_1 (rtx body
)
73 switch (GET_CODE (body
))
77 /* The UNSPEC case was added here because the ia-64 claims that
78 USEs do not work after reload and generates UNSPECS rather
79 than USEs. Since dce is run after reload we need to avoid
80 deleting these even if they are dead. If it turns out that
81 USEs really do work after reload, the ia-64 should be
82 changed, and the UNSPEC case can be removed. */
87 return !volatile_refs_p (body
);
92 /* Return true if INSN is a normal instruction that can be deleted by
96 deletable_insn_p (rtx 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 (insn
, false, fast
, arg_stores
);
115 /* Don't delete jumps, notes and the like. */
116 if (!NONJUMP_INSN_P (insn
))
119 /* Don't delete insns that may throw if we cannot do so. */
120 if (!(cfun
->can_delete_dead_exceptions
&& can_alter_cfg
)
121 && !insn_nothrow_p (insn
))
124 /* If INSN sets a global_reg, leave it untouched. */
125 for (df_ref
*def_rec
= DF_INSN_DEFS (insn
); *def_rec
; def_rec
++)
126 if (HARD_REGISTER_NUM_P (DF_REF_REGNO (*def_rec
))
127 && global_regs
[DF_REF_REGNO (*def_rec
)])
130 body
= PATTERN (insn
);
131 switch (GET_CODE (body
))
140 /* A CLOBBER of a dead pseudo register serves no purpose.
141 That is not necessarily true for hard registers until
144 return REG_P (x
) && (!HARD_REGISTER_P (x
) || reload_completed
);
147 /* Because of the way that use-def chains are built, it is not
148 possible to tell if the clobber is dead because it can
149 never be the target of a use-def chain. */
153 for (i
= XVECLEN (body
, 0) - 1; i
>= 0; i
--)
154 if (!deletable_insn_p_1 (XVECEXP (body
, 0, i
)))
159 return deletable_insn_p_1 (body
);
164 /* Return true if INSN has been marked as needed. */
167 marked_insn_p (rtx insn
)
169 /* Artificial defs are always needed and they do not have an insn.
170 We should never see them here. */
172 return bitmap_bit_p (marked
, INSN_UID (insn
));
176 /* If INSN has not yet been marked as needed, mark it now, and add it to
180 mark_insn (rtx insn
, bool fast
)
182 if (!marked_insn_p (insn
))
185 worklist
.safe_push (insn
);
186 bitmap_set_bit (marked
, INSN_UID (insn
));
188 fprintf (dump_file
, " Adding insn %d to worklist\n", INSN_UID (insn
));
191 && !SIBLING_CALL_P (insn
)
192 && (RTL_CONST_OR_PURE_CALL_P (insn
)
193 && !RTL_LOOPING_CONST_OR_PURE_CALL_P (insn
)))
194 find_call_stack_args (insn
, true, fast
, NULL
);
199 /* A note_stores callback used by mark_nonreg_stores. DATA is the
200 instruction containing DEST. */
203 mark_nonreg_stores_1 (rtx dest
, const_rtx pattern
, void *data
)
205 if (GET_CODE (pattern
) != CLOBBER
&& !REG_P (dest
))
206 mark_insn ((rtx
) data
, true);
210 /* A note_stores callback used by mark_nonreg_stores. DATA is the
211 instruction containing DEST. */
214 mark_nonreg_stores_2 (rtx dest
, const_rtx pattern
, void *data
)
216 if (GET_CODE (pattern
) != CLOBBER
&& !REG_P (dest
))
217 mark_insn ((rtx
) data
, false);
221 /* Mark INSN if BODY stores to a non-register destination. */
224 mark_nonreg_stores (rtx body
, rtx insn
, bool fast
)
227 note_stores (body
, mark_nonreg_stores_1
, insn
);
229 note_stores (body
, mark_nonreg_stores_2
, insn
);
233 /* Return true if store to MEM, starting OFF bytes from stack pointer,
234 is a call argument store, and clear corresponding bits from SP_BYTES
238 check_argument_store (rtx mem
, HOST_WIDE_INT off
, HOST_WIDE_INT min_sp_off
,
239 HOST_WIDE_INT max_sp_off
, bitmap sp_bytes
)
242 for (byte
= off
; byte
< off
+ GET_MODE_SIZE (GET_MODE (mem
)); byte
++)
244 if (byte
< min_sp_off
245 || byte
>= max_sp_off
246 || !bitmap_clear_bit (sp_bytes
, byte
- min_sp_off
))
253 /* Try to find all stack stores of CALL_INSN arguments if
254 ACCUMULATE_OUTGOING_ARGS. If all stack stores have been found
255 and it is therefore safe to eliminate the call, return true,
256 otherwise return false. This function should be first called
257 with DO_MARK false, and only when the CALL_INSN is actually
258 going to be marked called again with DO_MARK true. */
261 find_call_stack_args (rtx call_insn
, bool do_mark
, bool fast
,
264 rtx p
, insn
, prev_insn
;
266 HOST_WIDE_INT min_sp_off
, max_sp_off
;
269 gcc_assert (CALL_P (call_insn
));
270 if (!ACCUMULATE_OUTGOING_ARGS
)
275 gcc_assert (arg_stores
);
276 bitmap_clear (arg_stores
);
279 min_sp_off
= INTTYPE_MAXIMUM (HOST_WIDE_INT
);
282 /* First determine the minimum and maximum offset from sp for
284 for (p
= CALL_INSN_FUNCTION_USAGE (call_insn
); p
; p
= XEXP (p
, 1))
285 if (GET_CODE (XEXP (p
, 0)) == USE
286 && MEM_P (XEXP (XEXP (p
, 0), 0)))
288 rtx mem
= XEXP (XEXP (p
, 0), 0), addr
;
289 HOST_WIDE_INT off
= 0, size
;
290 if (!MEM_SIZE_KNOWN_P (mem
))
292 size
= MEM_SIZE (mem
);
293 addr
= XEXP (mem
, 0);
294 if (GET_CODE (addr
) == PLUS
295 && REG_P (XEXP (addr
, 0))
296 && CONST_INT_P (XEXP (addr
, 1)))
298 off
= INTVAL (XEXP (addr
, 1));
299 addr
= XEXP (addr
, 0);
301 if (addr
!= stack_pointer_rtx
)
305 /* If not fast, use chains to see if addr wasn't set to
310 struct df_link
*defs
;
313 for (use_rec
= DF_INSN_USES (call_insn
); *use_rec
; use_rec
++)
314 if (rtx_equal_p (addr
, DF_REF_REG (*use_rec
)))
317 if (*use_rec
== NULL
)
320 for (defs
= DF_REF_CHAIN (*use_rec
); defs
; defs
= defs
->next
)
321 if (! DF_REF_IS_ARTIFICIAL (defs
->ref
))
327 set
= single_set (DF_REF_INSN (defs
->ref
));
331 if (GET_CODE (SET_SRC (set
)) != PLUS
332 || XEXP (SET_SRC (set
), 0) != stack_pointer_rtx
333 || !CONST_INT_P (XEXP (SET_SRC (set
), 1)))
336 off
+= INTVAL (XEXP (SET_SRC (set
), 1));
341 min_sp_off
= MIN (min_sp_off
, off
);
342 max_sp_off
= MAX (max_sp_off
, off
+ size
);
345 if (min_sp_off
>= max_sp_off
)
347 sp_bytes
= BITMAP_ALLOC (NULL
);
349 /* Set bits in SP_BYTES bitmap for bytes relative to sp + min_sp_off
350 which contain arguments. Checking has been done in the previous
352 for (p
= CALL_INSN_FUNCTION_USAGE (call_insn
); p
; p
= XEXP (p
, 1))
353 if (GET_CODE (XEXP (p
, 0)) == USE
354 && MEM_P (XEXP (XEXP (p
, 0), 0)))
356 rtx mem
= XEXP (XEXP (p
, 0), 0), addr
;
357 HOST_WIDE_INT off
= 0, byte
;
358 addr
= XEXP (mem
, 0);
359 if (GET_CODE (addr
) == PLUS
360 && REG_P (XEXP (addr
, 0))
361 && CONST_INT_P (XEXP (addr
, 1)))
363 off
= INTVAL (XEXP (addr
, 1));
364 addr
= XEXP (addr
, 0);
366 if (addr
!= stack_pointer_rtx
)
369 struct df_link
*defs
;
372 for (use_rec
= DF_INSN_USES (call_insn
); *use_rec
; use_rec
++)
373 if (rtx_equal_p (addr
, DF_REF_REG (*use_rec
)))
376 for (defs
= DF_REF_CHAIN (*use_rec
); defs
; defs
= defs
->next
)
377 if (! DF_REF_IS_ARTIFICIAL (defs
->ref
))
380 set
= single_set (DF_REF_INSN (defs
->ref
));
381 off
+= INTVAL (XEXP (SET_SRC (set
), 1));
383 for (byte
= off
; byte
< off
+ MEM_SIZE (mem
); byte
++)
385 if (!bitmap_set_bit (sp_bytes
, byte
- min_sp_off
))
390 /* Walk backwards, looking for argument stores. The search stops
391 when seeing another call, sp adjustment or memory store other than
394 for (insn
= PREV_INSN (call_insn
); insn
; insn
= prev_insn
)
399 if (insn
== BB_HEAD (BLOCK_FOR_INSN (call_insn
)))
400 prev_insn
= NULL_RTX
;
402 prev_insn
= PREV_INSN (insn
);
407 if (!NONDEBUG_INSN_P (insn
))
410 set
= single_set (insn
);
411 if (!set
|| SET_DEST (set
) == stack_pointer_rtx
)
414 if (!MEM_P (SET_DEST (set
)))
417 mem
= SET_DEST (set
);
418 addr
= XEXP (mem
, 0);
420 if (GET_CODE (addr
) == PLUS
421 && REG_P (XEXP (addr
, 0))
422 && CONST_INT_P (XEXP (addr
, 1)))
424 off
= INTVAL (XEXP (addr
, 1));
425 addr
= XEXP (addr
, 0);
427 if (addr
!= stack_pointer_rtx
)
434 struct df_link
*defs
;
437 for (use_rec
= DF_INSN_USES (insn
); *use_rec
; use_rec
++)
438 if (rtx_equal_p (addr
, DF_REF_REG (*use_rec
)))
441 if (*use_rec
== NULL
)
444 for (defs
= DF_REF_CHAIN (*use_rec
); defs
; defs
= defs
->next
)
445 if (! DF_REF_IS_ARTIFICIAL (defs
->ref
))
451 set
= single_set (DF_REF_INSN (defs
->ref
));
455 if (GET_CODE (SET_SRC (set
)) != PLUS
456 || XEXP (SET_SRC (set
), 0) != stack_pointer_rtx
457 || !CONST_INT_P (XEXP (SET_SRC (set
), 1)))
460 off
+= INTVAL (XEXP (SET_SRC (set
), 1));
466 if (GET_MODE_SIZE (GET_MODE (mem
)) == 0
467 || !check_argument_store (mem
, off
, min_sp_off
,
468 max_sp_off
, sp_bytes
))
471 if (!deletable_insn_p (insn
, fast
, NULL
))
475 mark_insn (insn
, fast
);
477 bitmap_set_bit (arg_stores
, INSN_UID (insn
));
479 if (bitmap_empty_p (sp_bytes
))
486 BITMAP_FREE (sp_bytes
);
487 if (!ret
&& arg_stores
)
488 bitmap_clear (arg_stores
);
494 /* Remove all REG_EQUAL and REG_EQUIV notes referring to the registers INSN
498 remove_reg_equal_equiv_notes_for_defs (rtx insn
)
502 for (def_rec
= DF_INSN_DEFS (insn
); *def_rec
; def_rec
++)
503 remove_reg_equal_equiv_notes_for_regno (DF_REF_REGNO (*def_rec
));
506 /* Scan all BBs for debug insns and reset those that reference values
507 defined in unmarked insns. */
510 reset_unmarked_insns_debug_uses (void)
515 FOR_EACH_BB_REVERSE (bb
)
516 FOR_BB_INSNS_REVERSE_SAFE (bb
, insn
, next
)
517 if (DEBUG_INSN_P (insn
))
521 for (use_rec
= DF_INSN_USES (insn
); *use_rec
; use_rec
++)
523 df_ref use
= *use_rec
;
524 struct df_link
*defs
;
525 for (defs
= DF_REF_CHAIN (use
); defs
; defs
= defs
->next
)
528 if (DF_REF_IS_ARTIFICIAL (defs
->ref
))
530 ref_insn
= DF_REF_INSN (defs
->ref
);
531 if (!marked_insn_p (ref_insn
))
536 /* ??? FIXME could we propagate the values assigned to
538 INSN_VAR_LOCATION_LOC (insn
) = gen_rtx_UNKNOWN_VAR_LOC ();
539 df_insn_rescan_debug_internal (insn
);
545 /* Delete every instruction that hasn't been marked. */
548 delete_unmarked_insns (void)
552 bool must_clean
= false;
554 FOR_EACH_BB_REVERSE (bb
)
555 FOR_BB_INSNS_REVERSE_SAFE (bb
, insn
, next
)
556 if (NONDEBUG_INSN_P (insn
))
558 /* Always delete no-op moves. */
559 if (noop_move_p (insn
))
562 /* Otherwise rely only on the DCE algorithm. */
563 else if (marked_insn_p (insn
))
566 /* Beware that reaching a dbg counter limit here can result
567 in miscompiled file. This occurs when a group of insns
568 must be deleted together, typically because the kept insn
569 depends on the output from the deleted insn. Deleting
570 this insns in reverse order (both at the bb level and
571 when looking at the blocks) minimizes this, but does not
572 eliminate it, since it is possible for the using insn to
573 be top of a block and the producer to be at the bottom of
574 the block. However, in most cases this will only result
575 in an uninitialized use of an insn that is dead anyway.
577 However, there is one rare case that will cause a
578 miscompile: deletion of non-looping pure and constant
579 calls on a machine where ACCUMULATE_OUTGOING_ARGS is true.
580 In this case it is possible to remove the call, but leave
581 the argument pushes to the stack. Because of the changes
582 to the stack pointer, this will almost always lead to a
588 fprintf (dump_file
, "DCE: Deleting insn %d\n", INSN_UID (insn
));
590 /* Before we delete the insn we have to remove the REG_EQUAL notes
591 for the destination regs in order to avoid dangling notes. */
592 remove_reg_equal_equiv_notes_for_defs (insn
);
594 /* If a pure or const call is deleted, this may make the cfg
595 have unreachable blocks. We rememeber this and call
596 delete_unreachable_blocks at the end. */
600 /* Now delete the insn. */
601 delete_insn_and_edges (insn
);
604 /* Deleted a pure or const call. */
606 delete_unreachable_blocks ();
610 /* Go through the instructions and mark those whose necessity is not
611 dependent on inter-instruction information. Make sure all other
612 instructions are not marked. */
615 prescan_insns_for_dce (bool fast
)
619 bitmap arg_stores
= NULL
;
622 fprintf (dump_file
, "Finding needed instructions:\n");
624 if (!df_in_progress
&& ACCUMULATE_OUTGOING_ARGS
)
625 arg_stores
= BITMAP_ALLOC (NULL
);
629 FOR_BB_INSNS_REVERSE_SAFE (bb
, insn
, prev
)
630 if (NONDEBUG_INSN_P (insn
))
632 /* Don't mark argument stores now. They will be marked
633 if needed when the associated CALL is marked. */
634 if (arg_stores
&& bitmap_bit_p (arg_stores
, INSN_UID (insn
)))
636 if (deletable_insn_p (insn
, fast
, arg_stores
))
637 mark_nonreg_stores (PATTERN (insn
), insn
, fast
);
639 mark_insn (insn
, fast
);
641 /* find_call_stack_args only looks at argument stores in the
644 bitmap_clear (arg_stores
);
648 BITMAP_FREE (arg_stores
);
651 fprintf (dump_file
, "Finished finding needed instructions:\n");
655 /* UD-based DSE routines. */
657 /* Mark instructions that define artificially-used registers, such as
658 the frame pointer and the stack pointer. */
661 mark_artificial_uses (void)
664 struct df_link
*defs
;
669 for (use_rec
= df_get_artificial_uses (bb
->index
);
671 for (defs
= DF_REF_CHAIN (*use_rec
); defs
; defs
= defs
->next
)
672 if (! DF_REF_IS_ARTIFICIAL (defs
->ref
))
673 mark_insn (DF_REF_INSN (defs
->ref
), false);
678 /* Mark every instruction that defines a register value that INSN uses. */
681 mark_reg_dependencies (rtx insn
)
683 struct df_link
*defs
;
686 if (DEBUG_INSN_P (insn
))
689 for (use_rec
= DF_INSN_USES (insn
); *use_rec
; use_rec
++)
691 df_ref use
= *use_rec
;
694 fprintf (dump_file
, "Processing use of ");
695 print_simple_rtl (dump_file
, DF_REF_REG (use
));
696 fprintf (dump_file
, " in insn %d:\n", INSN_UID (insn
));
698 for (defs
= DF_REF_CHAIN (use
); defs
; defs
= defs
->next
)
699 if (! DF_REF_IS_ARTIFICIAL (defs
->ref
))
700 mark_insn (DF_REF_INSN (defs
->ref
), false);
705 /* Initialize global variables for a new DCE pass. */
714 df_set_flags (DF_RD_PRUNE_DEAD_DEFS
);
715 df_chain_add_problem (DF_UD_CHAIN
);
725 bitmap_obstack_initialize (&dce_blocks_bitmap_obstack
);
726 bitmap_obstack_initialize (&dce_tmp_bitmap_obstack
);
727 can_alter_cfg
= false;
730 can_alter_cfg
= true;
732 marked
= sbitmap_alloc (get_max_uid () + 1);
733 bitmap_clear (marked
);
737 /* Free the data allocated by init_dce. */
742 sbitmap_free (marked
);
746 bitmap_obstack_release (&dce_blocks_bitmap_obstack
);
747 bitmap_obstack_release (&dce_tmp_bitmap_obstack
);
752 /* UD-chain based DCE. */
755 rest_of_handle_ud_dce (void)
761 prescan_insns_for_dce (false);
762 mark_artificial_uses ();
763 while (worklist
.length () > 0)
765 insn
= worklist
.pop ();
766 mark_reg_dependencies (insn
);
770 if (MAY_HAVE_DEBUG_INSNS
)
771 reset_unmarked_insns_debug_uses ();
773 /* Before any insns are deleted, we must remove the chains since
774 they are not bidirectional. */
775 df_remove_problem (df_chain
);
776 delete_unmarked_insns ();
786 return optimize
> 1 && flag_dce
790 struct rtl_opt_pass pass_ud_rtl_dce
=
795 OPTGROUP_NONE
, /* optinfo_flags */
796 gate_ud_dce
, /* gate */
797 rest_of_handle_ud_dce
, /* execute */
800 0, /* static_pass_number */
802 0, /* properties_required */
803 0, /* properties_provided */
804 0, /* properties_destroyed */
805 0, /* todo_flags_start */
806 TODO_df_finish
| TODO_verify_rtl_sharing
|
807 TODO_ggc_collect
/* todo_flags_finish */
812 /* -------------------------------------------------------------------------
814 ------------------------------------------------------------------------- */
816 /* Process basic block BB. Return true if the live_in set has
817 changed. REDO_OUT is true if the info at the bottom of the block
818 needs to be recalculated before starting. AU is the proper set of
819 artificial uses. Track global substitution of uses of dead pseudos
820 in debug insns using GLOBAL_DEBUG. */
823 word_dce_process_block (basic_block bb
, bool redo_out
,
824 struct dead_debug_global
*global_debug
)
826 bitmap local_live
= BITMAP_ALLOC (&dce_tmp_bitmap_obstack
);
829 struct dead_debug_local debug
;
833 /* Need to redo the live_out set of this block if when one of
834 the succs of this block has had a change in it live in
838 df_confluence_function_n con_fun_n
= df_word_lr
->problem
->con_fun_n
;
839 bitmap_clear (DF_WORD_LR_OUT (bb
));
840 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
846 fprintf (dump_file
, "processing block %d live out = ", bb
->index
);
847 df_print_word_regset (dump_file
, DF_WORD_LR_OUT (bb
));
850 bitmap_copy (local_live
, DF_WORD_LR_OUT (bb
));
851 dead_debug_local_init (&debug
, NULL
, global_debug
);
853 FOR_BB_INSNS_REVERSE (bb
, insn
)
854 if (DEBUG_INSN_P (insn
))
857 for (use_rec
= DF_INSN_USES (insn
); *use_rec
; use_rec
++)
858 if (DF_REF_REGNO (*use_rec
) >= FIRST_PSEUDO_REGISTER
859 && (GET_MODE_SIZE (GET_MODE (DF_REF_REAL_REG (*use_rec
)))
860 == 2 * UNITS_PER_WORD
)
861 && !bitmap_bit_p (local_live
, 2 * DF_REF_REGNO (*use_rec
))
862 && !bitmap_bit_p (local_live
, 2 * DF_REF_REGNO (*use_rec
) + 1))
863 dead_debug_add (&debug
, *use_rec
, DF_REF_REGNO (*use_rec
));
865 else if (INSN_P (insn
))
869 /* No matter if the instruction is needed or not, we remove
870 any regno in the defs from the live set. */
871 any_changed
= df_word_lr_simulate_defs (insn
, local_live
);
873 mark_insn (insn
, true);
875 /* On the other hand, we do not allow the dead uses to set
876 anything in local_live. */
877 if (marked_insn_p (insn
))
878 df_word_lr_simulate_uses (insn
, local_live
);
880 /* Insert debug temps for dead REGs used in subsequent debug
881 insns. We may have to emit a debug temp even if the insn
882 was marked, in case the debug use was after the point of
884 if (debug
.used
&& !bitmap_empty_p (debug
.used
))
888 for (def_rec
= DF_INSN_DEFS (insn
); *def_rec
; def_rec
++)
889 dead_debug_insert_temp (&debug
, DF_REF_REGNO (*def_rec
), insn
,
891 && !control_flow_insn_p (insn
)
892 ? DEBUG_TEMP_AFTER_WITH_REG_FORCE
893 : DEBUG_TEMP_BEFORE_WITH_VALUE
);
898 fprintf (dump_file
, "finished processing insn %d live out = ",
900 df_print_word_regset (dump_file
, local_live
);
904 block_changed
= !bitmap_equal_p (local_live
, DF_WORD_LR_IN (bb
));
906 bitmap_copy (DF_WORD_LR_IN (bb
), local_live
);
908 dead_debug_local_finish (&debug
, NULL
);
909 BITMAP_FREE (local_live
);
910 return block_changed
;
914 /* Process basic block BB. Return true if the live_in set has
915 changed. REDO_OUT is true if the info at the bottom of the block
916 needs to be recalculated before starting. AU is the proper set of
917 artificial uses. Track global substitution of uses of dead pseudos
918 in debug insns using GLOBAL_DEBUG. */
921 dce_process_block (basic_block bb
, bool redo_out
, bitmap au
,
922 struct dead_debug_global
*global_debug
)
924 bitmap local_live
= BITMAP_ALLOC (&dce_tmp_bitmap_obstack
);
928 struct dead_debug_local debug
;
932 /* Need to redo the live_out set of this block if when one of
933 the succs of this block has had a change in it live in
937 df_confluence_function_n con_fun_n
= df_lr
->problem
->con_fun_n
;
938 bitmap_clear (DF_LR_OUT (bb
));
939 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
945 fprintf (dump_file
, "processing block %d lr out = ", bb
->index
);
946 df_print_regset (dump_file
, DF_LR_OUT (bb
));
949 bitmap_copy (local_live
, DF_LR_OUT (bb
));
951 df_simulate_initialize_backwards (bb
, local_live
);
952 dead_debug_local_init (&debug
, NULL
, global_debug
);
954 FOR_BB_INSNS_REVERSE (bb
, insn
)
955 if (DEBUG_INSN_P (insn
))
958 for (use_rec
= DF_INSN_USES (insn
); *use_rec
; use_rec
++)
959 if (!bitmap_bit_p (local_live
, DF_REF_REGNO (*use_rec
))
960 && !bitmap_bit_p (au
, DF_REF_REGNO (*use_rec
)))
961 dead_debug_add (&debug
, *use_rec
, DF_REF_REGNO (*use_rec
));
963 else if (INSN_P (insn
))
965 bool needed
= marked_insn_p (insn
);
967 /* The insn is needed if there is someone who uses the output. */
969 for (def_rec
= DF_INSN_DEFS (insn
); *def_rec
; def_rec
++)
970 if (bitmap_bit_p (local_live
, DF_REF_REGNO (*def_rec
))
971 || bitmap_bit_p (au
, DF_REF_REGNO (*def_rec
)))
974 mark_insn (insn
, true);
978 /* No matter if the instruction is needed or not, we remove
979 any regno in the defs from the live set. */
980 df_simulate_defs (insn
, local_live
);
982 /* On the other hand, we do not allow the dead uses to set
983 anything in local_live. */
985 df_simulate_uses (insn
, local_live
);
987 /* Insert debug temps for dead REGs used in subsequent debug
988 insns. We may have to emit a debug temp even if the insn
989 was marked, in case the debug use was after the point of
991 if (debug
.used
&& !bitmap_empty_p (debug
.used
))
992 for (def_rec
= DF_INSN_DEFS (insn
); *def_rec
; def_rec
++)
993 dead_debug_insert_temp (&debug
, DF_REF_REGNO (*def_rec
), insn
,
994 needed
&& !control_flow_insn_p (insn
)
995 ? DEBUG_TEMP_AFTER_WITH_REG_FORCE
996 : DEBUG_TEMP_BEFORE_WITH_VALUE
);
999 dead_debug_local_finish (&debug
, NULL
);
1000 df_simulate_finalize_backwards (bb
, local_live
);
1002 block_changed
= !bitmap_equal_p (local_live
, DF_LR_IN (bb
));
1004 bitmap_copy (DF_LR_IN (bb
), local_live
);
1006 BITMAP_FREE (local_live
);
1007 return block_changed
;
1011 /* Perform fast DCE once initialization is done. If WORD_LEVEL is
1012 true, use the word level dce, otherwise do it at the pseudo
1016 fast_dce (bool word_level
)
1018 int *postorder
= df_get_postorder (DF_BACKWARD
);
1019 int n_blocks
= df_get_n_blocks (DF_BACKWARD
);
1020 /* The set of blocks that have been seen on this iteration. */
1021 bitmap processed
= BITMAP_ALLOC (&dce_blocks_bitmap_obstack
);
1022 /* The set of blocks that need to have the out vectors reset because
1023 the in of one of their successors has changed. */
1024 bitmap redo_out
= BITMAP_ALLOC (&dce_blocks_bitmap_obstack
);
1025 bitmap all_blocks
= BITMAP_ALLOC (&dce_blocks_bitmap_obstack
);
1026 bool global_changed
= true;
1028 /* These regs are considered always live so if they end up dying
1029 because of some def, we need to bring the back again. Calling
1030 df_simulate_fixup_sets has the disadvantage of calling
1031 bb_has_eh_pred once per insn, so we cache the information
1033 bitmap au
= &df
->regular_block_artificial_uses
;
1034 bitmap au_eh
= &df
->eh_block_artificial_uses
;
1036 struct dead_debug_global global_debug
;
1038 prescan_insns_for_dce (true);
1040 for (i
= 0; i
< n_blocks
; i
++)
1041 bitmap_set_bit (all_blocks
, postorder
[i
]);
1043 dead_debug_global_init (&global_debug
, NULL
);
1045 while (global_changed
)
1047 global_changed
= false;
1049 for (i
= 0; i
< n_blocks
; i
++)
1051 int index
= postorder
[i
];
1052 basic_block bb
= BASIC_BLOCK (index
);
1055 if (index
< NUM_FIXED_BLOCKS
)
1057 bitmap_set_bit (processed
, index
);
1063 = word_dce_process_block (bb
, bitmap_bit_p (redo_out
, index
),
1067 = dce_process_block (bb
, bitmap_bit_p (redo_out
, index
),
1068 bb_has_eh_pred (bb
) ? au_eh
: au
,
1070 bitmap_set_bit (processed
, index
);
1076 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
1077 if (bitmap_bit_p (processed
, e
->src
->index
))
1078 /* Be tricky about when we need to iterate the
1079 analysis. We only have redo the analysis if the
1080 bitmaps change at the top of a block that is the
1082 global_changed
= true;
1084 bitmap_set_bit (redo_out
, e
->src
->index
);
1090 /* Turn off the RUN_DCE flag to prevent recursive calls to
1092 int old_flag
= df_clear_flags (DF_LR_RUN_DCE
);
1094 /* So something was deleted that requires a redo. Do it on
1096 delete_unmarked_insns ();
1097 bitmap_clear (marked
);
1098 bitmap_clear (processed
);
1099 bitmap_clear (redo_out
);
1101 /* We do not need to rescan any instructions. We only need
1102 to redo the dataflow equations for the blocks that had a
1103 change at the top of the block. Then we need to redo the
1106 df_analyze_problem (df_word_lr
, all_blocks
, postorder
, n_blocks
);
1108 df_analyze_problem (df_lr
, all_blocks
, postorder
, n_blocks
);
1110 if (old_flag
& DF_LR_RUN_DCE
)
1111 df_set_flags (DF_LR_RUN_DCE
);
1113 prescan_insns_for_dce (true);
1117 dead_debug_global_finish (&global_debug
, NULL
);
1119 delete_unmarked_insns ();
1121 BITMAP_FREE (processed
);
1122 BITMAP_FREE (redo_out
);
1123 BITMAP_FREE (all_blocks
);
1127 /* Fast register level DCE. */
1130 rest_of_handle_fast_dce (void)
1139 /* Fast byte level DCE. */
1149 timevar_push (TV_DCE
);
1150 old_flags
= df_clear_flags (DF_DEFER_INSN_RESCAN
+ DF_NO_INSN_RESCAN
);
1151 df_word_lr_add_problem ();
1155 df_set_flags (old_flags
);
1156 timevar_pop (TV_DCE
);
1160 /* This is an internal call that is used by the df live register
1161 problem to run fast dce as a side effect of creating the live
1162 information. The stack is organized so that the lr problem is run,
1163 this pass is run, which updates the live info and the df scanning
1164 info, and then returns to allow the rest of the problems to be run.
1166 This can be called by elsewhere but it will not update the bit
1167 vectors for any other problems than LR. */
1170 run_fast_df_dce (void)
1174 /* If dce is able to delete something, it has to happen
1175 immediately. Otherwise there will be problems handling the
1178 df_clear_flags (DF_DEFER_INSN_RESCAN
+ DF_NO_INSN_RESCAN
);
1180 df_in_progress
= true;
1181 rest_of_handle_fast_dce ();
1182 df_in_progress
= false;
1184 df_set_flags (old_flags
);
1189 /* Run a fast DCE pass. */
1195 rest_of_handle_fast_dce ();
1200 gate_fast_dce (void)
1202 return optimize
> 0 && flag_dce
1203 && dbg_cnt (dce_fast
);
1206 struct rtl_opt_pass pass_fast_rtl_dce
=
1210 "rtl_dce", /* name */
1211 OPTGROUP_NONE
, /* optinfo_flags */
1212 gate_fast_dce
, /* gate */
1213 rest_of_handle_fast_dce
, /* execute */
1216 0, /* static_pass_number */
1218 0, /* properties_required */
1219 0, /* properties_provided */
1220 0, /* properties_destroyed */
1221 0, /* todo_flags_start */
1222 TODO_df_finish
| TODO_verify_rtl_sharing
|
1223 TODO_ggc_collect
/* todo_flags_finish */