OSDN Git Service

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