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