1/* RTL dead code elimination.
2   Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3.  If not see
18<http://www.gnu.org/licenses/>.  */
19
20#include "config.h"
21#include "system.h"
22#include "coretypes.h"
23#include "hashtab.h"
24#include "tm.h"
25#include "rtl.h"
26#include "tree.h"
27#include "regs.h"
28#include "hard-reg-set.h"
29#include "flags.h"
30#include "except.h"
31#include "df.h"
32#include "cselib.h"
33#include "dce.h"
34#include "timevar.h"
35#include "tree-pass.h"
36#include "dbgcnt.h"
37#include "tm_p.h"
38
39
40/* -------------------------------------------------------------------------
41   Core mark/delete routines
42   ------------------------------------------------------------------------- */
43
44/* True if we are invoked while the df engine is running; in this case,
45   we don't want to reenter it.  */
46static bool df_in_progress = false;
47
48/* Instructions that have been marked but whose dependencies have not
49   yet been processed.  */
50static VEC(rtx,heap) *worklist;
51
52/* Bitmap of instructions marked as needed indexed by INSN_UID.  */
53static sbitmap marked;
54
55/* Bitmap obstacks used for block processing by the fast algorithm.  */
56static bitmap_obstack dce_blocks_bitmap_obstack;
57static bitmap_obstack dce_tmp_bitmap_obstack;
58
59static bool find_call_stack_args (rtx, bool, bool, bitmap);
60
61/* A subroutine for which BODY is part of the instruction being tested;
62   either the top-level pattern, or an element of a PARALLEL.  The
63   instruction is known not to be a bare USE or CLOBBER.  */
64
65static bool
66deletable_insn_p_1 (rtx body)
67{
68  switch (GET_CODE (body))
69    {
70    case PREFETCH:
71    case TRAP_IF:
72      /* The UNSPEC case was added here because the ia-64 claims that
73	 USEs do not work after reload and generates UNSPECS rather
74	 than USEs.  Since dce is run after reload we need to avoid
75	 deleting these even if they are dead.  If it turns out that
76	 USEs really do work after reload, the ia-64 should be
77	 changed, and the UNSPEC case can be removed.  */
78    case UNSPEC:
79      return false;
80
81    default:
82      return !volatile_refs_p (body);
83    }
84}
85
86
87/* Return true if INSN is a normal instruction that can be deleted by
88   the DCE pass.  */
89
90static bool
91deletable_insn_p (rtx insn, bool fast, bitmap arg_stores)
92{
93  rtx body, x;
94  int i;
95
96  if (CALL_P (insn)
97      /* We cannot delete calls inside of the recursive dce because
98	 this may cause basic blocks to be deleted and this messes up
99	 the rest of the stack of optimization passes.  */
100      && (!df_in_progress)
101      /* We cannot delete pure or const sibling calls because it is
102	 hard to see the result.  */
103      && (!SIBLING_CALL_P (insn))
104      /* We can delete dead const or pure calls as long as they do not
105         infinite loop.  */
106      && (RTL_CONST_OR_PURE_CALL_P (insn)
107	  && !RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)))
108    return find_call_stack_args (insn, false, fast, arg_stores);
109
110  /* Don't delete jumps, notes and the like.  */
111  if (!NONJUMP_INSN_P (insn))
112    return false;
113
114  /* Don't delete insns that can throw.  */
115  if (!insn_nothrow_p (insn))
116    return false;
117
118  body = PATTERN (insn);
119  switch (GET_CODE (body))
120    {
121    case USE:
122    case VAR_LOCATION:
123      return false;
124
125    case CLOBBER:
126      if (fast)
127	{
128	  /* A CLOBBER of a dead pseudo register serves no purpose.
129	     That is not necessarily true for hard registers until
130	     after reload.  */
131	  x = XEXP (body, 0);
132	  return REG_P (x) && (!HARD_REGISTER_P (x) || reload_completed);
133	}
134      else
135	/* Because of the way that use-def chains are built, it is not
136	   possible to tell if the clobber is dead because it can
137	   never be the target of a use-def chain.  */
138	return false;
139
140    case PARALLEL:
141      for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
142	if (!deletable_insn_p_1 (XVECEXP (body, 0, i)))
143	  return false;
144      return true;
145
146    default:
147      return deletable_insn_p_1 (body);
148    }
149}
150
151
152/* Return true if INSN has been marked as needed.  */
153
154static inline int
155marked_insn_p (rtx insn)
156{
157  /* Artificial defs are always needed and they do not have an insn.
158     We should never see them here.  */
159  gcc_assert (insn);
160  return TEST_BIT (marked, INSN_UID (insn));
161}
162
163
164/* If INSN has not yet been marked as needed, mark it now, and add it to
165   the worklist.  */
166
167static void
168mark_insn (rtx insn, bool fast)
169{
170  if (!marked_insn_p (insn))
171    {
172      if (!fast)
173	VEC_safe_push (rtx, heap, worklist, insn);
174      SET_BIT (marked, INSN_UID (insn));
175      if (dump_file)
176	fprintf (dump_file, "  Adding insn %d to worklist\n", INSN_UID (insn));
177      if (CALL_P (insn)
178	  && !df_in_progress
179	  && !SIBLING_CALL_P (insn)
180	  && (RTL_CONST_OR_PURE_CALL_P (insn)
181	      && !RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)))
182	find_call_stack_args (insn, true, fast, NULL);
183    }
184}
185
186
187/* A note_stores callback used by mark_nonreg_stores.  DATA is the
188   instruction containing DEST.  */
189
190static void
191mark_nonreg_stores_1 (rtx dest, const_rtx pattern, void *data)
192{
193  if (GET_CODE (pattern) != CLOBBER && !REG_P (dest))
194    mark_insn ((rtx) data, true);
195}
196
197
198/* A note_stores callback used by mark_nonreg_stores.  DATA is the
199   instruction containing DEST.  */
200
201static void
202mark_nonreg_stores_2 (rtx dest, const_rtx pattern, void *data)
203{
204  if (GET_CODE (pattern) != CLOBBER && !REG_P (dest))
205    mark_insn ((rtx) data, false);
206}
207
208
209/* Mark INSN if BODY stores to a non-register destination.  */
210
211static void
212mark_nonreg_stores (rtx body, rtx insn, bool fast)
213{
214  if (fast)
215    note_stores (body, mark_nonreg_stores_1, insn);
216  else
217    note_stores (body, mark_nonreg_stores_2, insn);
218}
219
220
221/* Try to find all stack stores of CALL_INSN arguments if
222   ACCUMULATE_OUTGOING_ARGS.  If all stack stores have been found
223   and it is therefore safe to eliminate the call, return true,
224   otherwise return false.  This function should be first called
225   with DO_MARK false, and only when the CALL_INSN is actually
226   going to be marked called again with DO_MARK true.  */
227
228static bool
229find_call_stack_args (rtx call_insn, bool do_mark, bool fast,
230		      bitmap arg_stores)
231{
232  rtx p, insn, prev_insn;
233  bool ret;
234  HOST_WIDE_INT min_sp_off, max_sp_off;
235  bitmap sp_bytes;
236
237  gcc_assert (CALL_P (call_insn));
238  if (!ACCUMULATE_OUTGOING_ARGS)
239    return true;
240
241  if (!do_mark)
242    {
243      gcc_assert (arg_stores);
244      bitmap_clear (arg_stores);
245    }
246
247  min_sp_off = INTTYPE_MAXIMUM (HOST_WIDE_INT);
248  max_sp_off = 0;
249
250  /* First determine the minimum and maximum offset from sp for
251     stored arguments.  */
252  for (p = CALL_INSN_FUNCTION_USAGE (call_insn); p; p = XEXP (p, 1))
253    if (GET_CODE (XEXP (p, 0)) == USE
254	&& MEM_P (XEXP (XEXP (p, 0), 0)))
255      {
256	rtx mem = XEXP (XEXP (p, 0), 0), addr, size;
257	HOST_WIDE_INT off = 0;
258	size = MEM_SIZE (mem);
259	if (size == NULL_RTX)
260	  return false;
261	addr = XEXP (mem, 0);
262	if (GET_CODE (addr) == PLUS
263	    && REG_P (XEXP (addr, 0))
264	    && CONST_INT_P (XEXP (addr, 1)))
265	  {
266	    off = INTVAL (XEXP (addr, 1));
267	    addr = XEXP (addr, 0);
268	  }
269	if (addr != stack_pointer_rtx)
270	  {
271	    if (!REG_P (addr))
272	      return false;
273	    /* If not fast, use chains to see if addr wasn't set to
274	       sp + offset.  */
275	    if (!fast)
276	      {
277		df_ref *use_rec;
278		struct df_link *defs;
279		rtx set;
280
281		for (use_rec = DF_INSN_USES (call_insn); *use_rec; use_rec++)
282		  if (rtx_equal_p (addr, DF_REF_REG (*use_rec)))
283		    break;
284
285		if (*use_rec == NULL)
286		  return false;
287
288		for (defs = DF_REF_CHAIN (*use_rec); defs; defs = defs->next)
289		  if (! DF_REF_IS_ARTIFICIAL (defs->ref))
290		    break;
291
292		if (defs == NULL)
293		  return false;
294
295		set = single_set (DF_REF_INSN (defs->ref));
296		if (!set)
297		  return false;
298
299		if (GET_CODE (SET_SRC (set)) != PLUS
300		    || XEXP (SET_SRC (set), 0) != stack_pointer_rtx
301		    || !CONST_INT_P (XEXP (SET_SRC (set), 1)))
302		  return false;
303
304		off += INTVAL (XEXP (SET_SRC (set), 1));
305	      }
306	    else
307	      return false;
308	  }
309	min_sp_off = MIN (min_sp_off, off);
310	max_sp_off = MAX (max_sp_off, off + INTVAL (size));
311      }
312
313  if (min_sp_off >= max_sp_off)
314    return true;
315  sp_bytes = BITMAP_ALLOC (NULL);
316
317  /* Set bits in SP_BYTES bitmap for bytes relative to sp + min_sp_off
318     which contain arguments.  Checking has been done in the previous
319     loop.  */
320  for (p = CALL_INSN_FUNCTION_USAGE (call_insn); p; p = XEXP (p, 1))
321    if (GET_CODE (XEXP (p, 0)) == USE
322	&& MEM_P (XEXP (XEXP (p, 0), 0)))
323      {
324	rtx mem = XEXP (XEXP (p, 0), 0), addr;
325	HOST_WIDE_INT off = 0, byte;
326	addr = XEXP (mem, 0);
327	if (GET_CODE (addr) == PLUS
328	    && REG_P (XEXP (addr, 0))
329	    && CONST_INT_P (XEXP (addr, 1)))
330	  {
331	    off = INTVAL (XEXP (addr, 1));
332	    addr = XEXP (addr, 0);
333	  }
334	if (addr != stack_pointer_rtx)
335	  {
336	    df_ref *use_rec;
337	    struct df_link *defs;
338	    rtx set;
339
340	    for (use_rec = DF_INSN_USES (call_insn); *use_rec; use_rec++)
341	      if (rtx_equal_p (addr, DF_REF_REG (*use_rec)))
342		break;
343
344	    for (defs = DF_REF_CHAIN (*use_rec); defs; defs = defs->next)
345	      if (! DF_REF_IS_ARTIFICIAL (defs->ref))
346		break;
347
348	    set = single_set (DF_REF_INSN (defs->ref));
349	    off += INTVAL (XEXP (SET_SRC (set), 1));
350	  }
351	for (byte = off; byte < off + INTVAL (MEM_SIZE (mem)); byte++)
352	  {
353	    if (!bitmap_set_bit (sp_bytes, byte - min_sp_off))
354	      gcc_unreachable ();
355	  }
356      }
357
358  /* Walk backwards, looking for argument stores.  The search stops
359     when seeing another call, sp adjustment or memory store other than
360     argument store.  */
361  ret = false;
362  for (insn = PREV_INSN (call_insn); insn; insn = prev_insn)
363    {
364      rtx set, mem, addr;
365      HOST_WIDE_INT off, byte;
366
367      if (insn == BB_HEAD (BLOCK_FOR_INSN (call_insn)))
368	prev_insn = NULL_RTX;
369      else
370	prev_insn = PREV_INSN (insn);
371
372      if (CALL_P (insn))
373	break;
374
375      if (!INSN_P (insn))
376	continue;
377
378      set = single_set (insn);
379      if (!set || SET_DEST (set) == stack_pointer_rtx)
380	break;
381
382      if (!MEM_P (SET_DEST (set)))
383	continue;
384
385      mem = SET_DEST (set);
386      addr = XEXP (mem, 0);
387      off = 0;
388      if (GET_CODE (addr) == PLUS
389	  && REG_P (XEXP (addr, 0))
390	  && CONST_INT_P (XEXP (addr, 1)))
391	{
392	  off = INTVAL (XEXP (addr, 1));
393	  addr = XEXP (addr, 0);
394	}
395      if (addr != stack_pointer_rtx)
396	{
397	  if (!REG_P (addr))
398	    break;
399	  if (!fast)
400	    {
401	      df_ref *use_rec;
402	      struct df_link *defs;
403	      rtx set;
404
405	      for (use_rec = DF_INSN_USES (insn); *use_rec; use_rec++)
406		if (rtx_equal_p (addr, DF_REF_REG (*use_rec)))
407		  break;
408
409	      if (*use_rec == NULL)
410		break;
411
412	      for (defs = DF_REF_CHAIN (*use_rec); defs; defs = defs->next)
413		if (! DF_REF_IS_ARTIFICIAL (defs->ref))
414		  break;
415
416	      if (defs == NULL)
417		break;
418
419	      set = single_set (DF_REF_INSN (defs->ref));
420	      if (!set)
421		break;
422
423	      if (GET_CODE (SET_SRC (set)) != PLUS
424		  || XEXP (SET_SRC (set), 0) != stack_pointer_rtx
425		  || !CONST_INT_P (XEXP (SET_SRC (set), 1)))
426		break;
427
428	      off += INTVAL (XEXP (SET_SRC (set), 1));
429	    }
430	  else
431	    break;
432	}
433
434      if (GET_MODE_SIZE (GET_MODE (mem)) == 0)
435	break;
436
437      for (byte = off; byte < off + GET_MODE_SIZE (GET_MODE (mem)); byte++)
438	{
439	  if (byte < min_sp_off
440	      || byte >= max_sp_off
441	      || !bitmap_clear_bit (sp_bytes, byte - min_sp_off))
442	    break;
443	}
444
445      if (!deletable_insn_p (insn, fast, NULL))
446	break;
447
448      if (do_mark)
449	mark_insn (insn, fast);
450      else
451	bitmap_set_bit (arg_stores, INSN_UID (insn));
452
453      if (bitmap_empty_p (sp_bytes))
454	{
455	  ret = true;
456	  break;
457	}
458    }
459
460  BITMAP_FREE (sp_bytes);
461  if (!ret && arg_stores)
462    bitmap_clear (arg_stores);
463
464  return ret;
465}
466
467
468/* Remove all REG_EQUAL and REG_EQUIV notes referring to the registers INSN
469   writes to.  */
470
471static void
472remove_reg_equal_equiv_notes_for_defs (rtx insn)
473{
474  df_ref *def_rec;
475
476  for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
477    remove_reg_equal_equiv_notes_for_regno (DF_REF_REGNO (*def_rec));
478}
479
480
481/* Delete every instruction that hasn't been marked.  */
482
483static void
484delete_unmarked_insns (void)
485{
486  basic_block bb;
487  rtx insn, next;
488  bool must_clean = false;
489
490  FOR_EACH_BB_REVERSE (bb)
491    FOR_BB_INSNS_REVERSE_SAFE (bb, insn, next)
492      if (INSN_P (insn))
493	{
494	  /* Always delete no-op moves.  */
495	  if (noop_move_p (insn))
496	    ;
497
498	  /* Otherwise rely only on the DCE algorithm.  */
499	  else if (marked_insn_p (insn))
500	    continue;
501
502	  /* Beware that reaching a dbg counter limit here can result
503	     in miscompiled file.  This occurs when a group of insns
504	     must be deleted together, typically because the kept insn
505	     depends on the output from the deleted insn.  Deleting
506	     this insns in reverse order (both at the bb level and
507	     when looking at the blocks) minimizes this, but does not
508	     eliminate it, since it is possible for the using insn to
509	     be top of a block and the producer to be at the bottom of
510	     the block.  However, in most cases this will only result
511	     in an uninitialized use of an insn that is dead anyway.
512
513	     However, there is one rare case that will cause a
514	     miscompile: deletion of non-looping pure and constant
515	     calls on a machine where ACCUMULATE_OUTGOING_ARGS is true.
516	     In this case it is possible to remove the call, but leave
517	     the argument pushes to the stack.  Because of the changes
518	     to the stack pointer, this will almost always lead to a
519	     miscompile.  */
520	  if (!dbg_cnt (dce))
521	    continue;
522
523	  if (dump_file)
524	    fprintf (dump_file, "DCE: Deleting insn %d\n", INSN_UID (insn));
525
526	  /* Before we delete the insn we have to remove the REG_EQUAL notes
527	     for the destination regs in order to avoid dangling notes.  */
528	  remove_reg_equal_equiv_notes_for_defs (insn);
529
530	  /* If a pure or const call is deleted, this may make the cfg
531	     have unreachable blocks.  We rememeber this and call
532	     delete_unreachable_blocks at the end.  */
533	  if (CALL_P (insn))
534	    must_clean = true;
535
536	  /* Now delete the insn.  */
537	  delete_insn_and_edges (insn);
538	}
539
540  /* Deleted a pure or const call.  */
541  if (must_clean)
542    delete_unreachable_blocks ();
543}
544
545
546/* Go through the instructions and mark those whose necessity is not
547   dependent on inter-instruction information.  Make sure all other
548   instructions are not marked.  */
549
550static void
551prescan_insns_for_dce (bool fast)
552{
553  basic_block bb;
554  rtx insn, prev;
555  bitmap arg_stores = NULL;
556
557  if (dump_file)
558    fprintf (dump_file, "Finding needed instructions:\n");
559
560  if (!df_in_progress && ACCUMULATE_OUTGOING_ARGS)
561    arg_stores = BITMAP_ALLOC (NULL);
562
563  FOR_EACH_BB (bb)
564    {
565      FOR_BB_INSNS_REVERSE_SAFE (bb, insn, prev)
566	if (INSN_P (insn))
567	  {
568	    /* Don't mark argument stores now.  They will be marked
569	       if needed when the associated CALL is marked.  */
570	    if (arg_stores && bitmap_bit_p (arg_stores, INSN_UID (insn)))
571	      continue;
572	    if (deletable_insn_p (insn, fast, arg_stores))
573	      mark_nonreg_stores (PATTERN (insn), insn, fast);
574	    else
575	      mark_insn (insn, fast);
576	  }
577      /* find_call_stack_args only looks at argument stores in the
578	 same bb.  */
579      if (arg_stores)
580	bitmap_clear (arg_stores);
581    }
582
583  if (arg_stores)
584    BITMAP_FREE (arg_stores);
585
586  if (dump_file)
587    fprintf (dump_file, "Finished finding needed instructions:\n");
588}
589
590
591/* UD-based DSE routines. */
592
593/* Mark instructions that define artificially-used registers, such as
594   the frame pointer and the stack pointer.  */
595
596static void
597mark_artificial_uses (void)
598{
599  basic_block bb;
600  struct df_link *defs;
601  df_ref *use_rec;
602
603  FOR_ALL_BB (bb)
604    {
605      for (use_rec = df_get_artificial_uses (bb->index);
606	   *use_rec; use_rec++)
607	for (defs = DF_REF_CHAIN (*use_rec); defs; defs = defs->next)
608	  if (! DF_REF_IS_ARTIFICIAL (defs->ref))
609	    mark_insn (DF_REF_INSN (defs->ref), false);
610    }
611}
612
613
614/* Mark every instruction that defines a register value that INSN uses.  */
615
616static void
617mark_reg_dependencies (rtx insn)
618{
619  struct df_link *defs;
620  df_ref *use_rec;
621
622  if (DEBUG_INSN_P (insn))
623    return;
624
625  for (use_rec = DF_INSN_USES (insn); *use_rec; use_rec++)
626    {
627      df_ref use = *use_rec;
628      if (dump_file)
629	{
630	  fprintf (dump_file, "Processing use of ");
631	  print_simple_rtl (dump_file, DF_REF_REG (use));
632	  fprintf (dump_file, " in insn %d:\n", INSN_UID (insn));
633	}
634      for (defs = DF_REF_CHAIN (use); defs; defs = defs->next)
635	if (! DF_REF_IS_ARTIFICIAL (defs->ref))
636	  mark_insn (DF_REF_INSN (defs->ref), false);
637    }
638}
639
640
641/* Initialize global variables for a new DCE pass.  */
642
643static void
644init_dce (bool fast)
645{
646  if (!df_in_progress)
647    {
648      if (!fast)
649	df_chain_add_problem (DF_UD_CHAIN);
650      df_analyze ();
651    }
652
653  if (dump_file)
654    df_dump (dump_file);
655
656  if (fast)
657    {
658      bitmap_obstack_initialize (&dce_blocks_bitmap_obstack);
659      bitmap_obstack_initialize (&dce_tmp_bitmap_obstack);
660    }
661
662  marked = sbitmap_alloc (get_max_uid () + 1);
663  sbitmap_zero (marked);
664}
665
666
667/* Free the data allocated by init_dce.  */
668
669static void
670fini_dce (bool fast)
671{
672  sbitmap_free (marked);
673
674  if (fast)
675    {
676      bitmap_obstack_release (&dce_blocks_bitmap_obstack);
677      bitmap_obstack_release (&dce_tmp_bitmap_obstack);
678    }
679}
680
681
682/* UD-chain based DCE.  */
683
684static unsigned int
685rest_of_handle_ud_dce (void)
686{
687  rtx insn;
688
689  init_dce (false);
690
691  prescan_insns_for_dce (false);
692  mark_artificial_uses ();
693  while (VEC_length (rtx, worklist) > 0)
694    {
695      insn = VEC_pop (rtx, worklist);
696      mark_reg_dependencies (insn);
697    }
698  VEC_free (rtx, heap, worklist);
699
700  /* Before any insns are deleted, we must remove the chains since
701     they are not bidirectional.  */
702  df_remove_problem (df_chain);
703  delete_unmarked_insns ();
704
705  fini_dce (false);
706  return 0;
707}
708
709
710static bool
711gate_ud_dce (void)
712{
713  return optimize > 1 && flag_dce
714    && dbg_cnt (dce_ud);
715}
716
717struct rtl_opt_pass pass_ud_rtl_dce =
718{
719 {
720  RTL_PASS,
721  "ud dce",                             /* name */
722  gate_ud_dce,                          /* gate */
723  rest_of_handle_ud_dce,                /* execute */
724  NULL,                                 /* sub */
725  NULL,                                 /* next */
726  0,                                    /* static_pass_number */
727  TV_DCE,                               /* tv_id */
728  0,                                    /* properties_required */
729  0,                                    /* properties_provided */
730  0,                                    /* properties_destroyed */
731  0,                                    /* todo_flags_start */
732  TODO_dump_func |
733  TODO_df_finish | TODO_verify_rtl_sharing |
734  TODO_ggc_collect                     /* todo_flags_finish */
735 }
736};
737
738
739/* -------------------------------------------------------------------------
740   Fast DCE functions
741   ------------------------------------------------------------------------- */
742
743/* Process basic block BB.  Return true if the live_in set has
744   changed. REDO_OUT is true if the info at the bottom of the block
745   needs to be recalculated before starting.  AU is the proper set of
746   artificial uses. */
747
748static bool
749byte_dce_process_block (basic_block bb, bool redo_out, bitmap au)
750{
751  bitmap local_live = BITMAP_ALLOC (&dce_tmp_bitmap_obstack);
752  rtx insn;
753  bool block_changed;
754  df_ref *def_rec;
755
756  if (redo_out)
757    {
758      /* Need to redo the live_out set of this block if when one of
759	 the succs of this block has had a change in it live in
760	 set.  */
761      edge e;
762      edge_iterator ei;
763      df_confluence_function_n con_fun_n = df_byte_lr->problem->con_fun_n;
764      bitmap_clear (DF_BYTE_LR_OUT (bb));
765      FOR_EACH_EDGE (e, ei, bb->succs)
766	(*con_fun_n) (e);
767    }
768
769  if (dump_file)
770    {
771      fprintf (dump_file, "processing block %d live out = ", bb->index);
772      df_print_byte_regset (dump_file, DF_BYTE_LR_OUT (bb));
773    }
774
775  bitmap_copy (local_live, DF_BYTE_LR_OUT (bb));
776
777  df_byte_lr_simulate_artificial_refs_at_end (bb, local_live);
778
779  FOR_BB_INSNS_REVERSE (bb, insn)
780    if (INSN_P (insn))
781      {
782	/* The insn is needed if there is someone who uses the output.  */
783	for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
784	  {
785	    df_ref def = *def_rec;
786	    unsigned int last;
787	    unsigned int dregno = DF_REF_REGNO (def);
788	    unsigned int start = df_byte_lr_get_regno_start (dregno);
789	    unsigned int len = df_byte_lr_get_regno_len (dregno);
790
791	    unsigned int sb;
792	    unsigned int lb;
793	    /* This is one of the only places where DF_MM_MAY should
794	       be used for defs.  Need to make sure that we are
795	       checking for all of the bits that may be used.  */
796
797	    if (!df_compute_accessed_bytes (def, DF_MM_MAY, &sb, &lb))
798	      {
799		start += sb;
800		len = lb - sb;
801	      }
802
803	    if (bitmap_bit_p (au, dregno))
804	      {
805		mark_insn (insn, true);
806		goto quickexit;
807	      }
808
809	    last = start + len;
810	    while (start < last)
811	      if (bitmap_bit_p (local_live, start++))
812		{
813		  mark_insn (insn, true);
814		  goto quickexit;
815		}
816	  }
817
818      quickexit:
819
820	/* No matter if the instruction is needed or not, we remove
821	   any regno in the defs from the live set.  */
822	df_byte_lr_simulate_defs (insn, local_live);
823
824	/* On the other hand, we do not allow the dead uses to set
825	   anything in local_live.  */
826	if (marked_insn_p (insn))
827	  df_byte_lr_simulate_uses (insn, local_live);
828
829	if (dump_file)
830	  {
831	    fprintf (dump_file, "finished processing insn %d live out = ",
832		     INSN_UID (insn));
833	    df_print_byte_regset (dump_file, local_live);
834	  }
835      }
836
837  df_byte_lr_simulate_artificial_refs_at_top (bb, local_live);
838
839  block_changed = !bitmap_equal_p (local_live, DF_BYTE_LR_IN (bb));
840  if (block_changed)
841    bitmap_copy (DF_BYTE_LR_IN (bb), local_live);
842  BITMAP_FREE (local_live);
843  return block_changed;
844}
845
846
847/* Process basic block BB.  Return true if the live_in set has
848   changed. REDO_OUT is true if the info at the bottom of the block
849   needs to be recalculated before starting.  AU is the proper set of
850   artificial uses. */
851
852static bool
853dce_process_block (basic_block bb, bool redo_out, bitmap au)
854{
855  bitmap local_live = BITMAP_ALLOC (&dce_tmp_bitmap_obstack);
856  rtx insn;
857  bool block_changed;
858  df_ref *def_rec;
859
860  if (redo_out)
861    {
862      /* Need to redo the live_out set of this block if when one of
863	 the succs of this block has had a change in it live in
864	 set.  */
865      edge e;
866      edge_iterator ei;
867      df_confluence_function_n con_fun_n = df_lr->problem->con_fun_n;
868      bitmap_clear (DF_LR_OUT (bb));
869      FOR_EACH_EDGE (e, ei, bb->succs)
870	(*con_fun_n) (e);
871    }
872
873  if (dump_file)
874    {
875      fprintf (dump_file, "processing block %d lr out = ", bb->index);
876      df_print_regset (dump_file, DF_LR_OUT (bb));
877    }
878
879  bitmap_copy (local_live, DF_LR_OUT (bb));
880
881  df_simulate_initialize_backwards (bb, local_live);
882
883  FOR_BB_INSNS_REVERSE (bb, insn)
884    if (INSN_P (insn))
885      {
886	bool needed = false;
887
888	/* The insn is needed if there is someone who uses the output.  */
889	for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
890	  if (bitmap_bit_p (local_live, DF_REF_REGNO (*def_rec))
891	      || bitmap_bit_p (au, DF_REF_REGNO (*def_rec)))
892	    {
893	      needed = true;
894	      break;
895	    }
896
897	if (needed)
898	  mark_insn (insn, true);
899
900	/* No matter if the instruction is needed or not, we remove
901	   any regno in the defs from the live set.  */
902	df_simulate_defs (insn, local_live);
903
904	/* On the other hand, we do not allow the dead uses to set
905	   anything in local_live.  */
906	if (marked_insn_p (insn))
907	  df_simulate_uses (insn, local_live);
908      }
909
910  df_simulate_finalize_backwards (bb, local_live);
911
912  block_changed = !bitmap_equal_p (local_live, DF_LR_IN (bb));
913  if (block_changed)
914    bitmap_copy (DF_LR_IN (bb), local_live);
915
916  BITMAP_FREE (local_live);
917  return block_changed;
918}
919
920
921/* Perform fast DCE once initialization is done.  If BYTE_LEVEL is
922   true, use the byte level dce, otherwise do it at the pseudo
923   level.  */
924
925static void
926fast_dce (bool byte_level)
927{
928  int *postorder = df_get_postorder (DF_BACKWARD);
929  int n_blocks = df_get_n_blocks (DF_BACKWARD);
930  /* The set of blocks that have been seen on this iteration.  */
931  bitmap processed = BITMAP_ALLOC (&dce_blocks_bitmap_obstack);
932  /* The set of blocks that need to have the out vectors reset because
933     the in of one of their successors has changed.  */
934  bitmap redo_out = BITMAP_ALLOC (&dce_blocks_bitmap_obstack);
935  bitmap all_blocks = BITMAP_ALLOC (&dce_blocks_bitmap_obstack);
936  bool global_changed = true;
937
938  /* These regs are considered always live so if they end up dying
939     because of some def, we need to bring the back again.  Calling
940     df_simulate_fixup_sets has the disadvantage of calling
941     bb_has_eh_pred once per insn, so we cache the information
942     here.  */
943  bitmap au = df->regular_block_artificial_uses;
944  bitmap au_eh = df->eh_block_artificial_uses;
945  int i;
946
947  prescan_insns_for_dce (true);
948
949  for (i = 0; i < n_blocks; i++)
950    bitmap_set_bit (all_blocks, postorder[i]);
951
952  while (global_changed)
953    {
954      global_changed = false;
955
956      for (i = 0; i < n_blocks; i++)
957	{
958	  int index = postorder[i];
959	  basic_block bb = BASIC_BLOCK (index);
960	  bool local_changed;
961
962	  if (index < NUM_FIXED_BLOCKS)
963	    {
964	      bitmap_set_bit (processed, index);
965	      continue;
966	    }
967
968	  if (byte_level)
969	    local_changed
970	      = byte_dce_process_block (bb, bitmap_bit_p (redo_out, index),
971					  bb_has_eh_pred (bb) ? au_eh : au);
972	  else
973	    local_changed
974	      = dce_process_block (bb, bitmap_bit_p (redo_out, index),
975				   bb_has_eh_pred (bb) ? au_eh : au);
976	  bitmap_set_bit (processed, index);
977
978	  if (local_changed)
979	    {
980	      edge e;
981	      edge_iterator ei;
982	      FOR_EACH_EDGE (e, ei, bb->preds)
983		if (bitmap_bit_p (processed, e->src->index))
984		  /* Be tricky about when we need to iterate the
985		     analysis.  We only have redo the analysis if the
986		     bitmaps change at the top of a block that is the
987		     entry to a loop.  */
988		  global_changed = true;
989		else
990		  bitmap_set_bit (redo_out, e->src->index);
991	    }
992	}
993
994      if (global_changed)
995	{
996	  /* Turn off the RUN_DCE flag to prevent recursive calls to
997	     dce.  */
998	  int old_flag = df_clear_flags (DF_LR_RUN_DCE);
999
1000	  /* So something was deleted that requires a redo.  Do it on
1001	     the cheap.  */
1002	  delete_unmarked_insns ();
1003	  sbitmap_zero (marked);
1004	  bitmap_clear (processed);
1005	  bitmap_clear (redo_out);
1006
1007	  /* We do not need to rescan any instructions.  We only need
1008	     to redo the dataflow equations for the blocks that had a
1009	     change at the top of the block.  Then we need to redo the
1010	     iteration.  */
1011	  if (byte_level)
1012	    df_analyze_problem (df_byte_lr, all_blocks, postorder, n_blocks);
1013	  else
1014	    df_analyze_problem (df_lr, all_blocks, postorder, n_blocks);
1015
1016	  if (old_flag & DF_LR_RUN_DCE)
1017	    df_set_flags (DF_LR_RUN_DCE);
1018
1019	  prescan_insns_for_dce (true);
1020	}
1021    }
1022
1023  delete_unmarked_insns ();
1024
1025  BITMAP_FREE (processed);
1026  BITMAP_FREE (redo_out);
1027  BITMAP_FREE (all_blocks);
1028}
1029
1030
1031/* Fast register level DCE.  */
1032
1033static unsigned int
1034rest_of_handle_fast_dce (void)
1035{
1036  init_dce (true);
1037  fast_dce (false);
1038  fini_dce (true);
1039  return 0;
1040}
1041
1042
1043/* Fast byte level DCE.  */
1044
1045static unsigned int
1046rest_of_handle_fast_byte_dce (void)
1047{
1048  df_byte_lr_add_problem ();
1049  init_dce (true);
1050  fast_dce (true);
1051  fini_dce (true);
1052  return 0;
1053}
1054
1055
1056/* This is an internal call that is used by the df live register
1057   problem to run fast dce as a side effect of creating the live
1058   information.  The stack is organized so that the lr problem is run,
1059   this pass is run, which updates the live info and the df scanning
1060   info, and then returns to allow the rest of the problems to be run.
1061
1062   This can be called by elsewhere but it will not update the bit
1063   vectors for any other problems than LR.  */
1064
1065void
1066run_fast_df_dce (void)
1067{
1068  if (flag_dce)
1069    {
1070      /* If dce is able to delete something, it has to happen
1071	 immediately.  Otherwise there will be problems handling the
1072	 eq_notes.  */
1073      int old_flags =
1074	df_clear_flags (DF_DEFER_INSN_RESCAN + DF_NO_INSN_RESCAN);
1075
1076      df_in_progress = true;
1077      rest_of_handle_fast_dce ();
1078      df_in_progress = false;
1079
1080      df_set_flags (old_flags);
1081    }
1082}
1083
1084
1085/* Run a fast DCE pass.  */
1086
1087void
1088run_fast_dce (void)
1089{
1090  if (flag_dce)
1091    rest_of_handle_fast_dce ();
1092}
1093
1094
1095static bool
1096gate_fast_dce (void)
1097{
1098  return optimize > 0 && flag_dce
1099    && dbg_cnt (dce_fast);
1100}
1101
1102struct rtl_opt_pass pass_fast_rtl_dce =
1103{
1104 {
1105  RTL_PASS,
1106  "rtl dce",                            /* name */
1107  gate_fast_dce,                        /* gate */
1108  rest_of_handle_fast_dce,              /* execute */
1109  NULL,                                 /* sub */
1110  NULL,                                 /* next */
1111  0,                                    /* static_pass_number */
1112  TV_DCE,                               /* tv_id */
1113  0,                                    /* properties_required */
1114  0,                                    /* properties_provided */
1115  0,                                    /* properties_destroyed */
1116  0,                                    /* todo_flags_start */
1117  TODO_dump_func |
1118  TODO_df_finish | TODO_verify_rtl_sharing |
1119  TODO_ggc_collect                      /* todo_flags_finish */
1120 }
1121};
1122
1123struct rtl_opt_pass pass_fast_rtl_byte_dce =
1124{
1125 {
1126  RTL_PASS,
1127  "byte-dce",                           /* name */
1128  gate_fast_dce,                        /* gate */
1129  rest_of_handle_fast_byte_dce,         /* execute */
1130  NULL,                                 /* sub */
1131  NULL,                                 /* next */
1132  0,                                    /* static_pass_number */
1133  TV_DCE,                               /* tv_id */
1134  0,                                    /* properties_required */
1135  0,                                    /* properties_provided */
1136  0,                                    /* properties_destroyed */
1137  0,                                    /* todo_flags_start */
1138  TODO_dump_func |
1139  TODO_df_finish | TODO_verify_rtl_sharing |
1140  TODO_ggc_collect                      /* todo_flags_finish */
1141 }
1142};
1143