1/* Control flow graph building code for GNU compiler.
2   Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3   1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 2, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING.  If not, write to the Free
19Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2002110-1301, USA.  */
21
22/* find_basic_blocks divides the current function's rtl into basic
23   blocks and constructs the CFG.  The blocks are recorded in the
24   basic_block_info array; the CFG exists in the edge structures
25   referenced by the blocks.
26
27   find_basic_blocks also finds any unreachable loops and deletes them.
28
29   Available functionality:
30     - CFG construction
31	 find_basic_blocks  */
32
33#include "config.h"
34#include "system.h"
35#include "coretypes.h"
36#include "tm.h"
37#include "tree.h"
38#include "rtl.h"
39#include "hard-reg-set.h"
40#include "basic-block.h"
41#include "regs.h"
42#include "flags.h"
43#include "output.h"
44#include "function.h"
45#include "except.h"
46#include "toplev.h"
47#include "timevar.h"
48
49static int count_basic_blocks (rtx);
50static void find_basic_blocks_1 (rtx);
51static void make_edges (basic_block, basic_block, int);
52static void make_label_edge (sbitmap, basic_block, rtx, int);
53static void find_bb_boundaries (basic_block);
54static void compute_outgoing_frequencies (basic_block);
55
56/* Return true if insn is something that should be contained inside basic
57   block.  */
58
59bool
60inside_basic_block_p (rtx insn)
61{
62  switch (GET_CODE (insn))
63    {
64    case CODE_LABEL:
65      /* Avoid creating of basic block for jumptables.  */
66      return (NEXT_INSN (insn) == 0
67	      || !JUMP_P (NEXT_INSN (insn))
68	      || (GET_CODE (PATTERN (NEXT_INSN (insn))) != ADDR_VEC
69		  && GET_CODE (PATTERN (NEXT_INSN (insn))) != ADDR_DIFF_VEC));
70
71    case JUMP_INSN:
72      return (GET_CODE (PATTERN (insn)) != ADDR_VEC
73	      && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC);
74
75    case CALL_INSN:
76    case INSN:
77      return true;
78
79    case BARRIER:
80    case NOTE:
81      return false;
82
83    default:
84      gcc_unreachable ();
85    }
86}
87
88/* Return true if INSN may cause control flow transfer, so it should be last in
89   the basic block.  */
90
91bool
92control_flow_insn_p (rtx insn)
93{
94  rtx note;
95
96  switch (GET_CODE (insn))
97    {
98    case NOTE:
99    case CODE_LABEL:
100      return false;
101
102    case JUMP_INSN:
103      /* Jump insn always causes control transfer except for tablejumps.  */
104      return (GET_CODE (PATTERN (insn)) != ADDR_VEC
105	      && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC);
106
107    case CALL_INSN:
108      /* Noreturn and sibling call instructions terminate the basic blocks
109	 (but only if they happen unconditionally).  */
110      if ((SIBLING_CALL_P (insn)
111	   || find_reg_note (insn, REG_NORETURN, 0))
112	  && GET_CODE (PATTERN (insn)) != COND_EXEC)
113	return true;
114      /* Call insn may return to the nonlocal goto handler.  */
115      return ((nonlocal_goto_handler_labels
116	       && (0 == (note = find_reg_note (insn, REG_EH_REGION,
117					       NULL_RTX))
118		   || INTVAL (XEXP (note, 0)) >= 0))
119	      /* Or may trap.  */
120	      || can_throw_internal (insn));
121
122    case INSN:
123      /* Treat trap instructions like noreturn calls (same provision).  */
124      if (GET_CODE (PATTERN (insn)) == TRAP_IF
125	  && XEXP (PATTERN (insn), 0) == const1_rtx)
126	return true;
127
128      return (flag_non_call_exceptions && can_throw_internal (insn));
129
130    case BARRIER:
131      /* It is nonsense to reach barrier when looking for the
132	 end of basic block, but before dead code is eliminated
133	 this may happen.  */
134      return false;
135
136    default:
137      gcc_unreachable ();
138    }
139}
140
141/* Count the basic blocks of the function.  */
142
143static int
144count_basic_blocks (rtx f)
145{
146  int count = NUM_FIXED_BLOCKS;
147  bool saw_insn = false;
148  rtx insn;
149
150  for (insn = f; insn; insn = NEXT_INSN (insn))
151    {
152      /* Code labels and barriers causes current basic block to be
153	 terminated at previous real insn.  */
154      if ((LABEL_P (insn) || BARRIER_P (insn))
155	  && saw_insn)
156	count++, saw_insn = false;
157
158      /* Start basic block if needed.  */
159      if (!saw_insn && inside_basic_block_p (insn))
160	saw_insn = true;
161
162      /* Control flow insn causes current basic block to be terminated.  */
163      if (saw_insn && control_flow_insn_p (insn))
164	count++, saw_insn = false;
165    }
166
167  if (saw_insn)
168    count++;
169
170  /* The rest of the compiler works a bit smoother when we don't have to
171     check for the edge case of do-nothing functions with no basic blocks.  */
172  if (count == NUM_FIXED_BLOCKS)
173    {
174      emit_insn (gen_rtx_USE (VOIDmode, const0_rtx));
175      count = NUM_FIXED_BLOCKS + 1;
176    }
177
178  return count;
179}
180
181/* Create an edge between two basic blocks.  FLAGS are auxiliary information
182   about the edge that is accumulated between calls.  */
183
184/* Create an edge from a basic block to a label.  */
185
186static void
187make_label_edge (sbitmap edge_cache, basic_block src, rtx label, int flags)
188{
189  gcc_assert (LABEL_P (label));
190
191  /* If the label was never emitted, this insn is junk, but avoid a
192     crash trying to refer to BLOCK_FOR_INSN (label).  This can happen
193     as a result of a syntax error and a diagnostic has already been
194     printed.  */
195
196  if (INSN_UID (label) == 0)
197    return;
198
199  cached_make_edge (edge_cache, src, BLOCK_FOR_INSN (label), flags);
200}
201
202/* Create the edges generated by INSN in REGION.  */
203
204void
205rtl_make_eh_edge (sbitmap edge_cache, basic_block src, rtx insn)
206{
207  int is_call = CALL_P (insn) ? EDGE_ABNORMAL_CALL : 0;
208  rtx handlers, i;
209
210  handlers = reachable_handlers (insn);
211
212  for (i = handlers; i; i = XEXP (i, 1))
213    make_label_edge (edge_cache, src, XEXP (i, 0),
214		     EDGE_ABNORMAL | EDGE_EH | is_call);
215
216  free_INSN_LIST_list (&handlers);
217}
218
219/* States of basic block as seen by find_many_sub_basic_blocks.  */
220enum state {
221  /* Basic blocks created via split_block belong to this state.
222     make_edges will examine these basic blocks to see if we need to
223     create edges going out of them.  */
224  BLOCK_NEW = 0,
225
226  /* Basic blocks that do not need examining belong to this state.
227     These blocks will be left intact.  In particular, make_edges will
228     not create edges going out of these basic blocks.  */
229  BLOCK_ORIGINAL,
230
231  /* Basic blocks that may need splitting (due to a label appearing in
232     the middle, etc) belong to this state.  After splitting them,
233     make_edges will create edges going out of them as needed.  */
234  BLOCK_TO_SPLIT
235};
236
237#define STATE(BB) (enum state) ((size_t) (BB)->aux)
238#define SET_STATE(BB, STATE) ((BB)->aux = (void *) (size_t) (STATE))
239
240/* Used internally by purge_dead_tablejump_edges, ORed into state.  */
241#define BLOCK_USED_BY_TABLEJUMP		32
242#define FULL_STATE(BB) ((size_t) (BB)->aux)
243
244/* Identify the edges going out of basic blocks between MIN and MAX,
245   inclusive, that have their states set to BLOCK_NEW or
246   BLOCK_TO_SPLIT.
247
248   UPDATE_P should be nonzero if we are updating CFG and zero if we
249   are building CFG from scratch.  */
250
251static void
252make_edges (basic_block min, basic_block max, int update_p)
253{
254  basic_block bb;
255  sbitmap edge_cache = NULL;
256
257  /* Heavy use of computed goto in machine-generated code can lead to
258     nearly fully-connected CFGs.  In that case we spend a significant
259     amount of time searching the edge lists for duplicates.  */
260  if (forced_labels || cfun->max_jumptable_ents > 100)
261    edge_cache = sbitmap_alloc (last_basic_block);
262
263  /* By nature of the way these get numbered, ENTRY_BLOCK_PTR->next_bb block
264     is always the entry.  */
265  if (min == ENTRY_BLOCK_PTR->next_bb)
266    make_edge (ENTRY_BLOCK_PTR, min, EDGE_FALLTHRU);
267
268  FOR_BB_BETWEEN (bb, min, max->next_bb, next_bb)
269    {
270      rtx insn, x;
271      enum rtx_code code;
272      edge e;
273      edge_iterator ei;
274
275      if (STATE (bb) == BLOCK_ORIGINAL)
276	continue;
277
278      /* If we have an edge cache, cache edges going out of BB.  */
279      if (edge_cache)
280	{
281	  sbitmap_zero (edge_cache);
282	  if (update_p)
283	    {
284	      FOR_EACH_EDGE (e, ei, bb->succs)
285		if (e->dest != EXIT_BLOCK_PTR)
286		  SET_BIT (edge_cache, e->dest->index);
287	    }
288	}
289
290      if (LABEL_P (BB_HEAD (bb))
291	  && LABEL_ALT_ENTRY_P (BB_HEAD (bb)))
292	cached_make_edge (NULL, ENTRY_BLOCK_PTR, bb, 0);
293
294      /* Examine the last instruction of the block, and discover the
295	 ways we can leave the block.  */
296
297      insn = BB_END (bb);
298      code = GET_CODE (insn);
299
300      /* A branch.  */
301      if (code == JUMP_INSN)
302	{
303	  rtx tmp;
304
305	  /* Recognize exception handling placeholders.  */
306	  if (GET_CODE (PATTERN (insn)) == RESX)
307	    rtl_make_eh_edge (edge_cache, bb, insn);
308
309	  /* Recognize a non-local goto as a branch outside the
310	     current function.  */
311	  else if (find_reg_note (insn, REG_NON_LOCAL_GOTO, NULL_RTX))
312	    ;
313
314	  /* Recognize a tablejump and do the right thing.  */
315	  else if (tablejump_p (insn, NULL, &tmp))
316	    {
317	      rtvec vec;
318	      int j;
319
320	      if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
321		vec = XVEC (PATTERN (tmp), 0);
322	      else
323		vec = XVEC (PATTERN (tmp), 1);
324
325	      for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
326		make_label_edge (edge_cache, bb,
327				 XEXP (RTVEC_ELT (vec, j), 0), 0);
328
329	      /* Some targets (eg, ARM) emit a conditional jump that also
330		 contains the out-of-range target.  Scan for these and
331		 add an edge if necessary.  */
332	      if ((tmp = single_set (insn)) != NULL
333		  && SET_DEST (tmp) == pc_rtx
334		  && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
335		  && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF)
336		make_label_edge (edge_cache, bb,
337				 XEXP (XEXP (SET_SRC (tmp), 2), 0), 0);
338	    }
339
340	  /* If this is a computed jump, then mark it as reaching
341	     everything on the forced_labels list.  */
342	  else if (computed_jump_p (insn))
343	    {
344	      for (x = forced_labels; x; x = XEXP (x, 1))
345		make_label_edge (edge_cache, bb, XEXP (x, 0), EDGE_ABNORMAL);
346	    }
347
348	  /* Returns create an exit out.  */
349	  else if (returnjump_p (insn))
350	    cached_make_edge (edge_cache, bb, EXIT_BLOCK_PTR, 0);
351
352	  /* Otherwise, we have a plain conditional or unconditional jump.  */
353	  else
354	    {
355	      gcc_assert (JUMP_LABEL (insn));
356	      make_label_edge (edge_cache, bb, JUMP_LABEL (insn), 0);
357	    }
358	}
359
360      /* If this is a sibling call insn, then this is in effect a combined call
361	 and return, and so we need an edge to the exit block.  No need to
362	 worry about EH edges, since we wouldn't have created the sibling call
363	 in the first place.  */
364      if (code == CALL_INSN && SIBLING_CALL_P (insn))
365	cached_make_edge (edge_cache, bb, EXIT_BLOCK_PTR,
366			  EDGE_SIBCALL | EDGE_ABNORMAL);
367
368      /* If this is a CALL_INSN, then mark it as reaching the active EH
369	 handler for this CALL_INSN.  If we're handling non-call
370	 exceptions then any insn can reach any of the active handlers.
371	 Also mark the CALL_INSN as reaching any nonlocal goto handler.  */
372      else if (code == CALL_INSN || flag_non_call_exceptions)
373	{
374	  /* Add any appropriate EH edges.  */
375	  rtl_make_eh_edge (edge_cache, bb, insn);
376
377	  if (code == CALL_INSN && nonlocal_goto_handler_labels)
378	    {
379	      /* ??? This could be made smarter: in some cases it's possible
380		 to tell that certain calls will not do a nonlocal goto.
381		 For example, if the nested functions that do the nonlocal
382		 gotos do not have their addresses taken, then only calls to
383		 those functions or to other nested functions that use them
384		 could possibly do nonlocal gotos.  */
385
386	      /* We do know that a REG_EH_REGION note with a value less
387		 than 0 is guaranteed not to perform a non-local goto.  */
388	      rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
389
390	      if (!note || INTVAL (XEXP (note, 0)) >=  0)
391		for (x = nonlocal_goto_handler_labels; x; x = XEXP (x, 1))
392		  make_label_edge (edge_cache, bb, XEXP (x, 0),
393				   EDGE_ABNORMAL | EDGE_ABNORMAL_CALL);
394	    }
395	}
396
397      /* Find out if we can drop through to the next block.  */
398      insn = NEXT_INSN (insn);
399      e = find_edge (bb, EXIT_BLOCK_PTR);
400      if (e && e->flags & EDGE_FALLTHRU)
401	insn = NULL;
402
403      while (insn
404	     && NOTE_P (insn)
405	     && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK)
406	insn = NEXT_INSN (insn);
407
408      if (!insn)
409	cached_make_edge (edge_cache, bb, EXIT_BLOCK_PTR, EDGE_FALLTHRU);
410      else if (bb->next_bb != EXIT_BLOCK_PTR)
411	{
412	  if (insn == BB_HEAD (bb->next_bb))
413	    cached_make_edge (edge_cache, bb, bb->next_bb, EDGE_FALLTHRU);
414	}
415    }
416
417  if (edge_cache)
418    sbitmap_vector_free (edge_cache);
419}
420
421/* Find all basic blocks of the function whose first insn is F.
422
423   Collect and return a list of labels whose addresses are taken.  This
424   will be used in make_edges for use with computed gotos.  */
425
426static void
427find_basic_blocks_1 (rtx f)
428{
429  rtx insn, next;
430  rtx bb_note = NULL_RTX;
431  rtx head = NULL_RTX;
432  rtx end = NULL_RTX;
433  basic_block prev = ENTRY_BLOCK_PTR;
434
435  /* We process the instructions in a slightly different way than we did
436     previously.  This is so that we see a NOTE_BASIC_BLOCK after we have
437     closed out the previous block, so that it gets attached at the proper
438     place.  Since this form should be equivalent to the previous,
439     count_basic_blocks continues to use the old form as a check.  */
440
441  for (insn = f; insn; insn = next)
442    {
443      enum rtx_code code = GET_CODE (insn);
444
445      next = NEXT_INSN (insn);
446
447      if ((LABEL_P (insn) || BARRIER_P (insn))
448	  && head)
449	{
450	  prev = create_basic_block_structure (head, end, bb_note, prev);
451	  head = end = NULL_RTX;
452	  bb_note = NULL_RTX;
453	}
454
455      if (inside_basic_block_p (insn))
456	{
457	  if (head == NULL_RTX)
458	    head = insn;
459	  end = insn;
460	}
461
462      if (head && control_flow_insn_p (insn))
463	{
464	  prev = create_basic_block_structure (head, end, bb_note, prev);
465	  head = end = NULL_RTX;
466	  bb_note = NULL_RTX;
467	}
468
469      switch (code)
470	{
471	case NOTE:
472	  {
473	    int kind = NOTE_LINE_NUMBER (insn);
474
475	    /* Look for basic block notes with which to keep the
476	       basic_block_info pointers stable.  Unthread the note now;
477	       we'll put it back at the right place in create_basic_block.
478	       Or not at all if we've already found a note in this block.  */
479	    if (kind == NOTE_INSN_BASIC_BLOCK)
480	      {
481		if (bb_note == NULL_RTX)
482		  bb_note = insn;
483		else
484		  next = delete_insn (insn);
485	      }
486	    break;
487	  }
488
489	case CODE_LABEL:
490	case JUMP_INSN:
491	case CALL_INSN:
492	case INSN:
493	case BARRIER:
494	  break;
495
496	default:
497	  gcc_unreachable ();
498	}
499    }
500
501  if (head != NULL_RTX)
502    create_basic_block_structure (head, end, bb_note, prev);
503  else if (bb_note)
504    delete_insn (bb_note);
505
506  gcc_assert (last_basic_block == n_basic_blocks);
507
508  clear_aux_for_blocks ();
509}
510
511
512/* Find basic blocks of the current function.
513   F is the first insn of the function.  */
514
515void
516find_basic_blocks (rtx f)
517{
518  basic_block bb;
519
520  timevar_push (TV_CFG);
521
522  /* Flush out existing data.  */
523  if (basic_block_info != NULL)
524    {
525      clear_edges ();
526
527      /* Clear bb->aux on all extant basic blocks.  We'll use this as a
528	 tag for reuse during create_basic_block, just in case some pass
529	 copies around basic block notes improperly.  */
530      FOR_EACH_BB (bb)
531	bb->aux = NULL;
532
533      basic_block_info = NULL;
534    }
535
536  n_basic_blocks = count_basic_blocks (f);
537  last_basic_block = NUM_FIXED_BLOCKS;
538  ENTRY_BLOCK_PTR->next_bb = EXIT_BLOCK_PTR;
539  EXIT_BLOCK_PTR->prev_bb = ENTRY_BLOCK_PTR;
540
541
542  /* Size the basic block table.  The actual structures will be allocated
543     by find_basic_blocks_1, since we want to keep the structure pointers
544     stable across calls to find_basic_blocks.  */
545  /* ??? This whole issue would be much simpler if we called find_basic_blocks
546     exactly once, and thereafter we don't have a single long chain of
547     instructions at all until close to the end of compilation when we
548     actually lay them out.  */
549
550  basic_block_info = VEC_alloc (basic_block, gc, n_basic_blocks);
551  VEC_safe_grow (basic_block, gc, basic_block_info, n_basic_blocks);
552  memset (VEC_address (basic_block, basic_block_info), 0,
553	  sizeof (basic_block) * n_basic_blocks);
554  SET_BASIC_BLOCK (ENTRY_BLOCK, ENTRY_BLOCK_PTR);
555  SET_BASIC_BLOCK (EXIT_BLOCK, EXIT_BLOCK_PTR);
556
557  find_basic_blocks_1 (f);
558
559  profile_status = PROFILE_ABSENT;
560
561  /* Tell make_edges to examine every block for out-going edges.  */
562  FOR_EACH_BB (bb)
563    SET_STATE (bb, BLOCK_NEW);
564
565  /* Discover the edges of our cfg.  */
566  make_edges (ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR->prev_bb, 0);
567
568  /* Do very simple cleanup now, for the benefit of code that runs between
569     here and cleanup_cfg, e.g. thread_prologue_and_epilogue_insns.  */
570  tidy_fallthru_edges ();
571
572#ifdef ENABLE_CHECKING
573  verify_flow_info ();
574#endif
575  timevar_pop (TV_CFG);
576}
577
578static void
579mark_tablejump_edge (rtx label)
580{
581  basic_block bb;
582
583  gcc_assert (LABEL_P (label));
584  /* See comment in make_label_edge.  */
585  if (INSN_UID (label) == 0)
586    return;
587  bb = BLOCK_FOR_INSN (label);
588  SET_STATE (bb, FULL_STATE (bb) | BLOCK_USED_BY_TABLEJUMP);
589}
590
591static void
592purge_dead_tablejump_edges (basic_block bb, rtx table)
593{
594  rtx insn = BB_END (bb), tmp;
595  rtvec vec;
596  int j;
597  edge_iterator ei;
598  edge e;
599
600  if (GET_CODE (PATTERN (table)) == ADDR_VEC)
601    vec = XVEC (PATTERN (table), 0);
602  else
603    vec = XVEC (PATTERN (table), 1);
604
605  for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
606    mark_tablejump_edge (XEXP (RTVEC_ELT (vec, j), 0));
607
608  /* Some targets (eg, ARM) emit a conditional jump that also
609     contains the out-of-range target.  Scan for these and
610     add an edge if necessary.  */
611  if ((tmp = single_set (insn)) != NULL
612       && SET_DEST (tmp) == pc_rtx
613       && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
614       && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF)
615    mark_tablejump_edge (XEXP (XEXP (SET_SRC (tmp), 2), 0));
616
617  for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
618    {
619      if (FULL_STATE (e->dest) & BLOCK_USED_BY_TABLEJUMP)
620	SET_STATE (e->dest, FULL_STATE (e->dest)
621			    & ~(size_t) BLOCK_USED_BY_TABLEJUMP);
622      else if (!(e->flags & (EDGE_ABNORMAL | EDGE_EH)))
623	{
624	  remove_edge (e);
625	  continue;
626	}
627      ei_next (&ei);
628    }
629}
630
631/* Scan basic block BB for possible BB boundaries inside the block
632   and create new basic blocks in the progress.  */
633
634static void
635find_bb_boundaries (basic_block bb)
636{
637  basic_block orig_bb = bb;
638  rtx insn = BB_HEAD (bb);
639  rtx end = BB_END (bb);
640  rtx table;
641  rtx flow_transfer_insn = NULL_RTX;
642  edge fallthru = NULL;
643
644  if (insn == BB_END (bb))
645    return;
646
647  if (LABEL_P (insn))
648    insn = NEXT_INSN (insn);
649
650  /* Scan insn chain and try to find new basic block boundaries.  */
651  while (1)
652    {
653      enum rtx_code code = GET_CODE (insn);
654
655      /* On code label, split current basic block.  */
656      if (code == CODE_LABEL)
657	{
658	  fallthru = split_block (bb, PREV_INSN (insn));
659	  if (flow_transfer_insn)
660	    BB_END (bb) = flow_transfer_insn;
661
662	  bb = fallthru->dest;
663	  remove_edge (fallthru);
664	  flow_transfer_insn = NULL_RTX;
665	  if (LABEL_ALT_ENTRY_P (insn))
666	    make_edge (ENTRY_BLOCK_PTR, bb, 0);
667	}
668
669      /* In case we've previously seen an insn that effects a control
670	 flow transfer, split the block.  */
671      if (flow_transfer_insn && inside_basic_block_p (insn))
672	{
673	  fallthru = split_block (bb, PREV_INSN (insn));
674	  BB_END (bb) = flow_transfer_insn;
675	  bb = fallthru->dest;
676	  remove_edge (fallthru);
677	  flow_transfer_insn = NULL_RTX;
678	}
679
680      if (control_flow_insn_p (insn))
681	flow_transfer_insn = insn;
682      if (insn == end)
683	break;
684      insn = NEXT_INSN (insn);
685    }
686
687  /* In case expander replaced normal insn by sequence terminating by
688     return and barrier, or possibly other sequence not behaving like
689     ordinary jump, we need to take care and move basic block boundary.  */
690  if (flow_transfer_insn)
691    BB_END (bb) = flow_transfer_insn;
692
693  /* We've possibly replaced the conditional jump by conditional jump
694     followed by cleanup at fallthru edge, so the outgoing edges may
695     be dead.  */
696  purge_dead_edges (bb);
697
698  /* purge_dead_edges doesn't handle tablejump's, but if we have split the
699     basic block, we might need to kill some edges.  */
700  if (bb != orig_bb && tablejump_p (BB_END (bb), NULL, &table))
701    purge_dead_tablejump_edges (bb, table);
702}
703
704/*  Assume that frequency of basic block B is known.  Compute frequencies
705    and probabilities of outgoing edges.  */
706
707static void
708compute_outgoing_frequencies (basic_block b)
709{
710  edge e, f;
711  edge_iterator ei;
712
713  if (EDGE_COUNT (b->succs) == 2)
714    {
715      rtx note = find_reg_note (BB_END (b), REG_BR_PROB, NULL);
716      int probability;
717
718      if (note)
719	{
720	  probability = INTVAL (XEXP (note, 0));
721	  e = BRANCH_EDGE (b);
722	  e->probability = probability;
723	  e->count = ((b->count * probability + REG_BR_PROB_BASE / 2)
724		      / REG_BR_PROB_BASE);
725	  f = FALLTHRU_EDGE (b);
726	  f->probability = REG_BR_PROB_BASE - probability;
727	  f->count = b->count - e->count;
728	  return;
729	}
730    }
731
732  if (single_succ_p (b))
733    {
734      e = single_succ_edge (b);
735      e->probability = REG_BR_PROB_BASE;
736      e->count = b->count;
737      return;
738    }
739  guess_outgoing_edge_probabilities (b);
740  if (b->count)
741    FOR_EACH_EDGE (e, ei, b->succs)
742      e->count = ((b->count * e->probability + REG_BR_PROB_BASE / 2)
743		  / REG_BR_PROB_BASE);
744}
745
746/* Assume that some pass has inserted labels or control flow
747   instructions within a basic block.  Split basic blocks as needed
748   and create edges.  */
749
750void
751find_many_sub_basic_blocks (sbitmap blocks)
752{
753  basic_block bb, min, max;
754
755  FOR_EACH_BB (bb)
756    SET_STATE (bb,
757	       TEST_BIT (blocks, bb->index) ? BLOCK_TO_SPLIT : BLOCK_ORIGINAL);
758
759  FOR_EACH_BB (bb)
760    if (STATE (bb) == BLOCK_TO_SPLIT)
761      find_bb_boundaries (bb);
762
763  FOR_EACH_BB (bb)
764    if (STATE (bb) != BLOCK_ORIGINAL)
765      break;
766
767  min = max = bb;
768  for (; bb != EXIT_BLOCK_PTR; bb = bb->next_bb)
769    if (STATE (bb) != BLOCK_ORIGINAL)
770      max = bb;
771
772  /* Now re-scan and wire in all edges.  This expect simple (conditional)
773     jumps at the end of each new basic blocks.  */
774  make_edges (min, max, 1);
775
776  /* Update branch probabilities.  Expect only (un)conditional jumps
777     to be created with only the forward edges.  */
778  if (profile_status != PROFILE_ABSENT)
779    FOR_BB_BETWEEN (bb, min, max->next_bb, next_bb)
780      {
781	edge e;
782	edge_iterator ei;
783
784	if (STATE (bb) == BLOCK_ORIGINAL)
785	  continue;
786	if (STATE (bb) == BLOCK_NEW)
787	  {
788	    bb->count = 0;
789	    bb->frequency = 0;
790	    FOR_EACH_EDGE (e, ei, bb->preds)
791	      {
792		bb->count += e->count;
793		bb->frequency += EDGE_FREQUENCY (e);
794	      }
795	  }
796
797	compute_outgoing_frequencies (bb);
798      }
799
800  FOR_EACH_BB (bb)
801    SET_STATE (bb, 0);
802}
803