OSDN Git Service

77290a9b80677577e84f4f8876bf0587ec9df78c
[pf3gnuchains/gcc-fork.git] / gcc / cfgrtl.c
1 /* Control flow graph manipulation code for GNU compiler.
2    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002 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 /* This file contains low level functions to manipulate the CFG and analyze it
23    that are aware of the RTL intermediate language.
24
25    Available functionality:
26      - CFG-aware instruction chain manipulation
27          delete_insn, delete_insn_chain
28      - Basic block manipulation
29          create_basic_block, flow_delete_block, split_block,
30          merge_blocks_nomove
31      - Infrastructure to determine quickly basic block for insn
32          compute_bb_for_insn, update_bb_for_insn, set_block_for_insn,
33      - Edge redirection with updating and optimizing of insn chain
34          block_label, redirect_edge_and_branch,
35          redirect_edge_and_branch_force, tidy_fallthru_edge, force_nonfallthru
36      - Edge splitting and committing to edges
37          split_edge, insert_insn_on_edge, commit_edge_insertions
38      - Dumping and debugging
39          print_rtl_with_bb, dump_bb, debug_bb, debug_bb_n
40      - Consistency checking
41          verify_flow_info
42      - CFG updating after constant propagation
43          purge_dead_edges, purge_all_dead_edges   */
44 \f
45 #include "config.h"
46 #include "system.h"
47 #include "coretypes.h"
48 #include "tm.h"
49 #include "tree.h"
50 #include "rtl.h"
51 #include "hard-reg-set.h"
52 #include "basic-block.h"
53 #include "regs.h"
54 #include "flags.h"
55 #include "output.h"
56 #include "function.h"
57 #include "except.h"
58 #include "toplev.h"
59 #include "tm_p.h"
60 #include "obstack.h"
61 #include "insn-config.h"
62
63 /* Stubs in case we don't have a return insn.  */
64 #ifndef HAVE_return
65 #define HAVE_return 0
66 #define gen_return() NULL_RTX
67 #endif
68
69 /* The labels mentioned in non-jump rtl.  Valid during find_basic_blocks.  */
70 /* ??? Should probably be using LABEL_NUSES instead.  It would take a
71    bit of surgery to be able to use or co-opt the routines in jump.  */
72 rtx label_value_list;
73 rtx tail_recursion_label_list;
74
75 static int can_delete_note_p            PARAMS ((rtx));
76 static int can_delete_label_p           PARAMS ((rtx));
77 static void commit_one_edge_insertion   PARAMS ((edge, int));
78 static bool try_redirect_by_replacing_jump PARAMS ((edge, basic_block));
79 static rtx last_loop_beg_note           PARAMS ((rtx));
80 static bool back_edge_of_syntactic_loop_p PARAMS ((basic_block, basic_block));
81 static basic_block force_nonfallthru_and_redirect PARAMS ((edge, basic_block));
82 \f
83 /* Return true if NOTE is not one of the ones that must be kept paired,
84    so that we may simply delete it.  */
85
86 static int
87 can_delete_note_p (note)
88      rtx note;
89 {
90   return (NOTE_LINE_NUMBER (note) == NOTE_INSN_DELETED
91           || NOTE_LINE_NUMBER (note) == NOTE_INSN_BASIC_BLOCK
92           || NOTE_LINE_NUMBER (note) == NOTE_INSN_PREDICTION);
93 }
94
95 /* True if a given label can be deleted.  */
96
97 static int
98 can_delete_label_p (label)
99      rtx label;
100 {
101   return (!LABEL_PRESERVE_P (label)
102           /* User declared labels must be preserved.  */
103           && LABEL_NAME (label) == 0
104           && !in_expr_list_p (forced_labels, label)
105           && !in_expr_list_p (label_value_list, label));
106 }
107
108 /* Delete INSN by patching it out.  Return the next insn.  */
109
110 rtx
111 delete_insn (insn)
112      rtx insn;
113 {
114   rtx next = NEXT_INSN (insn);
115   rtx note;
116   bool really_delete = true;
117
118   if (GET_CODE (insn) == CODE_LABEL)
119     {
120       /* Some labels can't be directly removed from the INSN chain, as they
121          might be references via variables, constant pool etc.
122          Convert them to the special NOTE_INSN_DELETED_LABEL note.  */
123       if (! can_delete_label_p (insn))
124         {
125           const char *name = LABEL_NAME (insn);
126
127           really_delete = false;
128           PUT_CODE (insn, NOTE);
129           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED_LABEL;
130           NOTE_SOURCE_FILE (insn) = name;
131         }
132
133       remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
134     }
135
136   if (really_delete)
137     {
138       /* If this insn has already been deleted, something is very wrong.  */
139       if (INSN_DELETED_P (insn))
140         abort ();
141       remove_insn (insn);
142       INSN_DELETED_P (insn) = 1;
143     }
144
145   /* If deleting a jump, decrement the use count of the label.  Deleting
146      the label itself should happen in the normal course of block merging.  */
147   if (GET_CODE (insn) == JUMP_INSN
148       && JUMP_LABEL (insn)
149       && GET_CODE (JUMP_LABEL (insn)) == CODE_LABEL)
150     LABEL_NUSES (JUMP_LABEL (insn))--;
151
152   /* Also if deleting an insn that references a label.  */
153   else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX
154            && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
155     LABEL_NUSES (XEXP (note, 0))--;
156
157   if (GET_CODE (insn) == JUMP_INSN
158       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
159           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
160     {
161       rtx pat = PATTERN (insn);
162       int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
163       int len = XVECLEN (pat, diff_vec_p);
164       int i;
165
166       for (i = 0; i < len; i++)
167         {
168           rtx label = XEXP (XVECEXP (pat, diff_vec_p, i), 0);
169
170           /* When deleting code in bulk (e.g. removing many unreachable
171              blocks) we can delete a label that's a target of the vector
172              before deleting the vector itself.  */
173           if (GET_CODE (label) != NOTE)
174             LABEL_NUSES (label)--;
175         }
176     }
177
178   return next;
179 }
180
181 /* Like delete_insn but also purge dead edges from BB.  */
182 rtx
183 delete_insn_and_edges (insn)
184      rtx insn;
185 {
186   rtx x;
187   bool purge = false;
188
189   if (INSN_P (insn)
190       && BLOCK_FOR_INSN (insn)
191       && BLOCK_FOR_INSN (insn)->end == insn)
192     purge = true;
193   x = delete_insn (insn);
194   if (purge)
195     purge_dead_edges (BLOCK_FOR_INSN (insn));
196   return x;
197 }
198
199 /* Unlink a chain of insns between START and FINISH, leaving notes
200    that must be paired.  */
201
202 void
203 delete_insn_chain (start, finish)
204      rtx start, finish;
205 {
206   rtx next;
207
208   /* Unchain the insns one by one.  It would be quicker to delete all of these
209      with a single unchaining, rather than one at a time, but we need to keep
210      the NOTE's.  */
211   while (1)
212     {
213       next = NEXT_INSN (start);
214       if (GET_CODE (start) == NOTE && !can_delete_note_p (start))
215         ;
216       else
217         next = delete_insn (start);
218
219       if (start == finish)
220         break;
221       start = next;
222     }
223 }
224
225 /* Like delete_insn but also purge dead edges from BB.  */
226 void
227 delete_insn_chain_and_edges (first, last)
228      rtx first, last;
229 {
230   bool purge = false;
231
232   if (INSN_P (last)
233       && BLOCK_FOR_INSN (last)
234       && BLOCK_FOR_INSN (last)->end == last)
235     purge = true;
236   delete_insn_chain (first, last);
237   if (purge)
238     purge_dead_edges (BLOCK_FOR_INSN (last));
239 }
240 \f
241 /* Create a new basic block consisting of the instructions between HEAD and END
242    inclusive.  This function is designed to allow fast BB construction - reuses
243    the note and basic block struct in BB_NOTE, if any and do not grow
244    BASIC_BLOCK chain and should be used directly only by CFG construction code.
245    END can be NULL in to create new empty basic block before HEAD.  Both END
246    and HEAD can be NULL to create basic block at the end of INSN chain.
247    AFTER is the basic block we should be put after.  */
248
249 basic_block
250 create_basic_block_structure (head, end, bb_note, after)
251      rtx head, end, bb_note;
252      basic_block after;
253 {
254   basic_block bb;
255
256   if (bb_note
257       && ! RTX_INTEGRATED_P (bb_note)
258       && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
259       && bb->aux == NULL)
260     {
261       /* If we found an existing note, thread it back onto the chain.  */
262
263       rtx after;
264
265       if (GET_CODE (head) == CODE_LABEL)
266         after = head;
267       else
268         {
269           after = PREV_INSN (head);
270           head = bb_note;
271         }
272
273       if (after != bb_note && NEXT_INSN (after) != bb_note)
274         reorder_insns_nobb (bb_note, bb_note, after);
275     }
276   else
277     {
278       /* Otherwise we must create a note and a basic block structure.  */
279
280       bb = alloc_block ();
281
282       if (!head && !end)
283         head = end = bb_note
284           = emit_note_after (NOTE_INSN_BASIC_BLOCK, get_last_insn ());
285       else if (GET_CODE (head) == CODE_LABEL && end)
286         {
287           bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
288           if (head == end)
289             end = bb_note;
290         }
291       else
292         {
293           bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
294           head = bb_note;
295           if (!end)
296             end = head;
297         }
298
299       NOTE_BASIC_BLOCK (bb_note) = bb;
300     }
301
302   /* Always include the bb note in the block.  */
303   if (NEXT_INSN (end) == bb_note)
304     end = bb_note;
305
306   bb->head = head;
307   bb->end = end;
308   bb->index = last_basic_block++;
309   bb->flags = BB_NEW;
310   link_block (bb, after);
311   BASIC_BLOCK (bb->index) = bb;
312   update_bb_for_insn (bb);
313
314   /* Tag the block so that we know it has been used when considering
315      other basic block notes.  */
316   bb->aux = bb;
317
318   return bb;
319 }
320
321 /* Create new basic block consisting of instructions in between HEAD and END
322    and place it to the BB chain after block AFTER.  END can be NULL in to
323    create new empty basic block before HEAD.  Both END and HEAD can be NULL to
324    create basic block at the end of INSN chain.  */
325
326 basic_block
327 create_basic_block (head, end, after)
328      rtx head, end;
329      basic_block after;
330 {
331   basic_block bb;
332
333   /* Place the new block just after the end.  */
334   VARRAY_GROW (basic_block_info, last_basic_block+1);
335
336   n_basic_blocks++;
337
338   bb = create_basic_block_structure (head, end, NULL, after);
339   bb->aux = NULL;
340   return bb;
341 }
342 \f
343 /* Delete the insns in a (non-live) block.  We physically delete every
344    non-deleted-note insn, and update the flow graph appropriately.
345
346    Return nonzero if we deleted an exception handler.  */
347
348 /* ??? Preserving all such notes strikes me as wrong.  It would be nice
349    to post-process the stream to remove empty blocks, loops, ranges, etc.  */
350
351 int
352 flow_delete_block_noexpunge (b)
353      basic_block b;
354 {
355   int deleted_handler = 0;
356   rtx insn, end, tmp;
357
358   /* If the head of this block is a CODE_LABEL, then it might be the
359      label for an exception handler which can't be reached.
360
361      We need to remove the label from the exception_handler_label list
362      and remove the associated NOTE_INSN_EH_REGION_BEG and
363      NOTE_INSN_EH_REGION_END notes.  */
364
365   /* Get rid of all NOTE_INSN_PREDICTIONs and NOTE_INSN_LOOP_CONTs
366      hanging before the block.  */
367
368   for (insn = PREV_INSN (b->head); insn; insn = PREV_INSN (insn))
369     {
370       if (GET_CODE (insn) != NOTE)
371         break;
372       if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_PREDICTION
373           || NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_CONT)
374         NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
375     }
376
377   insn = b->head;
378
379   never_reached_warning (insn, b->end);
380
381   if (GET_CODE (insn) == CODE_LABEL)
382     maybe_remove_eh_handler (insn);
383
384   /* Include any jump table following the basic block.  */
385   end = b->end;
386   if (GET_CODE (end) == JUMP_INSN
387       && (tmp = JUMP_LABEL (end)) != NULL_RTX
388       && (tmp = NEXT_INSN (tmp)) != NULL_RTX
389       && GET_CODE (tmp) == JUMP_INSN
390       && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
391           || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
392     end = tmp;
393
394   /* Include any barrier that may follow the basic block.  */
395   tmp = next_nonnote_insn (end);
396   if (tmp && GET_CODE (tmp) == BARRIER)
397     end = tmp;
398
399   /* Selectively delete the entire chain.  */
400   b->head = NULL;
401   delete_insn_chain (insn, end);
402
403   /* Remove the edges into and out of this block.  Note that there may
404      indeed be edges in, if we are removing an unreachable loop.  */
405   while (b->pred != NULL)
406     remove_edge (b->pred);
407   while (b->succ != NULL)
408     remove_edge (b->succ);
409
410   b->pred = NULL;
411   b->succ = NULL;
412
413   return deleted_handler;
414 }
415
416 int
417 flow_delete_block (b)
418      basic_block b;
419 {
420   int deleted_handler = flow_delete_block_noexpunge (b);
421
422   /* Remove the basic block from the array.  */
423   expunge_block (b);
424
425   return deleted_handler;
426 }
427 \f
428 /* Records the basic block struct in BLOCK_FOR_INSN for every insn.  */
429
430 void
431 compute_bb_for_insn ()
432 {
433   basic_block bb;
434
435   FOR_EACH_BB (bb)
436     {
437       rtx end = bb->end;
438       rtx insn;
439
440       for (insn = bb->head; ; insn = NEXT_INSN (insn))
441         {
442           BLOCK_FOR_INSN (insn) = bb;
443           if (insn == end)
444             break;
445         }
446     }
447 }
448
449 /* Release the basic_block_for_insn array.  */
450
451 void
452 free_bb_for_insn ()
453 {
454   rtx insn;
455   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
456     if (GET_CODE (insn) != BARRIER)
457       BLOCK_FOR_INSN (insn) = NULL;
458 }
459
460 /* Update insns block within BB.  */
461
462 void
463 update_bb_for_insn (bb)
464      basic_block bb;
465 {
466   rtx insn;
467
468   for (insn = bb->head; ; insn = NEXT_INSN (insn))
469     {
470       set_block_for_insn (insn, bb);
471       if (insn == bb->end)
472         break;
473     }
474 }
475 \f
476 /* Split a block BB after insn INSN creating a new fallthru edge.
477    Return the new edge.  Note that to keep other parts of the compiler happy,
478    this function renumbers all the basic blocks so that the new
479    one has a number one greater than the block split.  */
480
481 edge
482 split_block (bb, insn)
483      basic_block bb;
484      rtx insn;
485 {
486   basic_block new_bb;
487   edge new_edge;
488   edge e;
489
490   /* There is no point splitting the block after its end.  */
491   if (bb->end == insn)
492     return 0;
493
494   /* Create the new basic block.  */
495   new_bb = create_basic_block (NEXT_INSN (insn), bb->end, bb);
496   new_bb->count = bb->count;
497   new_bb->frequency = bb->frequency;
498   new_bb->loop_depth = bb->loop_depth;
499   bb->end = insn;
500
501   /* Redirect the outgoing edges.  */
502   new_bb->succ = bb->succ;
503   bb->succ = NULL;
504   for (e = new_bb->succ; e; e = e->succ_next)
505     e->src = new_bb;
506
507   new_edge = make_single_succ_edge (bb, new_bb, EDGE_FALLTHRU);
508
509   if (bb->global_live_at_start)
510     {
511       new_bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
512       new_bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
513       COPY_REG_SET (new_bb->global_live_at_end, bb->global_live_at_end);
514
515       /* We now have to calculate which registers are live at the end
516          of the split basic block and at the start of the new basic
517          block.  Start with those registers that are known to be live
518          at the end of the original basic block and get
519          propagate_block to determine which registers are live.  */
520       COPY_REG_SET (new_bb->global_live_at_start, bb->global_live_at_end);
521       propagate_block (new_bb, new_bb->global_live_at_start, NULL, NULL, 0);
522       COPY_REG_SET (bb->global_live_at_end,
523                     new_bb->global_live_at_start);
524 #ifdef HAVE_conditional_execution
525       /* In the presence of conditional execution we are not able to update
526          liveness precisely.  */
527       if (reload_completed)
528         {
529           bb->flags |= BB_DIRTY;
530           new_bb->flags |= BB_DIRTY;
531         }
532 #endif
533     }
534
535   return new_edge;
536 }
537
538 /* Blocks A and B are to be merged into a single block A.  The insns
539    are already contiguous, hence `nomove'.  */
540
541 void
542 merge_blocks_nomove (a, b)
543      basic_block a, b;
544 {
545   rtx b_head = b->head, b_end = b->end, a_end = a->end;
546   rtx del_first = NULL_RTX, del_last = NULL_RTX;
547   int b_empty = 0;
548   edge e;
549
550   /* If there was a CODE_LABEL beginning B, delete it.  */
551   if (GET_CODE (b_head) == CODE_LABEL)
552     {
553       /* Detect basic blocks with nothing but a label.  This can happen
554          in particular at the end of a function.  */
555       if (b_head == b_end)
556         b_empty = 1;
557
558       del_first = del_last = b_head;
559       b_head = NEXT_INSN (b_head);
560     }
561
562   /* Delete the basic block note and handle blocks containing just that
563      note.  */
564   if (NOTE_INSN_BASIC_BLOCK_P (b_head))
565     {
566       if (b_head == b_end)
567         b_empty = 1;
568       if (! del_last)
569         del_first = b_head;
570
571       del_last = b_head;
572       b_head = NEXT_INSN (b_head);
573     }
574
575   /* If there was a jump out of A, delete it.  */
576   if (GET_CODE (a_end) == JUMP_INSN)
577     {
578       rtx prev;
579
580       for (prev = PREV_INSN (a_end); ; prev = PREV_INSN (prev))
581         if (GET_CODE (prev) != NOTE
582             || NOTE_LINE_NUMBER (prev) == NOTE_INSN_BASIC_BLOCK
583             || prev == a->head)
584           break;
585
586       del_first = a_end;
587
588 #ifdef HAVE_cc0
589       /* If this was a conditional jump, we need to also delete
590          the insn that set cc0.  */
591       if (only_sets_cc0_p (prev))
592         {
593           rtx tmp = prev;
594
595           prev = prev_nonnote_insn (prev);
596           if (!prev)
597             prev = a->head;
598           del_first = tmp;
599         }
600 #endif
601
602       a_end = PREV_INSN (del_first);
603     }
604   else if (GET_CODE (NEXT_INSN (a_end)) == BARRIER)
605     del_first = NEXT_INSN (a_end);
606
607   /* Normally there should only be one successor of A and that is B, but
608      partway though the merge of blocks for conditional_execution we'll
609      be merging a TEST block with THEN and ELSE successors.  Free the
610      whole lot of them and hope the caller knows what they're doing.  */
611   while (a->succ)
612     remove_edge (a->succ);
613
614   /* Adjust the edges out of B for the new owner.  */
615   for (e = b->succ; e; e = e->succ_next)
616     e->src = a;
617   a->succ = b->succ;
618   a->flags |= b->flags;
619
620   /* B hasn't quite yet ceased to exist.  Attempt to prevent mishap.  */
621   b->pred = b->succ = NULL;
622   a->global_live_at_end = b->global_live_at_end;
623
624   expunge_block (b);
625
626   /* Delete everything marked above as well as crap that might be
627      hanging out between the two blocks.  */
628   delete_insn_chain (del_first, del_last);
629
630   /* Reassociate the insns of B with A.  */
631   if (!b_empty)
632     {
633       rtx x;
634
635       for (x = a_end; x != b_end; x = NEXT_INSN (x))
636         set_block_for_insn (x, a);
637
638       set_block_for_insn (b_end, a);
639
640       a_end = b_end;
641     }
642
643   a->end = a_end;
644 }
645 \f
646 /* Return the label in the head of basic block BLOCK.  Create one if it doesn't
647    exist.  */
648
649 rtx
650 block_label (block)
651      basic_block block;
652 {
653   if (block == EXIT_BLOCK_PTR)
654     return NULL_RTX;
655
656   if (GET_CODE (block->head) != CODE_LABEL)
657     {
658       block->head = emit_label_before (gen_label_rtx (), block->head);
659     }
660
661   return block->head;
662 }
663
664 /* Attempt to perform edge redirection by replacing possibly complex jump
665    instruction by unconditional jump or removing jump completely.  This can
666    apply only if all edges now point to the same block.  The parameters and
667    return values are equivalent to redirect_edge_and_branch.  */
668
669 static bool
670 try_redirect_by_replacing_jump (e, target)
671      edge e;
672      basic_block target;
673 {
674   basic_block src = e->src;
675   rtx insn = src->end, kill_from;
676   edge tmp;
677   rtx set, table;
678   int fallthru = 0;
679
680   /* Verify that all targets will be TARGET.  */
681   for (tmp = src->succ; tmp; tmp = tmp->succ_next)
682     if (tmp->dest != target && tmp != e)
683       break;
684
685   if (tmp || !onlyjump_p (insn))
686     return false;
687   if (reload_completed && JUMP_LABEL (insn)
688       && (table = NEXT_INSN (JUMP_LABEL (insn))) != NULL_RTX
689       && GET_CODE (table) == JUMP_INSN
690       && (GET_CODE (PATTERN (table)) == ADDR_VEC
691           || GET_CODE (PATTERN (table)) == ADDR_DIFF_VEC))
692     return false;
693
694   /* Avoid removing branch with side effects.  */
695   set = single_set (insn);
696   if (!set || side_effects_p (set))
697     return false;
698
699   /* In case we zap a conditional jump, we'll need to kill
700      the cc0 setter too.  */
701   kill_from = insn;
702 #ifdef HAVE_cc0
703   if (reg_mentioned_p (cc0_rtx, PATTERN (insn)))
704     kill_from = PREV_INSN (insn);
705 #endif
706
707   /* See if we can create the fallthru edge.  */
708   if (can_fallthru (src, target))
709     {
710       if (rtl_dump_file)
711         fprintf (rtl_dump_file, "Removing jump %i.\n", INSN_UID (insn));
712       fallthru = 1;
713
714       /* Selectively unlink whole insn chain.  */
715       delete_insn_chain (kill_from, PREV_INSN (target->head));
716     }
717
718   /* If this already is simplejump, redirect it.  */
719   else if (simplejump_p (insn))
720     {
721       if (e->dest == target)
722         return false;
723       if (rtl_dump_file)
724         fprintf (rtl_dump_file, "Redirecting jump %i from %i to %i.\n",
725                  INSN_UID (insn), e->dest->index, target->index);
726       if (!redirect_jump (insn, block_label (target), 0))
727         {
728           if (target == EXIT_BLOCK_PTR)
729             return false;
730           abort ();
731         }
732     }
733
734   /* Cannot do anything for target exit block.  */
735   else if (target == EXIT_BLOCK_PTR)
736     return false;
737
738   /* Or replace possibly complicated jump insn by simple jump insn.  */
739   else
740     {
741       rtx target_label = block_label (target);
742       rtx barrier, tmp;
743
744       emit_jump_insn_after (gen_jump (target_label), insn);
745       JUMP_LABEL (src->end) = target_label;
746       LABEL_NUSES (target_label)++;
747       if (rtl_dump_file)
748         fprintf (rtl_dump_file, "Replacing insn %i by jump %i\n",
749                  INSN_UID (insn), INSN_UID (src->end));
750
751
752       delete_insn_chain (kill_from, insn);
753
754       /* Recognize a tablejump that we are converting to a
755          simple jump and remove its associated CODE_LABEL
756          and ADDR_VEC or ADDR_DIFF_VEC.  */
757       if ((tmp = JUMP_LABEL (insn)) != NULL_RTX
758           && (tmp = NEXT_INSN (tmp)) != NULL_RTX
759           && GET_CODE (tmp) == JUMP_INSN
760           && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
761               || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
762         {
763           delete_insn_chain (JUMP_LABEL (insn), tmp);
764         }
765
766       barrier = next_nonnote_insn (src->end);
767       if (!barrier || GET_CODE (barrier) != BARRIER)
768         emit_barrier_after (src->end);
769     }
770
771   /* Keep only one edge out and set proper flags.  */
772   while (src->succ->succ_next)
773     remove_edge (src->succ);
774   e = src->succ;
775   if (fallthru)
776     e->flags = EDGE_FALLTHRU;
777   else
778     e->flags = 0;
779
780   e->probability = REG_BR_PROB_BASE;
781   e->count = src->count;
782
783   /* We don't want a block to end on a line-number note since that has
784      the potential of changing the code between -g and not -g.  */
785   while (GET_CODE (e->src->end) == NOTE
786          && NOTE_LINE_NUMBER (e->src->end) >= 0)
787     delete_insn (e->src->end);
788
789   if (e->dest != target)
790     redirect_edge_succ (e, target);
791
792   return true;
793 }
794
795 /* Return last loop_beg note appearing after INSN, before start of next
796    basic block.  Return INSN if there are no such notes.
797
798    When emitting jump to redirect a fallthru edge, it should always appear
799    after the LOOP_BEG notes, as loop optimizer expect loop to either start by
800    fallthru edge or jump following the LOOP_BEG note jumping to the loop exit
801    test.  */
802
803 static rtx
804 last_loop_beg_note (insn)
805      rtx insn;
806 {
807   rtx last = insn;
808
809   for (insn = NEXT_INSN (insn); insn && GET_CODE (insn) == NOTE
810        && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK;
811        insn = NEXT_INSN (insn))
812     if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
813       last = insn;
814
815   return last;
816 }
817
818 /* Attempt to change code to redirect edge E to TARGET.  Don't do that on
819    expense of adding new instructions or reordering basic blocks.
820
821    Function can be also called with edge destination equivalent to the TARGET.
822    Then it should try the simplifications and do nothing if none is possible.
823
824    Return true if transformation succeeded.  We still return false in case E
825    already destinated TARGET and we didn't managed to simplify instruction
826    stream.  */
827
828 bool
829 redirect_edge_and_branch (e, target)
830      edge e;
831      basic_block target;
832 {
833   rtx tmp;
834   rtx old_label = e->dest->head;
835   basic_block src = e->src;
836   rtx insn = src->end;
837
838   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
839     return false;
840
841   if (try_redirect_by_replacing_jump (e, target))
842     return true;
843
844   /* Do this fast path late, as we want above code to simplify for cases
845      where called on single edge leaving basic block containing nontrivial
846      jump insn.  */
847   else if (e->dest == target)
848     return false;
849
850   /* We can only redirect non-fallthru edges of jump insn.  */
851   if (e->flags & EDGE_FALLTHRU)
852     return false;
853   else if (GET_CODE (insn) != JUMP_INSN)
854     return false;
855
856   /* Recognize a tablejump and adjust all matching cases.  */
857   if ((tmp = JUMP_LABEL (insn)) != NULL_RTX
858       && (tmp = NEXT_INSN (tmp)) != NULL_RTX
859       && GET_CODE (tmp) == JUMP_INSN
860       && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
861           || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
862     {
863       rtvec vec;
864       int j;
865       rtx new_label = block_label (target);
866
867       if (target == EXIT_BLOCK_PTR)
868         return false;
869       if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
870         vec = XVEC (PATTERN (tmp), 0);
871       else
872         vec = XVEC (PATTERN (tmp), 1);
873
874       for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
875         if (XEXP (RTVEC_ELT (vec, j), 0) == old_label)
876           {
877             RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (Pmode, new_label);
878             --LABEL_NUSES (old_label);
879             ++LABEL_NUSES (new_label);
880           }
881
882       /* Handle casesi dispatch insns */
883       if ((tmp = single_set (insn)) != NULL
884           && SET_DEST (tmp) == pc_rtx
885           && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
886           && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF
887           && XEXP (XEXP (SET_SRC (tmp), 2), 0) == old_label)
888         {
889           XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (VOIDmode,
890                                                        new_label);
891           --LABEL_NUSES (old_label);
892           ++LABEL_NUSES (new_label);
893         }
894     }
895   else
896     {
897       /* ?? We may play the games with moving the named labels from
898          one basic block to the other in case only one computed_jump is
899          available.  */
900       if (computed_jump_p (insn)
901           /* A return instruction can't be redirected.  */
902           || returnjump_p (insn))
903         return false;
904
905       /* If the insn doesn't go where we think, we're confused.  */
906       if (JUMP_LABEL (insn) != old_label)
907         abort ();
908
909       /* If the substitution doesn't succeed, die.  This can happen
910          if the back end emitted unrecognizable instructions or if
911          target is exit block on some arches.  */
912       if (!redirect_jump (insn, block_label (target), 0))
913         {
914           if (target == EXIT_BLOCK_PTR)
915             return false;
916           abort ();
917         }
918     }
919
920   if (rtl_dump_file)
921     fprintf (rtl_dump_file, "Edge %i->%i redirected to %i\n",
922              e->src->index, e->dest->index, target->index);
923
924   if (e->dest != target)
925     redirect_edge_succ_nodup (e, target);
926
927   return true;
928 }
929
930 /* Like force_nonfallthru below, but additionally performs redirection
931    Used by redirect_edge_and_branch_force.  */
932
933 static basic_block
934 force_nonfallthru_and_redirect (e, target)
935      edge e;
936      basic_block target;
937 {
938   basic_block jump_block, new_bb = NULL, src = e->src;
939   rtx note;
940   edge new_edge;
941   int abnormal_edge_flags = 0;
942
943   if (e->flags & EDGE_ABNORMAL)
944     {
945       /* Irritating special case - fallthru edge to the same block as abnormal
946          edge.
947          We can't redirect abnormal edge, but we still can split the fallthru
948          one and create separate abnormal edge to original destination. 
949          This allows bb-reorder to make such edge non-fallthru.  */
950       if (e->dest != target)
951         abort ();
952       abnormal_edge_flags = e->flags & ~(EDGE_FALLTHRU | EDGE_CAN_FALLTHRU);
953       e->flags &= EDGE_FALLTHRU | EDGE_CAN_FALLTHRU;
954     }
955   else if (!(e->flags & EDGE_FALLTHRU))
956     abort ();
957   else if (e->src == ENTRY_BLOCK_PTR)
958     {
959       /* We can't redirect the entry block.  Create an empty block at the
960          start of the function which we use to add the new jump.  */
961       edge *pe1;
962       basic_block bb = create_basic_block (e->dest->head, NULL, ENTRY_BLOCK_PTR);
963
964       /* Change the existing edge's source to be the new block, and add
965          a new edge from the entry block to the new block.  */
966       e->src = bb;
967       for (pe1 = &ENTRY_BLOCK_PTR->succ; *pe1; pe1 = &(*pe1)->succ_next)
968         if (*pe1 == e)
969           {
970             *pe1 = e->succ_next;
971             break;
972           }
973       e->succ_next = 0;
974       bb->succ = e;
975       make_single_succ_edge (ENTRY_BLOCK_PTR, bb, EDGE_FALLTHRU);
976     }
977
978   if (e->src->succ->succ_next || abnormal_edge_flags)
979     {
980       /* Create the new structures.  */
981
982       /* Position the new block correctly relative to loop notes.  */
983       note = last_loop_beg_note (e->src->end);
984       note = NEXT_INSN (note);
985
986       /* ... and ADDR_VECs.  */
987       if (note != NULL
988           && GET_CODE (note) == CODE_LABEL
989           && NEXT_INSN (note)
990           && GET_CODE (NEXT_INSN (note)) == JUMP_INSN
991           && (GET_CODE (PATTERN (NEXT_INSN (note))) == ADDR_DIFF_VEC
992               || GET_CODE (PATTERN (NEXT_INSN (note))) == ADDR_VEC))
993         note = NEXT_INSN (NEXT_INSN (note));
994
995       jump_block = create_basic_block (note, NULL, e->src);
996       jump_block->count = e->count;
997       jump_block->frequency = EDGE_FREQUENCY (e);
998       jump_block->loop_depth = target->loop_depth;
999
1000       if (target->global_live_at_start)
1001         {
1002           jump_block->global_live_at_start
1003             = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1004           jump_block->global_live_at_end
1005             = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1006           COPY_REG_SET (jump_block->global_live_at_start,
1007                         target->global_live_at_start);
1008           COPY_REG_SET (jump_block->global_live_at_end,
1009                         target->global_live_at_start);
1010         }
1011
1012       /* Wire edge in.  */
1013       new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
1014       new_edge->probability = e->probability;
1015       new_edge->count = e->count;
1016
1017       /* Redirect old edge.  */
1018       redirect_edge_pred (e, jump_block);
1019       e->probability = REG_BR_PROB_BASE;
1020
1021       new_bb = jump_block;
1022     }
1023   else
1024     jump_block = e->src;
1025
1026   e->flags &= ~EDGE_FALLTHRU;
1027   if (target == EXIT_BLOCK_PTR)
1028     {
1029       if (HAVE_return)
1030         emit_jump_insn_after (gen_return (), jump_block->end);
1031       else
1032         abort ();
1033     }
1034   else
1035     {
1036       rtx label = block_label (target);
1037       emit_jump_insn_after (gen_jump (label), jump_block->end);
1038       JUMP_LABEL (jump_block->end) = label;
1039       LABEL_NUSES (label)++;
1040     }
1041
1042   emit_barrier_after (jump_block->end);
1043   redirect_edge_succ_nodup (e, target);
1044
1045   if (abnormal_edge_flags)
1046     make_edge (src, target, abnormal_edge_flags);
1047
1048   return new_bb;
1049 }
1050
1051 /* Edge E is assumed to be fallthru edge.  Emit needed jump instruction
1052    (and possibly create new basic block) to make edge non-fallthru.
1053    Return newly created BB or NULL if none.  */
1054
1055 basic_block
1056 force_nonfallthru (e)
1057      edge e;
1058 {
1059   return force_nonfallthru_and_redirect (e, e->dest);
1060 }
1061
1062 /* Redirect edge even at the expense of creating new jump insn or
1063    basic block.  Return new basic block if created, NULL otherwise.
1064    Abort if conversion is impossible.  */
1065
1066 basic_block
1067 redirect_edge_and_branch_force (e, target)
1068      edge e;
1069      basic_block target;
1070 {
1071   if (redirect_edge_and_branch (e, target)
1072       || e->dest == target)
1073     return NULL;
1074
1075   /* In case the edge redirection failed, try to force it to be non-fallthru
1076      and redirect newly created simplejump.  */
1077   return force_nonfallthru_and_redirect (e, target);
1078 }
1079
1080 /* The given edge should potentially be a fallthru edge.  If that is in
1081    fact true, delete the jump and barriers that are in the way.  */
1082
1083 void
1084 tidy_fallthru_edge (e, b, c)
1085      edge e;
1086      basic_block b, c;
1087 {
1088   rtx q;
1089
1090   /* ??? In a late-running flow pass, other folks may have deleted basic
1091      blocks by nopping out blocks, leaving multiple BARRIERs between here
1092      and the target label. They ought to be chastized and fixed.
1093
1094      We can also wind up with a sequence of undeletable labels between
1095      one block and the next.
1096
1097      So search through a sequence of barriers, labels, and notes for
1098      the head of block C and assert that we really do fall through.  */
1099
1100   for (q = NEXT_INSN (b->end); q != c->head; q = NEXT_INSN (q))
1101     if (INSN_P (q))
1102       return;
1103
1104   /* Remove what will soon cease being the jump insn from the source block.
1105      If block B consisted only of this single jump, turn it into a deleted
1106      note.  */
1107   q = b->end;
1108   if (GET_CODE (q) == JUMP_INSN
1109       && onlyjump_p (q)
1110       && (any_uncondjump_p (q)
1111           || (b->succ == e && e->succ_next == NULL)))
1112     {
1113 #ifdef HAVE_cc0
1114       /* If this was a conditional jump, we need to also delete
1115          the insn that set cc0.  */
1116       if (any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1117         q = PREV_INSN (q);
1118 #endif
1119
1120       q = PREV_INSN (q);
1121
1122       /* We don't want a block to end on a line-number note since that has
1123          the potential of changing the code between -g and not -g.  */
1124       while (GET_CODE (q) == NOTE && NOTE_LINE_NUMBER (q) >= 0)
1125         q = PREV_INSN (q);
1126     }
1127
1128   /* Selectively unlink the sequence.  */
1129   if (q != PREV_INSN (c->head))
1130     delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
1131
1132   e->flags |= EDGE_FALLTHRU;
1133 }
1134
1135 /* Fix up edges that now fall through, or rather should now fall through
1136    but previously required a jump around now deleted blocks.  Simplify
1137    the search by only examining blocks numerically adjacent, since this
1138    is how find_basic_blocks created them.  */
1139
1140 void
1141 tidy_fallthru_edges ()
1142 {
1143   basic_block b, c;
1144
1145   if (ENTRY_BLOCK_PTR->next_bb == EXIT_BLOCK_PTR)
1146     return;
1147
1148   FOR_BB_BETWEEN (b, ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR->prev_bb, next_bb)
1149     {
1150       edge s;
1151
1152       c = b->next_bb;
1153
1154       /* We care about simple conditional or unconditional jumps with
1155          a single successor.
1156
1157          If we had a conditional branch to the next instruction when
1158          find_basic_blocks was called, then there will only be one
1159          out edge for the block which ended with the conditional
1160          branch (since we do not create duplicate edges).
1161
1162          Furthermore, the edge will be marked as a fallthru because we
1163          merge the flags for the duplicate edges.  So we do not want to
1164          check that the edge is not a FALLTHRU edge.  */
1165
1166       if ((s = b->succ) != NULL
1167           && ! (s->flags & EDGE_COMPLEX)
1168           && s->succ_next == NULL
1169           && s->dest == c
1170           /* If the jump insn has side effects, we can't tidy the edge.  */
1171           && (GET_CODE (b->end) != JUMP_INSN
1172               || onlyjump_p (b->end)))
1173         tidy_fallthru_edge (s, b, c);
1174     }
1175 }
1176 \f
1177 /* Helper function for split_edge.  Return true in case edge BB2 to BB1
1178    is back edge of syntactic loop.  */
1179
1180 static bool
1181 back_edge_of_syntactic_loop_p (bb1, bb2)
1182         basic_block bb1, bb2;
1183 {
1184   rtx insn;
1185   int count = 0;
1186   basic_block bb;
1187
1188   if (bb1 == bb2)
1189     return true;
1190
1191   /* ??? Could we guarantee that bb indices are monotone, so that we could
1192      just compare them?  */
1193   for (bb = bb1; bb && bb != bb2; bb = bb->next_bb)
1194     continue;
1195
1196   if (!bb)
1197     return false;
1198
1199   for (insn = bb1->end; insn != bb2->head && count >= 0;
1200        insn = NEXT_INSN (insn))
1201     if (GET_CODE (insn) == NOTE)
1202       {
1203         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1204           count++;
1205         else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
1206           count--;
1207       }
1208
1209   return count >= 0;
1210 }
1211
1212 /* Split a (typically critical) edge.  Return the new block.
1213    Abort on abnormal edges.
1214
1215    ??? The code generally expects to be called on critical edges.
1216    The case of a block ending in an unconditional jump to a
1217    block with multiple predecessors is not handled optimally.  */
1218
1219 basic_block
1220 split_edge (edge_in)
1221      edge edge_in;
1222 {
1223   basic_block bb;
1224   rtx before;
1225
1226   /* Abnormal edges cannot be split.  */
1227   if ((edge_in->flags & EDGE_ABNORMAL) != 0)
1228     abort ();
1229
1230   /* We are going to place the new block in front of edge destination.
1231      Avoid existence of fallthru predecessors.  */
1232   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1233     {
1234       edge e;
1235
1236       for (e = edge_in->dest->pred; e; e = e->pred_next)
1237         if (e->flags & EDGE_FALLTHRU)
1238           break;
1239
1240       if (e)
1241         force_nonfallthru (e);
1242     }
1243
1244   /* Create the basic block note.
1245
1246      Where we place the note can have a noticeable impact on the generated
1247      code.  Consider this cfg:
1248
1249                         E
1250                         |
1251                         0
1252                        / \
1253                    +->1-->2--->E
1254                    |  |
1255                    +--+
1256
1257       If we need to insert an insn on the edge from block 0 to block 1,
1258       we want to ensure the instructions we insert are outside of any
1259       loop notes that physically sit between block 0 and block 1.  Otherwise
1260       we confuse the loop optimizer into thinking the loop is a phony.  */
1261
1262   if (edge_in->dest != EXIT_BLOCK_PTR
1263       && PREV_INSN (edge_in->dest->head)
1264       && GET_CODE (PREV_INSN (edge_in->dest->head)) == NOTE
1265       && (NOTE_LINE_NUMBER (PREV_INSN (edge_in->dest->head))
1266           == NOTE_INSN_LOOP_BEG)
1267       && !back_edge_of_syntactic_loop_p (edge_in->dest, edge_in->src))
1268     before = PREV_INSN (edge_in->dest->head);
1269   else if (edge_in->dest != EXIT_BLOCK_PTR)
1270     before = edge_in->dest->head;
1271   else
1272     before = NULL_RTX;
1273
1274   bb = create_basic_block (before, NULL, edge_in->dest->prev_bb);
1275   bb->count = edge_in->count;
1276   bb->frequency = EDGE_FREQUENCY (edge_in);
1277
1278   /* ??? This info is likely going to be out of date very soon.  */
1279   if (edge_in->dest->global_live_at_start)
1280     {
1281       bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1282       bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1283       COPY_REG_SET (bb->global_live_at_start,
1284                     edge_in->dest->global_live_at_start);
1285       COPY_REG_SET (bb->global_live_at_end,
1286                     edge_in->dest->global_live_at_start);
1287     }
1288
1289   make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
1290
1291   /* For non-fallthry edges, we must adjust the predecessor's
1292      jump instruction to target our new block.  */
1293   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1294     {
1295       if (!redirect_edge_and_branch (edge_in, bb))
1296         abort ();
1297     }
1298   else
1299     redirect_edge_succ (edge_in, bb);
1300
1301   return bb;
1302 }
1303
1304 /* Queue instructions for insertion on an edge between two basic blocks.
1305    The new instructions and basic blocks (if any) will not appear in the
1306    CFG until commit_edge_insertions is called.  */
1307
1308 void
1309 insert_insn_on_edge (pattern, e)
1310      rtx pattern;
1311      edge e;
1312 {
1313   /* We cannot insert instructions on an abnormal critical edge.
1314      It will be easier to find the culprit if we die now.  */
1315   if ((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
1316     abort ();
1317
1318   if (e->insns == NULL_RTX)
1319     start_sequence ();
1320   else
1321     push_to_sequence (e->insns);
1322
1323   emit_insn (pattern);
1324
1325   e->insns = get_insns ();
1326   end_sequence ();
1327 }
1328
1329 /* Update the CFG for the instructions queued on edge E.  */
1330
1331 static void
1332 commit_one_edge_insertion (e, watch_calls)
1333      edge e;
1334      int watch_calls;
1335 {
1336   rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1337   basic_block bb = NULL;
1338
1339   /* Pull the insns off the edge now since the edge might go away.  */
1340   insns = e->insns;
1341   e->insns = NULL_RTX;
1342
1343   /* Special case -- avoid inserting code between call and storing
1344      its return value.  */
1345   if (watch_calls && (e->flags & EDGE_FALLTHRU) && !e->dest->pred->pred_next
1346       && e->src != ENTRY_BLOCK_PTR
1347       && GET_CODE (e->src->end) == CALL_INSN)
1348     {
1349       rtx next = next_nonnote_insn (e->src->end);
1350
1351       after = e->dest->head;
1352       /* The first insn after the call may be a stack pop, skip it.  */
1353       while (next
1354              && keep_with_call_p (next))
1355         {
1356           after = next;
1357           next = next_nonnote_insn (next);
1358         }
1359       bb = e->dest;
1360     }
1361   if (!before && !after)
1362     {
1363       /* Figure out where to put these things.  If the destination has
1364          one predecessor, insert there.  Except for the exit block.  */
1365       if (e->dest->pred->pred_next == NULL && e->dest != EXIT_BLOCK_PTR)
1366         {
1367           bb = e->dest;
1368
1369           /* Get the location correct wrt a code label, and "nice" wrt
1370              a basic block note, and before everything else.  */
1371           tmp = bb->head;
1372           if (GET_CODE (tmp) == CODE_LABEL)
1373             tmp = NEXT_INSN (tmp);
1374           if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1375             tmp = NEXT_INSN (tmp);
1376           if (tmp == bb->head)
1377             before = tmp;
1378           else if (tmp)
1379             after = PREV_INSN (tmp);
1380           else
1381             after = get_last_insn ();
1382         }
1383
1384       /* If the source has one successor and the edge is not abnormal,
1385          insert there.  Except for the entry block.  */
1386       else if ((e->flags & EDGE_ABNORMAL) == 0
1387                && e->src->succ->succ_next == NULL
1388                && e->src != ENTRY_BLOCK_PTR)
1389         {
1390           bb = e->src;
1391
1392           /* It is possible to have a non-simple jump here.  Consider a target
1393              where some forms of unconditional jumps clobber a register.  This
1394              happens on the fr30 for example.
1395
1396              We know this block has a single successor, so we can just emit
1397              the queued insns before the jump.  */
1398           if (GET_CODE (bb->end) == JUMP_INSN)
1399             for (before = bb->end;
1400                  GET_CODE (PREV_INSN (before)) == NOTE
1401                  && NOTE_LINE_NUMBER (PREV_INSN (before)) ==
1402                  NOTE_INSN_LOOP_BEG; before = PREV_INSN (before))
1403               ;
1404           else
1405             {
1406               /* We'd better be fallthru, or we've lost track of what's what.  */
1407               if ((e->flags & EDGE_FALLTHRU) == 0)
1408                 abort ();
1409
1410               after = bb->end;
1411             }
1412         }
1413       /* Otherwise we must split the edge.  */
1414       else
1415         {
1416           bb = split_edge (e);
1417           after = bb->end;
1418         }
1419     }
1420
1421   /* Now that we've found the spot, do the insertion.  */
1422
1423   if (before)
1424     {
1425       emit_insn_before (insns, before);
1426       last = prev_nonnote_insn (before);
1427     }
1428   else
1429     last = emit_insn_after (insns, after);
1430
1431   if (returnjump_p (last))
1432     {
1433       /* ??? Remove all outgoing edges from BB and add one for EXIT.
1434          This is not currently a problem because this only happens
1435          for the (single) epilogue, which already has a fallthru edge
1436          to EXIT.  */
1437
1438       e = bb->succ;
1439       if (e->dest != EXIT_BLOCK_PTR
1440           || e->succ_next != NULL || (e->flags & EDGE_FALLTHRU) == 0)
1441         abort ();
1442
1443       e->flags &= ~EDGE_FALLTHRU;
1444       emit_barrier_after (last);
1445
1446       if (before)
1447         delete_insn (before);
1448     }
1449   else if (GET_CODE (last) == JUMP_INSN)
1450     abort ();
1451
1452   /* Mark the basic block for find_sub_basic_blocks.  */
1453   bb->aux = &bb->aux;
1454 }
1455
1456 /* Update the CFG for all queued instructions.  */
1457
1458 void
1459 commit_edge_insertions ()
1460 {
1461   basic_block bb;
1462   sbitmap blocks;
1463   bool changed = false;
1464
1465 #ifdef ENABLE_CHECKING
1466   verify_flow_info ();
1467 #endif
1468
1469   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
1470     {
1471       edge e, next;
1472
1473       for (e = bb->succ; e; e = next)
1474         {
1475           next = e->succ_next;
1476           if (e->insns)
1477             {
1478                changed = true;
1479                commit_one_edge_insertion (e, false);
1480             }
1481         }
1482     }
1483
1484   if (!changed)
1485     return;
1486
1487   blocks = sbitmap_alloc (last_basic_block);
1488   sbitmap_zero (blocks);
1489   FOR_EACH_BB (bb)
1490     if (bb->aux)
1491       {
1492         SET_BIT (blocks, bb->index);
1493         /* Check for forgotten bb->aux values before commit_edge_insertions
1494            call.  */
1495         if (bb->aux != &bb->aux)
1496           abort ();
1497         bb->aux = NULL;
1498       }
1499   find_many_sub_basic_blocks (blocks);
1500   sbitmap_free (blocks);
1501 }
1502 \f
1503 /* Update the CFG for all queued instructions, taking special care of inserting
1504    code on edges between call and storing its return value.  */
1505
1506 void
1507 commit_edge_insertions_watch_calls ()
1508 {
1509   basic_block bb;
1510   sbitmap blocks;
1511   bool changed = false;
1512
1513 #ifdef ENABLE_CHECKING
1514   verify_flow_info ();
1515 #endif
1516
1517   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
1518     {
1519       edge e, next;
1520
1521       for (e = bb->succ; e; e = next)
1522         {
1523           next = e->succ_next;
1524           if (e->insns)
1525             {
1526               changed = true;
1527               commit_one_edge_insertion (e, true);
1528             }
1529         }
1530     }
1531
1532   if (!changed)
1533     return;
1534
1535   blocks = sbitmap_alloc (last_basic_block);
1536   sbitmap_zero (blocks);
1537   FOR_EACH_BB (bb)
1538     if (bb->aux)
1539       {
1540         SET_BIT (blocks, bb->index);
1541         /* Check for forgotten bb->aux values before commit_edge_insertions
1542            call.  */
1543         if (bb->aux != &bb->aux)
1544           abort ();
1545         bb->aux = NULL;
1546       }
1547   find_many_sub_basic_blocks (blocks);
1548   sbitmap_free (blocks);
1549 }
1550 \f
1551 /* Print out one basic block with live information at start and end.  */
1552
1553 void
1554 dump_bb (bb, outf)
1555      basic_block bb;
1556      FILE *outf;
1557 {
1558   rtx insn;
1559   rtx last;
1560   edge e;
1561
1562   fprintf (outf, ";; Basic block %d, loop depth %d, count ",
1563            bb->index, bb->loop_depth);
1564   fprintf (outf, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) bb->count);
1565   putc ('\n', outf);
1566
1567   fputs (";; Predecessors: ", outf);
1568   for (e = bb->pred; e; e = e->pred_next)
1569     dump_edge_info (outf, e, 0);
1570   putc ('\n', outf);
1571
1572   fputs (";; Registers live at start:", outf);
1573   dump_regset (bb->global_live_at_start, outf);
1574   putc ('\n', outf);
1575
1576   for (insn = bb->head, last = NEXT_INSN (bb->end); insn != last;
1577        insn = NEXT_INSN (insn))
1578     print_rtl_single (outf, insn);
1579
1580   fputs (";; Registers live at end:", outf);
1581   dump_regset (bb->global_live_at_end, outf);
1582   putc ('\n', outf);
1583
1584   fputs (";; Successors: ", outf);
1585   for (e = bb->succ; e; e = e->succ_next)
1586     dump_edge_info (outf, e, 1);
1587   putc ('\n', outf);
1588 }
1589
1590 void
1591 debug_bb (bb)
1592      basic_block bb;
1593 {
1594   dump_bb (bb, stderr);
1595 }
1596
1597 void
1598 debug_bb_n (n)
1599      int n;
1600 {
1601   dump_bb (BASIC_BLOCK (n), stderr);
1602 }
1603 \f
1604 /* Like print_rtl, but also print out live information for the start of each
1605    basic block.  */
1606
1607 void
1608 print_rtl_with_bb (outf, rtx_first)
1609      FILE *outf;
1610      rtx rtx_first;
1611 {
1612   rtx tmp_rtx;
1613
1614   if (rtx_first == 0)
1615     fprintf (outf, "(nil)\n");
1616   else
1617     {
1618       enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
1619       int max_uid = get_max_uid ();
1620       basic_block *start
1621         = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1622       basic_block *end
1623         = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1624       enum bb_state *in_bb_p
1625         = (enum bb_state *) xcalloc (max_uid, sizeof (enum bb_state));
1626
1627       basic_block bb;
1628
1629       FOR_EACH_BB_REVERSE (bb)
1630         {
1631           rtx x;
1632
1633           start[INSN_UID (bb->head)] = bb;
1634           end[INSN_UID (bb->end)] = bb;
1635           for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x))
1636             {
1637               enum bb_state state = IN_MULTIPLE_BB;
1638
1639               if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1640                 state = IN_ONE_BB;
1641               in_bb_p[INSN_UID (x)] = state;
1642
1643               if (x == bb->end)
1644                 break;
1645             }
1646         }
1647
1648       for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1649         {
1650           int did_output;
1651
1652           if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
1653             {
1654               fprintf (outf, ";; Start of basic block %d, registers live:",
1655                        bb->index);
1656               dump_regset (bb->global_live_at_start, outf);
1657               putc ('\n', outf);
1658             }
1659
1660           if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1661               && GET_CODE (tmp_rtx) != NOTE
1662               && GET_CODE (tmp_rtx) != BARRIER)
1663             fprintf (outf, ";; Insn is not within a basic block\n");
1664           else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1665             fprintf (outf, ";; Insn is in multiple basic blocks\n");
1666
1667           did_output = print_rtl_single (outf, tmp_rtx);
1668
1669           if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
1670             {
1671               fprintf (outf, ";; End of basic block %d, registers live:\n",
1672                        bb->index);
1673               dump_regset (bb->global_live_at_end, outf);
1674               putc ('\n', outf);
1675             }
1676
1677           if (did_output)
1678             putc ('\n', outf);
1679         }
1680
1681       free (start);
1682       free (end);
1683       free (in_bb_p);
1684     }
1685
1686   if (current_function_epilogue_delay_list != 0)
1687     {
1688       fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1689       for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
1690            tmp_rtx = XEXP (tmp_rtx, 1))
1691         print_rtl_single (outf, XEXP (tmp_rtx, 0));
1692     }
1693 }
1694 \f
1695 void
1696 update_br_prob_note (bb)
1697      basic_block bb;
1698 {
1699   rtx note;
1700   if (GET_CODE (bb->end) != JUMP_INSN)
1701     return;
1702   note = find_reg_note (bb->end, REG_BR_PROB, NULL_RTX);
1703   if (!note || INTVAL (XEXP (note, 0)) == BRANCH_EDGE (bb)->probability)
1704     return;
1705   XEXP (note, 0) = GEN_INT (BRANCH_EDGE (bb)->probability);
1706 }
1707 \f
1708 /* Verify the CFG consistency.  This function check some CFG invariants and
1709    aborts when something is wrong.  Hope that this function will help to
1710    convert many optimization passes to preserve CFG consistent.
1711
1712    Currently it does following checks:
1713
1714    - test head/end pointers
1715    - overlapping of basic blocks
1716    - edge list correctness
1717    - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
1718    - tails of basic blocks (ensure that boundary is necessary)
1719    - scans body of the basic block for JUMP_INSN, CODE_LABEL
1720      and NOTE_INSN_BASIC_BLOCK
1721    - check that all insns are in the basic blocks
1722      (except the switch handling code, barriers and notes)
1723    - check that all returns are followed by barriers
1724
1725    In future it can be extended check a lot of other stuff as well
1726    (reachability of basic blocks, life information, etc. etc.).  */
1727
1728 void
1729 verify_flow_info ()
1730 {
1731   const int max_uid = get_max_uid ();
1732   const rtx rtx_first = get_insns ();
1733   rtx last_head = get_last_insn ();
1734   basic_block *bb_info, *last_visited;
1735   size_t *edge_checksum;
1736   rtx x;
1737   int num_bb_notes, err = 0;
1738   basic_block bb, last_bb_seen;
1739
1740   bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1741   last_visited = (basic_block *) xcalloc (last_basic_block + 2,
1742                                           sizeof (basic_block));
1743   edge_checksum = (size_t *) xcalloc (last_basic_block + 2, sizeof (size_t));
1744
1745   /* Check bb chain & numbers.  */
1746   last_bb_seen = ENTRY_BLOCK_PTR;
1747   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb, NULL, next_bb)
1748     {
1749       if (bb != EXIT_BLOCK_PTR
1750           && bb != BASIC_BLOCK (bb->index))
1751         {
1752           error ("bb %d on wrong place", bb->index);
1753           err = 1;
1754         }
1755
1756       if (bb->prev_bb != last_bb_seen)
1757         {
1758           error ("prev_bb of %d should be %d, not %d",
1759                  bb->index, last_bb_seen->index, bb->prev_bb->index);
1760           err = 1;
1761         }
1762
1763       last_bb_seen = bb;
1764     }
1765
1766   FOR_EACH_BB_REVERSE (bb)
1767     {
1768       rtx head = bb->head;
1769       rtx end = bb->end;
1770
1771       /* Verify the end of the basic block is in the INSN chain.  */
1772       for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
1773         if (x == end)
1774           break;
1775
1776       if (!x)
1777         {
1778           error ("end insn %d for block %d not found in the insn stream",
1779                  INSN_UID (end), bb->index);
1780           err = 1;
1781         }
1782
1783       /* Work backwards from the end to the head of the basic block
1784          to verify the head is in the RTL chain.  */
1785       for (; x != NULL_RTX; x = PREV_INSN (x))
1786         {
1787           /* While walking over the insn chain, verify insns appear
1788              in only one basic block and initialize the BB_INFO array
1789              used by other passes.  */
1790           if (bb_info[INSN_UID (x)] != NULL)
1791             {
1792               error ("insn %d is in multiple basic blocks (%d and %d)",
1793                      INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
1794               err = 1;
1795             }
1796
1797           bb_info[INSN_UID (x)] = bb;
1798
1799           if (x == head)
1800             break;
1801         }
1802       if (!x)
1803         {
1804           error ("head insn %d for block %d not found in the insn stream",
1805                  INSN_UID (head), bb->index);
1806           err = 1;
1807         }
1808
1809       last_head = x;
1810     }
1811
1812   /* Now check the basic blocks (boundaries etc.) */
1813   FOR_EACH_BB_REVERSE (bb)
1814     {
1815       int n_fallthru = 0, n_eh = 0, n_call = 0, n_abnormal = 0, n_branch = 0;
1816       edge e;
1817       rtx note;
1818
1819       if (INSN_P (bb->end)
1820           && (note = find_reg_note (bb->end, REG_BR_PROB, NULL_RTX))
1821           && bb->succ && bb->succ->succ_next
1822           && any_condjump_p (bb->end))
1823         {
1824           if (INTVAL (XEXP (note, 0)) != BRANCH_EDGE (bb)->probability)
1825             {
1826               error ("verify_flow_info: REG_BR_PROB does not match cfg %i %i",
1827                      INTVAL (XEXP (note, 0)), BRANCH_EDGE (bb)->probability);
1828               err = 1;
1829             }
1830         }
1831       if (bb->count < 0)
1832         {
1833           error ("verify_flow_info: Wrong count of block %i %i",
1834                  bb->index, (int)bb->count);
1835           err = 1;
1836         }
1837       if (bb->frequency < 0)
1838         {
1839           error ("verify_flow_info: Wrong frequency of block %i %i",
1840                  bb->index, bb->frequency);
1841           err = 1;
1842         }
1843       for (e = bb->succ; e; e = e->succ_next)
1844         {
1845           if (last_visited [e->dest->index + 2] == bb)
1846             {
1847               error ("verify_flow_info: Duplicate edge %i->%i",
1848                      e->src->index, e->dest->index);
1849               err = 1;
1850             }
1851           if (e->probability < 0 || e->probability > REG_BR_PROB_BASE)
1852             {
1853               error ("verify_flow_info: Wrong probability of edge %i->%i %i",
1854                      e->src->index, e->dest->index, e->probability);
1855               err = 1;
1856             }
1857           if (e->count < 0)
1858             {
1859               error ("verify_flow_info: Wrong count of edge %i->%i %i",
1860                      e->src->index, e->dest->index, (int)e->count);
1861               err = 1;
1862             }
1863
1864           last_visited [e->dest->index + 2] = bb;
1865
1866           if (e->flags & EDGE_FALLTHRU)
1867             n_fallthru++;
1868
1869           if ((e->flags & ~(EDGE_DFS_BACK | EDGE_CAN_FALLTHRU)) == 0)
1870             n_branch++;
1871
1872           if (e->flags & EDGE_ABNORMAL_CALL)
1873             n_call++;
1874
1875           if (e->flags & EDGE_EH)
1876             n_eh++;
1877           else if (e->flags & EDGE_ABNORMAL)
1878             n_abnormal++;
1879
1880           if ((e->flags & EDGE_FALLTHRU)
1881               && e->src != ENTRY_BLOCK_PTR
1882               && e->dest != EXIT_BLOCK_PTR)
1883             {
1884               rtx insn;
1885
1886               if (e->src->next_bb != e->dest)
1887                 {
1888                   error
1889                     ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
1890                      e->src->index, e->dest->index);
1891                   err = 1;
1892                 }
1893               else
1894                 for (insn = NEXT_INSN (e->src->end); insn != e->dest->head;
1895                      insn = NEXT_INSN (insn))
1896                   if (GET_CODE (insn) == BARRIER
1897 #ifndef CASE_DROPS_THROUGH
1898                       || INSN_P (insn)
1899 #else
1900                       || (INSN_P (insn) && ! JUMP_TABLE_DATA_P (insn))
1901 #endif
1902                       )
1903                     {
1904                       error ("verify_flow_info: Incorrect fallthru %i->%i",
1905                              e->src->index, e->dest->index);
1906                       fatal_insn ("wrong insn in the fallthru edge", insn);
1907                       err = 1;
1908                     }
1909             }
1910
1911           if (e->src != bb)
1912             {
1913               error ("verify_flow_info: Basic block %d succ edge is corrupted",
1914                      bb->index);
1915               fprintf (stderr, "Predecessor: ");
1916               dump_edge_info (stderr, e, 0);
1917               fprintf (stderr, "\nSuccessor: ");
1918               dump_edge_info (stderr, e, 1);
1919               fprintf (stderr, "\n");
1920               err = 1;
1921             }
1922
1923           edge_checksum[e->dest->index + 2] += (size_t) e;
1924         }
1925
1926       if (n_eh && GET_CODE (PATTERN (bb->end)) != RESX
1927           && !find_reg_note (bb->end, REG_EH_REGION, NULL_RTX))
1928         {
1929           error ("Missing REG_EH_REGION note in the end of bb %i", bb->index);
1930           err = 1;
1931         }
1932       if (n_branch
1933           && (GET_CODE (bb->end) != JUMP_INSN
1934               || (n_branch > 1 && (any_uncondjump_p (bb->end)
1935                                    || any_condjump_p (bb->end)))))
1936         {
1937           error ("Too many outgoing branch edges from bb %i", bb->index);
1938           err = 1;
1939         }
1940       if (n_fallthru && any_uncondjump_p (bb->end))
1941         {
1942           error ("Fallthru edge after unconditional jump %i", bb->index);
1943           err = 1;
1944         }
1945       if (n_branch != 1 && any_uncondjump_p (bb->end))
1946         {
1947           error ("Wrong amount of branch edges after unconditional jump %i", bb->index);
1948           err = 1;
1949         }
1950       if (n_branch != 1 && any_condjump_p (bb->end)
1951           && JUMP_LABEL (bb->end) != bb->next_bb->head)
1952         {
1953           error ("Wrong amount of branch edges after conditional jump %i", bb->index);
1954           err = 1;
1955         }
1956       if (n_call && GET_CODE (bb->end) != CALL_INSN)
1957         {
1958           error ("Call edges for non-call insn in bb %i", bb->index);
1959           err = 1;
1960         }
1961       if (n_abnormal
1962           && (GET_CODE (bb->end) != CALL_INSN && n_call != n_abnormal)
1963           && (GET_CODE (bb->end) != JUMP_INSN
1964               || any_condjump_p (bb->end)
1965               || any_uncondjump_p (bb->end)))
1966         {
1967           error ("Abnormal edges for no purpose in bb %i", bb->index);
1968           err = 1;
1969         }
1970
1971       if (!n_fallthru)
1972         {
1973           rtx insn;
1974
1975           /* Ensure existence of barrier in BB with no fallthru edges.  */
1976           for (insn = bb->end; !insn || GET_CODE (insn) != BARRIER;
1977                insn = NEXT_INSN (insn))
1978             if (!insn
1979                 || (GET_CODE (insn) == NOTE
1980                     && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK))
1981                 {
1982                   error ("missing barrier after block %i", bb->index);
1983                   err = 1;
1984                   break;
1985                 }
1986         }
1987
1988       for (e = bb->pred; e; e = e->pred_next)
1989         {
1990           if (e->dest != bb)
1991             {
1992               error ("basic block %d pred edge is corrupted", bb->index);
1993               fputs ("Predecessor: ", stderr);
1994               dump_edge_info (stderr, e, 0);
1995               fputs ("\nSuccessor: ", stderr);
1996               dump_edge_info (stderr, e, 1);
1997               fputc ('\n', stderr);
1998               err = 1;
1999             }
2000           edge_checksum[e->dest->index + 2] -= (size_t) e;
2001         }
2002
2003       for (x = bb->head; x != NEXT_INSN (bb->end); x = NEXT_INSN (x))
2004         if (BLOCK_FOR_INSN (x) != bb)
2005           {
2006             debug_rtx (x);
2007             if (! BLOCK_FOR_INSN (x))
2008               error
2009                 ("insn %d inside basic block %d but block_for_insn is NULL",
2010                  INSN_UID (x), bb->index);
2011             else
2012               error
2013                 ("insn %d inside basic block %d but block_for_insn is %i",
2014                  INSN_UID (x), bb->index, BLOCK_FOR_INSN (x)->index);
2015
2016             err = 1;
2017           }
2018
2019       /* OK pointers are correct.  Now check the header of basic
2020          block.  It ought to contain optional CODE_LABEL followed
2021          by NOTE_BASIC_BLOCK.  */
2022       x = bb->head;
2023       if (GET_CODE (x) == CODE_LABEL)
2024         {
2025           if (bb->end == x)
2026             {
2027               error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2028                      bb->index);
2029               err = 1;
2030             }
2031
2032           x = NEXT_INSN (x);
2033         }
2034
2035       if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
2036         {
2037           error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2038                  bb->index);
2039           err = 1;
2040         }
2041
2042       if (bb->end == x)
2043         /* Do checks for empty blocks her. e */
2044         ;
2045       else
2046         for (x = NEXT_INSN (x); x; x = NEXT_INSN (x))
2047           {
2048             if (NOTE_INSN_BASIC_BLOCK_P (x))
2049               {
2050                 error ("NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d",
2051                        INSN_UID (x), bb->index);
2052                 err = 1;
2053               }
2054
2055             if (x == bb->end)
2056               break;
2057
2058             if (control_flow_insn_p (x))
2059               {
2060                 error ("in basic block %d:", bb->index);
2061                 fatal_insn ("flow control insn inside a basic block", x);
2062               }
2063           }
2064     }
2065
2066   /* Complete edge checksumming for ENTRY and EXIT.  */
2067   {
2068     edge e;
2069
2070     for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2071       edge_checksum[e->dest->index + 2] += (size_t) e;
2072
2073     for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
2074       edge_checksum[e->dest->index + 2] -= (size_t) e;
2075   }
2076
2077   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
2078     if (edge_checksum[bb->index + 2])
2079       {
2080         error ("basic block %i edge lists are corrupted", bb->index);
2081         err = 1;
2082       }
2083
2084   num_bb_notes = 0;
2085   last_bb_seen = ENTRY_BLOCK_PTR;
2086
2087   for (x = rtx_first; x; x = NEXT_INSN (x))
2088     {
2089       if (NOTE_INSN_BASIC_BLOCK_P (x))
2090         {
2091           bb = NOTE_BASIC_BLOCK (x);
2092
2093           num_bb_notes++;
2094           if (bb != last_bb_seen->next_bb)
2095             internal_error ("basic blocks not numbered consecutively");
2096
2097           last_bb_seen = bb;
2098         }
2099
2100       if (!bb_info[INSN_UID (x)])
2101         {
2102           switch (GET_CODE (x))
2103             {
2104             case BARRIER:
2105             case NOTE:
2106               break;
2107
2108             case CODE_LABEL:
2109               /* An addr_vec is placed outside any block block.  */
2110               if (NEXT_INSN (x)
2111                   && GET_CODE (NEXT_INSN (x)) == JUMP_INSN
2112                   && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
2113                       || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
2114                 x = NEXT_INSN (x);
2115
2116               /* But in any case, non-deletable labels can appear anywhere.  */
2117               break;
2118
2119             default:
2120               fatal_insn ("insn outside basic block", x);
2121             }
2122         }
2123
2124       if (INSN_P (x)
2125           && GET_CODE (x) == JUMP_INSN
2126           && returnjump_p (x) && ! condjump_p (x)
2127           && ! (NEXT_INSN (x) && GET_CODE (NEXT_INSN (x)) == BARRIER))
2128             fatal_insn ("return not followed by barrier", x);
2129     }
2130
2131   if (num_bb_notes != n_basic_blocks)
2132     internal_error
2133       ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2134        num_bb_notes, n_basic_blocks);
2135
2136   if (err)
2137     internal_error ("verify_flow_info failed");
2138
2139   /* Clean up.  */
2140   free (bb_info);
2141   free (last_visited);
2142   free (edge_checksum);
2143 }
2144 \f
2145 /* Assume that the preceding pass has possibly eliminated jump instructions
2146    or converted the unconditional jumps.  Eliminate the edges from CFG.
2147    Return true if any edges are eliminated.  */
2148
2149 bool
2150 purge_dead_edges (bb)
2151      basic_block bb;
2152 {
2153   edge e, next;
2154   rtx insn = bb->end, note;
2155   bool purged = false;
2156
2157   /* If this instruction cannot trap, remove REG_EH_REGION notes.  */
2158   if (GET_CODE (insn) == INSN
2159       && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
2160     {
2161       rtx eqnote;
2162
2163       if (! may_trap_p (PATTERN (insn))
2164           || ((eqnote = find_reg_equal_equiv_note (insn))
2165               && ! may_trap_p (XEXP (eqnote, 0))))
2166         remove_note (insn, note);
2167     }
2168
2169   /* Cleanup abnormal edges caused by exceptions or non-local gotos.  */
2170   for (e = bb->succ; e; e = next)
2171     {
2172       next = e->succ_next;
2173       if (e->flags & EDGE_EH)
2174         {
2175           if (can_throw_internal (bb->end))
2176             continue;
2177         }
2178       else if (e->flags & EDGE_ABNORMAL_CALL)
2179         {
2180           if (GET_CODE (bb->end) == CALL_INSN
2181               && (! (note = find_reg_note (insn, REG_EH_REGION, NULL))
2182                   || INTVAL (XEXP (note, 0)) >= 0))
2183             continue;
2184         }
2185       else
2186         continue;
2187
2188       remove_edge (e);
2189       bb->flags |= BB_DIRTY;
2190       purged = true;
2191     }
2192
2193   if (GET_CODE (insn) == JUMP_INSN)
2194     {
2195       rtx note;
2196       edge b,f;
2197
2198       /* We do care only about conditional jumps and simplejumps.  */
2199       if (!any_condjump_p (insn)
2200           && !returnjump_p (insn)
2201           && !simplejump_p (insn))
2202         return purged;
2203
2204       /* Branch probability/prediction notes are defined only for
2205          condjumps.  We've possibly turned condjump into simplejump.  */
2206       if (simplejump_p (insn))
2207         {
2208           note = find_reg_note (insn, REG_BR_PROB, NULL);
2209           if (note)
2210             remove_note (insn, note);
2211           while ((note = find_reg_note (insn, REG_BR_PRED, NULL)))
2212             remove_note (insn, note);
2213         }
2214
2215       for (e = bb->succ; e; e = next)
2216         {
2217           next = e->succ_next;
2218
2219           /* Avoid abnormal flags to leak from computed jumps turned
2220              into simplejumps.  */
2221
2222           e->flags &= ~EDGE_ABNORMAL;
2223
2224           /* See if this edge is one we should keep.  */
2225           if ((e->flags & EDGE_FALLTHRU) && any_condjump_p (insn))
2226             /* A conditional jump can fall through into the next
2227                block, so we should keep the edge.  */
2228             continue;
2229           else if (e->dest != EXIT_BLOCK_PTR
2230                    && e->dest->head == JUMP_LABEL (insn))
2231             /* If the destination block is the target of the jump,
2232                keep the edge.  */
2233             continue;
2234           else if (e->dest == EXIT_BLOCK_PTR && returnjump_p (insn))
2235             /* If the destination block is the exit block, and this
2236                instruction is a return, then keep the edge.  */
2237             continue;
2238           else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2239             /* Keep the edges that correspond to exceptions thrown by
2240                this instruction.  */
2241             continue;
2242
2243           /* We do not need this edge.  */
2244           bb->flags |= BB_DIRTY;
2245           purged = true;
2246           remove_edge (e);
2247         }
2248
2249       if (!bb->succ || !purged)
2250         return purged;
2251
2252       if (rtl_dump_file)
2253         fprintf (rtl_dump_file, "Purged edges from bb %i\n", bb->index);
2254
2255       if (!optimize)
2256         return purged;
2257
2258       /* Redistribute probabilities.  */
2259       if (!bb->succ->succ_next)
2260         {
2261           bb->succ->probability = REG_BR_PROB_BASE;
2262           bb->succ->count = bb->count;
2263         }
2264       else
2265         {
2266           note = find_reg_note (insn, REG_BR_PROB, NULL);
2267           if (!note)
2268             return purged;
2269
2270           b = BRANCH_EDGE (bb);
2271           f = FALLTHRU_EDGE (bb);
2272           b->probability = INTVAL (XEXP (note, 0));
2273           f->probability = REG_BR_PROB_BASE - b->probability;
2274           b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2275           f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2276         }
2277
2278       return purged;
2279     }
2280
2281   /* If we don't see a jump insn, we don't know exactly why the block would
2282      have been broken at this point.  Look for a simple, non-fallthru edge,
2283      as these are only created by conditional branches.  If we find such an
2284      edge we know that there used to be a jump here and can then safely
2285      remove all non-fallthru edges.  */
2286   for (e = bb->succ; e && (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU));
2287        e = e->succ_next)
2288     ;
2289
2290   if (!e)
2291     return purged;
2292
2293   for (e = bb->succ; e; e = next)
2294     {
2295       next = e->succ_next;
2296       if (!(e->flags & EDGE_FALLTHRU))
2297         {
2298           bb->flags |= BB_DIRTY;
2299           remove_edge (e);
2300           purged = true;
2301         }
2302     }
2303
2304   if (!bb->succ || bb->succ->succ_next)
2305     abort ();
2306
2307   bb->succ->probability = REG_BR_PROB_BASE;
2308   bb->succ->count = bb->count;
2309
2310   if (rtl_dump_file)
2311     fprintf (rtl_dump_file, "Purged non-fallthru edges from bb %i\n",
2312              bb->index);
2313   return purged;
2314 }
2315
2316 /* Search all basic blocks for potentially dead edges and purge them.  Return
2317    true if some edge has been eliminated.  */
2318
2319 bool
2320 purge_all_dead_edges (update_life_p)
2321      int update_life_p;
2322 {
2323   int purged = false;
2324   sbitmap blocks = 0;
2325   basic_block bb;
2326
2327   if (update_life_p)
2328     {
2329       blocks = sbitmap_alloc (last_basic_block);
2330       sbitmap_zero (blocks);
2331     }
2332
2333   FOR_EACH_BB (bb)
2334     {
2335       bool purged_here = purge_dead_edges (bb);
2336
2337       purged |= purged_here;
2338       if (purged_here && update_life_p)
2339         SET_BIT (blocks, bb->index);
2340     }
2341
2342   if (update_life_p && purged)
2343     update_life_info (blocks, UPDATE_LIFE_GLOBAL,
2344                       PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
2345                       | PROP_KILL_DEAD_CODE);
2346
2347   if (update_life_p)
2348     sbitmap_free (blocks);
2349   return purged;
2350 }