OSDN Git Service

* i386.md (and promoting splitters): Disable QI to SImode promoting
[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 labels mentioned in non-jump rtl.  Valid during find_basic_blocks.  */
68 /* ??? Should probably be using LABEL_NUSES instead.  It would take a
69    bit of surgery to be able to use or co-opt the routines in jump.  */
70 rtx label_value_list;
71 rtx tail_recursion_label_list;
72
73 static int can_delete_note_p            PARAMS ((rtx));
74 static int can_delete_label_p           PARAMS ((rtx));
75 static void commit_one_edge_insertion   PARAMS ((edge, int));
76 static bool try_redirect_by_replacing_jump PARAMS ((edge, basic_block));
77 static rtx last_loop_beg_note           PARAMS ((rtx));
78 static bool back_edge_of_syntactic_loop_p PARAMS ((basic_block, basic_block));
79 static basic_block force_nonfallthru_and_redirect PARAMS ((edge, basic_block));
80 \f
81 /* Return true if NOTE is not one of the ones that must be kept paired,
82    so that we may simply delete it.  */
83
84 static int
85 can_delete_note_p (note)
86      rtx note;
87 {
88   return (NOTE_LINE_NUMBER (note) == NOTE_INSN_DELETED
89           || NOTE_LINE_NUMBER (note) == NOTE_INSN_BASIC_BLOCK
90           || NOTE_LINE_NUMBER (note) == NOTE_INSN_PREDICTION);
91 }
92
93 /* True if a given label can be deleted.  */
94
95 static int
96 can_delete_label_p (label)
97      rtx label;
98 {
99   return (!LABEL_PRESERVE_P (label)
100           /* User declared labels must be preserved.  */
101           && LABEL_NAME (label) == 0
102           && !in_expr_list_p (forced_labels, label)
103           && !in_expr_list_p (label_value_list, label));
104 }
105
106 /* Delete INSN by patching it out.  Return the next insn.  */
107
108 rtx
109 delete_insn (insn)
110      rtx insn;
111 {
112   rtx next = NEXT_INSN (insn);
113   rtx note;
114   bool really_delete = true;
115
116   if (GET_CODE (insn) == CODE_LABEL)
117     {
118       /* Some labels can't be directly removed from the INSN chain, as they
119          might be references via variables, constant pool etc.
120          Convert them to the special NOTE_INSN_DELETED_LABEL note.  */
121       if (! can_delete_label_p (insn))
122         {
123           const char *name = LABEL_NAME (insn);
124
125           really_delete = false;
126           PUT_CODE (insn, NOTE);
127           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED_LABEL;
128           NOTE_SOURCE_FILE (insn) = name;
129         }
130
131       remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
132     }
133
134   if (really_delete)
135     {
136       /* If this insn has already been deleted, something is very wrong.  */
137       if (INSN_DELETED_P (insn))
138         abort ();
139       remove_insn (insn);
140       INSN_DELETED_P (insn) = 1;
141     }
142
143   /* If deleting a jump, decrement the use count of the label.  Deleting
144      the label itself should happen in the normal course of block merging.  */
145   if (GET_CODE (insn) == JUMP_INSN
146       && JUMP_LABEL (insn)
147       && GET_CODE (JUMP_LABEL (insn)) == CODE_LABEL)
148     LABEL_NUSES (JUMP_LABEL (insn))--;
149
150   /* Also if deleting an insn that references a label.  */
151   else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX
152            && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
153     LABEL_NUSES (XEXP (note, 0))--;
154
155   if (GET_CODE (insn) == JUMP_INSN
156       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
157           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
158     {
159       rtx pat = PATTERN (insn);
160       int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
161       int len = XVECLEN (pat, diff_vec_p);
162       int i;
163
164       for (i = 0; i < len; i++)
165         {
166           rtx label = XEXP (XVECEXP (pat, diff_vec_p, i), 0);
167
168           /* When deleting code in bulk (e.g. removing many unreachable
169              blocks) we can delete a label that's a target of the vector
170              before deleting the vector itself.  */
171           if (GET_CODE (label) != NOTE)
172             LABEL_NUSES (label)--;
173         }
174     }
175
176   return next;
177 }
178
179 /* Like delete_insn but also purge dead edges from BB.  */
180 rtx
181 delete_insn_and_edges (insn)
182      rtx insn;
183 {
184   rtx x;
185   bool purge = false;
186
187   if (INSN_P (insn)
188       && BLOCK_FOR_INSN (insn)
189       && BLOCK_FOR_INSN (insn)->end == insn)
190     purge = true;
191   x = delete_insn (insn);
192   if (purge)
193     purge_dead_edges (BLOCK_FOR_INSN (insn));
194   return x;
195 }
196
197 /* Unlink a chain of insns between START and FINISH, leaving notes
198    that must be paired.  */
199
200 void
201 delete_insn_chain (start, finish)
202      rtx start, finish;
203 {
204   rtx next;
205
206   /* Unchain the insns one by one.  It would be quicker to delete all of these
207      with a single unchaining, rather than one at a time, but we need to keep
208      the NOTE's.  */
209   while (1)
210     {
211       next = NEXT_INSN (start);
212       if (GET_CODE (start) == NOTE && !can_delete_note_p (start))
213         ;
214       else
215         next = delete_insn (start);
216
217       if (start == finish)
218         break;
219       start = next;
220     }
221 }
222
223 /* Like delete_insn but also purge dead edges from BB.  */
224 void
225 delete_insn_chain_and_edges (first, last)
226      rtx first, last;
227 {
228   bool purge = false;
229
230   if (INSN_P (last)
231       && BLOCK_FOR_INSN (last)
232       && BLOCK_FOR_INSN (last)->end == last)
233     purge = true;
234   delete_insn_chain (first, last);
235   if (purge)
236     purge_dead_edges (BLOCK_FOR_INSN (last));
237 }
238 \f
239 /* Create a new basic block consisting of the instructions between HEAD and END
240    inclusive.  This function is designed to allow fast BB construction - reuses
241    the note and basic block struct in BB_NOTE, if any and do not grow
242    BASIC_BLOCK chain and should be used directly only by CFG construction code.
243    END can be NULL in to create new empty basic block before HEAD.  Both END
244    and HEAD can be NULL to create basic block at the end of INSN chain.
245    AFTER is the basic block we should be put after.  */
246
247 basic_block
248 create_basic_block_structure (index, head, end, bb_note, after)
249      int index;
250      rtx head, end, bb_note;
251      basic_block after;
252 {
253   basic_block bb;
254
255   if (bb_note
256       && ! RTX_INTEGRATED_P (bb_note)
257       && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
258       && bb->aux == NULL)
259     {
260       /* If we found an existing note, thread it back onto the chain.  */
261
262       rtx after;
263
264       if (GET_CODE (head) == CODE_LABEL)
265         after = head;
266       else
267         {
268           after = PREV_INSN (head);
269           head = bb_note;
270         }
271
272       if (after != bb_note && NEXT_INSN (after) != bb_note)
273         reorder_insns_nobb (bb_note, bb_note, after);
274     }
275   else
276     {
277       /* Otherwise we must create a note and a basic block structure.  */
278
279       bb = alloc_block ();
280
281       if (!head && !end)
282         head = end = bb_note
283           = emit_note_after (NOTE_INSN_BASIC_BLOCK, get_last_insn ());
284       else if (GET_CODE (head) == CODE_LABEL && end)
285         {
286           bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
287           if (head == end)
288             end = bb_note;
289         }
290       else
291         {
292           bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
293           head = bb_note;
294           if (!end)
295             end = head;
296         }
297
298       NOTE_BASIC_BLOCK (bb_note) = bb;
299     }
300
301   /* Always include the bb note in the block.  */
302   if (NEXT_INSN (end) == bb_note)
303     end = bb_note;
304
305   bb->head = head;
306   bb->end = end;
307   bb->index = index;
308   bb->flags = BB_NEW;
309   link_block (bb, after);
310   BASIC_BLOCK (index) = bb;
311   update_bb_for_insn (bb);
312
313   /* Tag the block so that we know it has been used when considering
314      other basic block notes.  */
315   bb->aux = bb;
316
317   return bb;
318 }
319
320 /* Create new basic block consisting of instructions in between HEAD and END
321    and place it to the BB chain after block AFTER.  END can be NULL in to
322    create new empty basic block before HEAD.  Both END and HEAD can be NULL to
323    create basic block at the end of INSN chain.  */
324
325 basic_block
326 create_basic_block (head, end, after)
327      rtx head, end;
328      basic_block after;
329 {
330   basic_block bb;
331   int index = last_basic_block++;
332
333   /* Place the new block just after the end.  */
334   VARRAY_GROW (basic_block_info, last_basic_block);
335
336   n_basic_blocks++;
337
338   bb = create_basic_block_structure (index, 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 hanging before the block.  */
366
367   for (insn = PREV_INSN (b->head); insn; insn = PREV_INSN (insn))
368     {
369       if (GET_CODE (insn) != NOTE)
370         break;
371       if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_PREDICTION)
372         NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
373     }
374
375   insn = b->head;
376
377   never_reached_warning (insn, b->end);
378
379   if (GET_CODE (insn) == CODE_LABEL)
380     maybe_remove_eh_handler (insn);
381
382   /* Include any jump table following the basic block.  */
383   end = b->end;
384   if (GET_CODE (end) == JUMP_INSN
385       && (tmp = JUMP_LABEL (end)) != NULL_RTX
386       && (tmp = NEXT_INSN (tmp)) != NULL_RTX
387       && GET_CODE (tmp) == JUMP_INSN
388       && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
389           || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
390     end = tmp;
391
392   /* Include any barrier that may follow the basic block.  */
393   tmp = next_nonnote_insn (end);
394   if (tmp && GET_CODE (tmp) == BARRIER)
395     end = tmp;
396
397   /* Selectively delete the entire chain.  */
398   b->head = NULL;
399   delete_insn_chain (insn, end);
400
401   /* Remove the edges into and out of this block.  Note that there may
402      indeed be edges in, if we are removing an unreachable loop.  */
403   while (b->pred != NULL)
404     remove_edge (b->pred);
405   while (b->succ != NULL)
406     remove_edge (b->succ);
407
408   b->pred = NULL;
409   b->succ = NULL;
410
411   return deleted_handler;
412 }
413
414 int
415 flow_delete_block (b)
416      basic_block b;
417 {
418   int deleted_handler = flow_delete_block_noexpunge (b);
419
420   /* Remove the basic block from the array.  */
421   expunge_block (b);
422
423   return deleted_handler;
424 }
425 \f
426 /* Records the basic block struct in BB_FOR_INSN, for every instruction
427    indexed by INSN_UID.  MAX is the size of the array.  */
428
429 void
430 compute_bb_for_insn (max)
431      int max;
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 an 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;
939   rtx note;
940   edge new_edge;
941
942   if (e->flags & EDGE_ABNORMAL)
943     abort ();
944   else if (!(e->flags & EDGE_FALLTHRU))
945     abort ();
946   else if (e->src == ENTRY_BLOCK_PTR)
947     {
948       /* We can't redirect the entry block.  Create an empty block at the
949          start of the function which we use to add the new jump.  */
950       edge *pe1;
951       basic_block bb = create_basic_block (e->dest->head, NULL, ENTRY_BLOCK_PTR);
952
953       /* Change the existing edge's source to be the new block, and add
954          a new edge from the entry block to the new block.  */
955       e->src = bb;
956       for (pe1 = &ENTRY_BLOCK_PTR->succ; *pe1; pe1 = &(*pe1)->succ_next)
957         if (*pe1 == e)
958           {
959             *pe1 = e->succ_next;
960             break;
961           }
962       e->succ_next = 0;
963       bb->succ = e;
964       make_single_succ_edge (ENTRY_BLOCK_PTR, bb, EDGE_FALLTHRU);
965     }
966
967   if (e->src->succ->succ_next)
968     {
969       /* Create the new structures.  */
970       note = last_loop_beg_note (e->src->end);
971       jump_block
972         = create_basic_block (NEXT_INSN (note), NULL, e->src);
973       jump_block->count = e->count;
974       jump_block->frequency = EDGE_FREQUENCY (e);
975       jump_block->loop_depth = target->loop_depth;
976
977       if (target->global_live_at_start)
978         {
979           jump_block->global_live_at_start
980             = OBSTACK_ALLOC_REG_SET (&flow_obstack);
981           jump_block->global_live_at_end
982             = OBSTACK_ALLOC_REG_SET (&flow_obstack);
983           COPY_REG_SET (jump_block->global_live_at_start,
984                         target->global_live_at_start);
985           COPY_REG_SET (jump_block->global_live_at_end,
986                         target->global_live_at_start);
987         }
988
989       /* Wire edge in.  */
990       new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
991       new_edge->probability = e->probability;
992       new_edge->count = e->count;
993
994       /* Redirect old edge.  */
995       redirect_edge_pred (e, jump_block);
996       e->probability = REG_BR_PROB_BASE;
997
998       new_bb = jump_block;
999     }
1000   else
1001     jump_block = e->src;
1002
1003   e->flags &= ~EDGE_FALLTHRU;
1004   if (target == EXIT_BLOCK_PTR)
1005     {
1006       if (HAVE_return)
1007         emit_jump_insn_after (gen_return (), jump_block->end);
1008       else
1009         abort ();
1010     }
1011   else
1012     {
1013       rtx label = block_label (target);
1014       emit_jump_insn_after (gen_jump (label), jump_block->end);
1015       JUMP_LABEL (jump_block->end) = label;
1016       LABEL_NUSES (label)++;
1017     }
1018
1019   emit_barrier_after (jump_block->end);
1020   redirect_edge_succ_nodup (e, target);
1021
1022   return new_bb;
1023 }
1024
1025 /* Edge E is assumed to be fallthru edge.  Emit needed jump instruction
1026    (and possibly create new basic block) to make edge non-fallthru.
1027    Return newly created BB or NULL if none.  */
1028
1029 basic_block
1030 force_nonfallthru (e)
1031      edge e;
1032 {
1033   return force_nonfallthru_and_redirect (e, e->dest);
1034 }
1035
1036 /* Redirect edge even at the expense of creating new jump insn or
1037    basic block.  Return new basic block if created, NULL otherwise.
1038    Abort if conversion is impossible.  */
1039
1040 basic_block
1041 redirect_edge_and_branch_force (e, target)
1042      edge e;
1043      basic_block target;
1044 {
1045   if (redirect_edge_and_branch (e, target)
1046       || e->dest == target)
1047     return NULL;
1048
1049   /* In case the edge redirection failed, try to force it to be non-fallthru
1050      and redirect newly created simplejump.  */
1051   return force_nonfallthru_and_redirect (e, target);
1052 }
1053
1054 /* The given edge should potentially be a fallthru edge.  If that is in
1055    fact true, delete the jump and barriers that are in the way.  */
1056
1057 void
1058 tidy_fallthru_edge (e, b, c)
1059      edge e;
1060      basic_block b, c;
1061 {
1062   rtx q;
1063
1064   /* ??? In a late-running flow pass, other folks may have deleted basic
1065      blocks by nopping out blocks, leaving multiple BARRIERs between here
1066      and the target label. They ought to be chastized and fixed.
1067
1068      We can also wind up with a sequence of undeletable labels between
1069      one block and the next.
1070
1071      So search through a sequence of barriers, labels, and notes for
1072      the head of block C and assert that we really do fall through.  */
1073
1074   for (q = NEXT_INSN (b->end); q != c->head; q = NEXT_INSN (q))
1075     if (INSN_P (q))
1076       return;
1077
1078   /* Remove what will soon cease being the jump insn from the source block.
1079      If block B consisted only of this single jump, turn it into a deleted
1080      note.  */
1081   q = b->end;
1082   if (GET_CODE (q) == JUMP_INSN
1083       && onlyjump_p (q)
1084       && (any_uncondjump_p (q)
1085           || (b->succ == e && e->succ_next == NULL)))
1086     {
1087 #ifdef HAVE_cc0
1088       /* If this was a conditional jump, we need to also delete
1089          the insn that set cc0.  */
1090       if (any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1091         q = PREV_INSN (q);
1092 #endif
1093
1094       q = PREV_INSN (q);
1095
1096       /* We don't want a block to end on a line-number note since that has
1097          the potential of changing the code between -g and not -g.  */
1098       while (GET_CODE (q) == NOTE && NOTE_LINE_NUMBER (q) >= 0)
1099         q = PREV_INSN (q);
1100     }
1101
1102   /* Selectively unlink the sequence.  */
1103   if (q != PREV_INSN (c->head))
1104     delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
1105
1106   e->flags |= EDGE_FALLTHRU;
1107 }
1108
1109 /* Fix up edges that now fall through, or rather should now fall through
1110    but previously required a jump around now deleted blocks.  Simplify
1111    the search by only examining blocks numerically adjacent, since this
1112    is how find_basic_blocks created them.  */
1113
1114 void
1115 tidy_fallthru_edges ()
1116 {
1117   basic_block b, c;
1118
1119   if (ENTRY_BLOCK_PTR->next_bb == EXIT_BLOCK_PTR)
1120     return;
1121
1122   FOR_BB_BETWEEN (b, ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR->prev_bb, next_bb)
1123     {
1124       edge s;
1125
1126       c = b->next_bb;
1127
1128       /* We care about simple conditional or unconditional jumps with
1129          a single successor.
1130
1131          If we had a conditional branch to the next instruction when
1132          find_basic_blocks was called, then there will only be one
1133          out edge for the block which ended with the conditional
1134          branch (since we do not create duplicate edges).
1135
1136          Furthermore, the edge will be marked as a fallthru because we
1137          merge the flags for the duplicate edges.  So we do not want to
1138          check that the edge is not a FALLTHRU edge.  */
1139
1140       if ((s = b->succ) != NULL
1141           && ! (s->flags & EDGE_COMPLEX)
1142           && s->succ_next == NULL
1143           && s->dest == c
1144           /* If the jump insn has side effects, we can't tidy the edge.  */
1145           && (GET_CODE (b->end) != JUMP_INSN
1146               || onlyjump_p (b->end)))
1147         tidy_fallthru_edge (s, b, c);
1148     }
1149 }
1150 \f
1151 /* Helper function for split_edge.  Return true in case edge BB2 to BB1
1152    is back edge of syntactic loop.  */
1153
1154 static bool
1155 back_edge_of_syntactic_loop_p (bb1, bb2)
1156         basic_block bb1, bb2;
1157 {
1158   rtx insn;
1159   int count = 0;
1160   basic_block bb;
1161
1162   if (bb1 == bb2)
1163     return true;
1164
1165   /* ??? Could we guarantee that bb indices are monotone, so that we could
1166      just compare them?  */
1167   for (bb = bb1; bb && bb != bb2; bb = bb->next_bb)
1168     continue;
1169
1170   if (!bb)
1171     return false;
1172
1173   for (insn = bb1->end; insn != bb2->head && count >= 0;
1174        insn = NEXT_INSN (insn))
1175     if (GET_CODE (insn) == NOTE)
1176       {
1177         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1178           count++;
1179         else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
1180           count--;
1181       }
1182
1183   return count >= 0;
1184 }
1185
1186 /* Split a (typically critical) edge.  Return the new block.
1187    Abort on abnormal edges.
1188
1189    ??? The code generally expects to be called on critical edges.
1190    The case of a block ending in an unconditional jump to a
1191    block with multiple predecessors is not handled optimally.  */
1192
1193 basic_block
1194 split_edge (edge_in)
1195      edge edge_in;
1196 {
1197   basic_block bb;
1198   edge edge_out;
1199   rtx before;
1200
1201   /* Abnormal edges cannot be split.  */
1202   if ((edge_in->flags & EDGE_ABNORMAL) != 0)
1203     abort ();
1204
1205   /* We are going to place the new block in front of edge destination.
1206      Avoid existence of fallthru predecessors.  */
1207   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1208     {
1209       edge e;
1210
1211       for (e = edge_in->dest->pred; e; e = e->pred_next)
1212         if (e->flags & EDGE_FALLTHRU)
1213           break;
1214
1215       if (e)
1216         force_nonfallthru (e);
1217     }
1218
1219   /* Create the basic block note.
1220
1221      Where we place the note can have a noticeable impact on the generated
1222      code.  Consider this cfg:
1223
1224                         E
1225                         |
1226                         0
1227                        / \
1228                    +->1-->2--->E
1229                    |  |
1230                    +--+
1231
1232       If we need to insert an insn on the edge from block 0 to block 1,
1233       we want to ensure the instructions we insert are outside of any
1234       loop notes that physically sit between block 0 and block 1.  Otherwise
1235       we confuse the loop optimizer into thinking the loop is a phony.  */
1236
1237   if (edge_in->dest != EXIT_BLOCK_PTR
1238       && PREV_INSN (edge_in->dest->head)
1239       && GET_CODE (PREV_INSN (edge_in->dest->head)) == NOTE
1240       && (NOTE_LINE_NUMBER (PREV_INSN (edge_in->dest->head))
1241           == NOTE_INSN_LOOP_BEG)
1242       && !back_edge_of_syntactic_loop_p (edge_in->dest, edge_in->src))
1243     before = PREV_INSN (edge_in->dest->head);
1244   else if (edge_in->dest != EXIT_BLOCK_PTR)
1245     before = edge_in->dest->head;
1246   else
1247     before = NULL_RTX;
1248
1249   bb = create_basic_block (before, NULL, edge_in->dest->prev_bb);
1250   bb->count = edge_in->count;
1251   bb->frequency = EDGE_FREQUENCY (edge_in);
1252
1253   /* ??? This info is likely going to be out of date very soon.  */
1254   if (edge_in->dest->global_live_at_start)
1255     {
1256       bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1257       bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1258       COPY_REG_SET (bb->global_live_at_start,
1259                     edge_in->dest->global_live_at_start);
1260       COPY_REG_SET (bb->global_live_at_end,
1261                     edge_in->dest->global_live_at_start);
1262     }
1263
1264   edge_out = make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
1265
1266   /* For non-fallthry edges, we must adjust the predecessor's
1267      jump instruction to target our new block.  */
1268   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1269     {
1270       if (!redirect_edge_and_branch (edge_in, bb))
1271         abort ();
1272     }
1273   else
1274     redirect_edge_succ (edge_in, bb);
1275
1276   return bb;
1277 }
1278
1279 /* Queue instructions for insertion on an edge between two basic blocks.
1280    The new instructions and basic blocks (if any) will not appear in the
1281    CFG until commit_edge_insertions is called.  */
1282
1283 void
1284 insert_insn_on_edge (pattern, e)
1285      rtx pattern;
1286      edge e;
1287 {
1288   /* We cannot insert instructions on an abnormal critical edge.
1289      It will be easier to find the culprit if we die now.  */
1290   if ((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
1291     abort ();
1292
1293   if (e->insns == NULL_RTX)
1294     start_sequence ();
1295   else
1296     push_to_sequence (e->insns);
1297
1298   emit_insn (pattern);
1299
1300   e->insns = get_insns ();
1301   end_sequence ();
1302 }
1303
1304 /* Update the CFG for the instructions queued on edge E.  */
1305
1306 static void
1307 commit_one_edge_insertion (e, watch_calls)
1308      edge e;
1309      int watch_calls;
1310 {
1311   rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1312   basic_block bb = NULL;
1313
1314   /* Pull the insns off the edge now since the edge might go away.  */
1315   insns = e->insns;
1316   e->insns = NULL_RTX;
1317
1318   /* Special case -- avoid inserting code between call and storing
1319      its return value.  */
1320   if (watch_calls && (e->flags & EDGE_FALLTHRU) && !e->dest->pred->pred_next
1321       && e->src != ENTRY_BLOCK_PTR
1322       && GET_CODE (e->src->end) == CALL_INSN)
1323     {
1324       rtx next = next_nonnote_insn (e->src->end);
1325
1326       after = e->dest->head;
1327       /* The first insn after the call may be a stack pop, skip it.  */
1328       while (next
1329              && keep_with_call_p (next))
1330         {
1331           after = next;
1332           next = next_nonnote_insn (next);
1333         }
1334       bb = e->dest;
1335     }
1336   if (!before && !after)
1337     {
1338       /* Figure out where to put these things.  If the destination has
1339          one predecessor, insert there.  Except for the exit block.  */
1340       if (e->dest->pred->pred_next == NULL && e->dest != EXIT_BLOCK_PTR)
1341         {
1342           bb = e->dest;
1343
1344           /* Get the location correct wrt a code label, and "nice" wrt
1345              a basic block note, and before everything else.  */
1346           tmp = bb->head;
1347           if (GET_CODE (tmp) == CODE_LABEL)
1348             tmp = NEXT_INSN (tmp);
1349           if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1350             tmp = NEXT_INSN (tmp);
1351           if (tmp == bb->head)
1352             before = tmp;
1353           else if (tmp)
1354             after = PREV_INSN (tmp);
1355           else
1356             after = get_last_insn ();
1357         }
1358
1359       /* If the source has one successor and the edge is not abnormal,
1360          insert there.  Except for the entry block.  */
1361       else if ((e->flags & EDGE_ABNORMAL) == 0
1362                && e->src->succ->succ_next == NULL
1363                && e->src != ENTRY_BLOCK_PTR)
1364         {
1365           bb = e->src;
1366
1367           /* It is possible to have a non-simple jump here.  Consider a target
1368              where some forms of unconditional jumps clobber a register.  This
1369              happens on the fr30 for example.
1370
1371              We know this block has a single successor, so we can just emit
1372              the queued insns before the jump.  */
1373           if (GET_CODE (bb->end) == JUMP_INSN)
1374             for (before = bb->end;
1375                  GET_CODE (PREV_INSN (before)) == NOTE
1376                  && NOTE_LINE_NUMBER (PREV_INSN (before)) ==
1377                  NOTE_INSN_LOOP_BEG; before = PREV_INSN (before))
1378               ;
1379           else
1380             {
1381               /* We'd better be fallthru, or we've lost track of what's what.  */
1382               if ((e->flags & EDGE_FALLTHRU) == 0)
1383                 abort ();
1384
1385               after = bb->end;
1386             }
1387         }
1388       /* Otherwise we must split the edge.  */
1389       else
1390         {
1391           bb = split_edge (e);
1392           after = bb->end;
1393         }
1394     }
1395
1396   /* Now that we've found the spot, do the insertion.  */
1397
1398   if (before)
1399     {
1400       emit_insns_before (insns, before);
1401       last = prev_nonnote_insn (before);
1402     }
1403   else
1404     last = emit_insns_after (insns, after);
1405
1406   if (returnjump_p (last))
1407     {
1408       /* ??? Remove all outgoing edges from BB and add one for EXIT.
1409          This is not currently a problem because this only happens
1410          for the (single) epilogue, which already has a fallthru edge
1411          to EXIT.  */
1412
1413       e = bb->succ;
1414       if (e->dest != EXIT_BLOCK_PTR
1415           || e->succ_next != NULL || (e->flags & EDGE_FALLTHRU) == 0)
1416         abort ();
1417
1418       e->flags &= ~EDGE_FALLTHRU;
1419       emit_barrier_after (last);
1420
1421       if (before)
1422         delete_insn (before);
1423     }
1424   else if (GET_CODE (last) == JUMP_INSN)
1425     abort ();
1426
1427   find_sub_basic_blocks (bb);
1428 }
1429
1430 /* Update the CFG for all queued instructions.  */
1431
1432 void
1433 commit_edge_insertions ()
1434 {
1435   basic_block bb;
1436
1437 #ifdef ENABLE_CHECKING
1438   verify_flow_info ();
1439 #endif
1440
1441   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
1442     {
1443       edge e, next;
1444
1445       for (e = bb->succ; e; e = next)
1446         {
1447           next = e->succ_next;
1448           if (e->insns)
1449             commit_one_edge_insertion (e, false);
1450         }
1451     }
1452 }
1453 \f
1454 /* Update the CFG for all queued instructions, taking special care of inserting
1455    code on edges between call and storing its return value.  */
1456
1457 void
1458 commit_edge_insertions_watch_calls ()
1459 {
1460   basic_block bb;
1461
1462 #ifdef ENABLE_CHECKING
1463   verify_flow_info ();
1464 #endif
1465
1466   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
1467     {
1468       edge e, next;
1469
1470       for (e = bb->succ; e; e = next)
1471         {
1472           next = e->succ_next;
1473           if (e->insns)
1474             commit_one_edge_insertion (e, true);
1475         }
1476     }
1477 }
1478 \f
1479 /* Print out one basic block with live information at start and end.  */
1480
1481 void
1482 dump_bb (bb, outf)
1483      basic_block bb;
1484      FILE *outf;
1485 {
1486   rtx insn;
1487   rtx last;
1488   edge e;
1489
1490   fprintf (outf, ";; Basic block %d, loop depth %d, count ",
1491            bb->index, bb->loop_depth);
1492   fprintf (outf, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) bb->count);
1493   putc ('\n', outf);
1494
1495   fputs (";; Predecessors: ", outf);
1496   for (e = bb->pred; e; e = e->pred_next)
1497     dump_edge_info (outf, e, 0);
1498   putc ('\n', outf);
1499
1500   fputs (";; Registers live at start:", outf);
1501   dump_regset (bb->global_live_at_start, outf);
1502   putc ('\n', outf);
1503
1504   for (insn = bb->head, last = NEXT_INSN (bb->end); insn != last;
1505        insn = NEXT_INSN (insn))
1506     print_rtl_single (outf, insn);
1507
1508   fputs (";; Registers live at end:", outf);
1509   dump_regset (bb->global_live_at_end, outf);
1510   putc ('\n', outf);
1511
1512   fputs (";; Successors: ", outf);
1513   for (e = bb->succ; e; e = e->succ_next)
1514     dump_edge_info (outf, e, 1);
1515   putc ('\n', outf);
1516 }
1517
1518 void
1519 debug_bb (bb)
1520      basic_block bb;
1521 {
1522   dump_bb (bb, stderr);
1523 }
1524
1525 void
1526 debug_bb_n (n)
1527      int n;
1528 {
1529   dump_bb (BASIC_BLOCK (n), stderr);
1530 }
1531 \f
1532 /* Like print_rtl, but also print out live information for the start of each
1533    basic block.  */
1534
1535 void
1536 print_rtl_with_bb (outf, rtx_first)
1537      FILE *outf;
1538      rtx rtx_first;
1539 {
1540   rtx tmp_rtx;
1541
1542   if (rtx_first == 0)
1543     fprintf (outf, "(nil)\n");
1544   else
1545     {
1546       enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
1547       int max_uid = get_max_uid ();
1548       basic_block *start
1549         = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1550       basic_block *end
1551         = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1552       enum bb_state *in_bb_p
1553         = (enum bb_state *) xcalloc (max_uid, sizeof (enum bb_state));
1554
1555       basic_block bb;
1556
1557       FOR_EACH_BB_REVERSE (bb)
1558         {
1559           rtx x;
1560
1561           start[INSN_UID (bb->head)] = bb;
1562           end[INSN_UID (bb->end)] = bb;
1563           for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x))
1564             {
1565               enum bb_state state = IN_MULTIPLE_BB;
1566
1567               if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1568                 state = IN_ONE_BB;
1569               in_bb_p[INSN_UID (x)] = state;
1570
1571               if (x == bb->end)
1572                 break;
1573             }
1574         }
1575
1576       for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1577         {
1578           int did_output;
1579
1580           if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
1581             {
1582               fprintf (outf, ";; Start of basic block %d, registers live:",
1583                        bb->index);
1584               dump_regset (bb->global_live_at_start, outf);
1585               putc ('\n', outf);
1586             }
1587
1588           if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1589               && GET_CODE (tmp_rtx) != NOTE
1590               && GET_CODE (tmp_rtx) != BARRIER)
1591             fprintf (outf, ";; Insn is not within a basic block\n");
1592           else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1593             fprintf (outf, ";; Insn is in multiple basic blocks\n");
1594
1595           did_output = print_rtl_single (outf, tmp_rtx);
1596
1597           if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
1598             {
1599               fprintf (outf, ";; End of basic block %d, registers live:\n",
1600                        bb->index);
1601               dump_regset (bb->global_live_at_end, outf);
1602               putc ('\n', outf);
1603             }
1604
1605           if (did_output)
1606             putc ('\n', outf);
1607         }
1608
1609       free (start);
1610       free (end);
1611       free (in_bb_p);
1612     }
1613
1614   if (current_function_epilogue_delay_list != 0)
1615     {
1616       fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1617       for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
1618            tmp_rtx = XEXP (tmp_rtx, 1))
1619         print_rtl_single (outf, XEXP (tmp_rtx, 0));
1620     }
1621 }
1622 \f
1623 void
1624 update_br_prob_note (bb)
1625      basic_block bb;
1626 {
1627   rtx note;
1628   if (GET_CODE (bb->end) != JUMP_INSN)
1629     return;
1630   note = find_reg_note (bb->end, REG_BR_PROB, NULL_RTX);
1631   if (!note || INTVAL (XEXP (note, 0)) == BRANCH_EDGE (bb)->probability)
1632     return;
1633   XEXP (note, 0) = GEN_INT (BRANCH_EDGE (bb)->probability);
1634 }
1635 \f
1636 /* Verify the CFG consistency.  This function check some CFG invariants and
1637    aborts when something is wrong.  Hope that this function will help to
1638    convert many optimization passes to preserve CFG consistent.
1639
1640    Currently it does following checks:
1641
1642    - test head/end pointers
1643    - overlapping of basic blocks
1644    - edge list correctness
1645    - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
1646    - tails of basic blocks (ensure that boundary is necessary)
1647    - scans body of the basic block for JUMP_INSN, CODE_LABEL
1648      and NOTE_INSN_BASIC_BLOCK
1649    - check that all insns are in the basic blocks
1650      (except the switch handling code, barriers and notes)
1651    - check that all returns are followed by barriers
1652
1653    In future it can be extended check a lot of other stuff as well
1654    (reachability of basic blocks, life information, etc. etc.).  */
1655
1656 void
1657 verify_flow_info ()
1658 {
1659   const int max_uid = get_max_uid ();
1660   const rtx rtx_first = get_insns ();
1661   rtx last_head = get_last_insn ();
1662   basic_block *bb_info, *last_visited;
1663   size_t *edge_checksum;
1664   rtx x;
1665   int num_bb_notes, err = 0;
1666   basic_block bb, last_bb_seen;
1667
1668   bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1669   last_visited = (basic_block *) xcalloc (last_basic_block + 2,
1670                                           sizeof (basic_block));
1671   edge_checksum = (size_t *) xcalloc (last_basic_block + 2, sizeof (size_t));
1672
1673   /* Check bb chain & numbers.  */
1674   last_bb_seen = ENTRY_BLOCK_PTR;
1675   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb, NULL, next_bb)
1676     {
1677       if (bb != EXIT_BLOCK_PTR
1678           && bb != BASIC_BLOCK (bb->index))
1679         {
1680           error ("bb %d on wrong place", bb->index);
1681           err = 1;
1682         }
1683
1684       if (bb->prev_bb != last_bb_seen)
1685         {
1686           error ("prev_bb of %d should be %d, not %d",
1687                  bb->index, last_bb_seen->index, bb->prev_bb->index);
1688           err = 1;
1689         }
1690
1691       last_bb_seen = bb;
1692     }
1693
1694   FOR_EACH_BB_REVERSE (bb)
1695     {
1696       rtx head = bb->head;
1697       rtx end = bb->end;
1698
1699       /* Verify the end of the basic block is in the INSN chain.  */
1700       for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
1701         if (x == end)
1702           break;
1703
1704       if (!x)
1705         {
1706           error ("end insn %d for block %d not found in the insn stream",
1707                  INSN_UID (end), bb->index);
1708           err = 1;
1709         }
1710
1711       /* Work backwards from the end to the head of the basic block
1712          to verify the head is in the RTL chain.  */
1713       for (; x != NULL_RTX; x = PREV_INSN (x))
1714         {
1715           /* While walking over the insn chain, verify insns appear
1716              in only one basic block and initialize the BB_INFO array
1717              used by other passes.  */
1718           if (bb_info[INSN_UID (x)] != NULL)
1719             {
1720               error ("insn %d is in multiple basic blocks (%d and %d)",
1721                      INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
1722               err = 1;
1723             }
1724
1725           bb_info[INSN_UID (x)] = bb;
1726
1727           if (x == head)
1728             break;
1729         }
1730       if (!x)
1731         {
1732           error ("head insn %d for block %d not found in the insn stream",
1733                  INSN_UID (head), bb->index);
1734           err = 1;
1735         }
1736
1737       last_head = x;
1738     }
1739
1740   /* Now check the basic blocks (boundaries etc.) */
1741   FOR_EACH_BB_REVERSE (bb)
1742     {
1743       int n_fallthru = 0, n_eh = 0, n_call = 0, n_abnormal = 0, n_branch = 0;
1744       edge e;
1745       rtx note;
1746
1747       if (INSN_P (bb->end)
1748           && (note = find_reg_note (bb->end, REG_BR_PROB, NULL_RTX))
1749           && bb->succ && bb->succ->succ_next
1750           && any_condjump_p (bb->end))
1751         {
1752           if (INTVAL (XEXP (note, 0)) != BRANCH_EDGE (bb)->probability)
1753             {
1754               error ("verify_flow_info: REG_BR_PROB does not match cfg %i %i",
1755                      INTVAL (XEXP (note, 0)), BRANCH_EDGE (bb)->probability);
1756               err = 1;
1757             }
1758         }
1759       if (bb->count < 0)
1760         {
1761           error ("verify_flow_info: Wrong count of block %i %i",
1762                  bb->index, (int)bb->count);
1763           err = 1;
1764         }
1765       if (bb->frequency < 0)
1766         {
1767           error ("verify_flow_info: Wrong frequency of block %i %i",
1768                  bb->index, bb->frequency);
1769           err = 1;
1770         }
1771       for (e = bb->succ; e; e = e->succ_next)
1772         {
1773           if (last_visited [e->dest->index + 2] == bb)
1774             {
1775               error ("verify_flow_info: Duplicate edge %i->%i",
1776                      e->src->index, e->dest->index);
1777               err = 1;
1778             }
1779           if (e->probability < 0 || e->probability > REG_BR_PROB_BASE)
1780             {
1781               error ("verify_flow_info: Wrong probability of edge %i->%i %i",
1782                      e->src->index, e->dest->index, e->probability);
1783               err = 1;
1784             }
1785           if (e->count < 0)
1786             {
1787               error ("verify_flow_info: Wrong count of edge %i->%i %i",
1788                      e->src->index, e->dest->index, (int)e->count);
1789               err = 1;
1790             }
1791
1792           last_visited [e->dest->index + 2] = bb;
1793
1794           if (e->flags & EDGE_FALLTHRU)
1795             n_fallthru++;
1796
1797           if ((e->flags & ~EDGE_DFS_BACK) == 0)
1798             n_branch++;
1799
1800           if (e->flags & EDGE_ABNORMAL_CALL)
1801             n_call++;
1802
1803           if (e->flags & EDGE_EH)
1804             n_eh++;
1805           else if (e->flags & EDGE_ABNORMAL)
1806             n_abnormal++;
1807
1808           if ((e->flags & EDGE_FALLTHRU)
1809               && e->src != ENTRY_BLOCK_PTR
1810               && e->dest != EXIT_BLOCK_PTR)
1811             {
1812               rtx insn;
1813
1814               if (e->src->next_bb != e->dest)
1815                 {
1816                   error
1817                     ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
1818                      e->src->index, e->dest->index);
1819                   err = 1;
1820                 }
1821               else
1822                 for (insn = NEXT_INSN (e->src->end); insn != e->dest->head;
1823                      insn = NEXT_INSN (insn))
1824                   if (GET_CODE (insn) == BARRIER
1825 #ifndef CASE_DROPS_THROUGH
1826                       || INSN_P (insn)
1827 #else
1828                       || (INSN_P (insn) && ! JUMP_TABLE_DATA_P (insn))
1829 #endif
1830                       )
1831                     {
1832                       error ("verify_flow_info: Incorrect fallthru %i->%i",
1833                              e->src->index, e->dest->index);
1834                       fatal_insn ("wrong insn in the fallthru edge", insn);
1835                       err = 1;
1836                     }
1837             }
1838
1839           if (e->src != bb)
1840             {
1841               error ("verify_flow_info: Basic block %d succ edge is corrupted",
1842                      bb->index);
1843               fprintf (stderr, "Predecessor: ");
1844               dump_edge_info (stderr, e, 0);
1845               fprintf (stderr, "\nSuccessor: ");
1846               dump_edge_info (stderr, e, 1);
1847               fprintf (stderr, "\n");
1848               err = 1;
1849             }
1850
1851           edge_checksum[e->dest->index + 2] += (size_t) e;
1852         }
1853
1854       if (n_eh && GET_CODE (PATTERN (bb->end)) != RESX
1855           && !find_reg_note (bb->end, REG_EH_REGION, NULL_RTX))
1856         {
1857           error ("Missing REG_EH_REGION note in the end of bb %i", bb->index);
1858           err = 1;
1859         }
1860       if (n_branch
1861           && (GET_CODE (bb->end) != JUMP_INSN
1862               || (n_branch > 1 && (any_uncondjump_p (bb->end)
1863                                    || any_condjump_p (bb->end)))))
1864         {
1865           error ("Too many outgoing branch edges from bb %i", bb->index);
1866           err = 1;
1867         }
1868       if (n_fallthru && any_uncondjump_p (bb->end))
1869         {
1870           error ("Fallthru edge after unconditional jump %i", bb->index);
1871           err = 1;
1872         }
1873       if (n_branch != 1 && any_uncondjump_p (bb->end))
1874         {
1875           error ("Wrong amount of branch edges after unconditional jump %i", bb->index);
1876           err = 1;
1877         }
1878       if (n_branch != 1 && any_condjump_p (bb->end)
1879           && JUMP_LABEL (bb->end) != bb->next_bb->head)
1880         {
1881           error ("Wrong amount of branch edges after conditional jump %i", bb->index);
1882           err = 1;
1883         }
1884       if (n_call && GET_CODE (bb->end) != CALL_INSN)
1885         {
1886           error ("Call edges for non-call insn in bb %i", bb->index);
1887           err = 1;
1888         }
1889       if (n_abnormal
1890           && (GET_CODE (bb->end) != CALL_INSN && n_call != n_abnormal)
1891           && (GET_CODE (bb->end) != JUMP_INSN
1892               || any_condjump_p (bb->end)
1893               || any_uncondjump_p (bb->end)))
1894         {
1895           error ("Abnormal edges for no purpose in bb %i", bb->index);
1896           err = 1;
1897         }
1898
1899       if (!n_fallthru)
1900         {
1901           rtx insn;
1902
1903           /* Ensure existence of barrier in BB with no fallthru edges.  */
1904           for (insn = bb->end; !insn || GET_CODE (insn) != BARRIER;
1905                insn = NEXT_INSN (insn))
1906             if (!insn
1907                 || (GET_CODE (insn) == NOTE
1908                     && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK))
1909                 {
1910                   error ("missing barrier after block %i", bb->index);
1911                   err = 1;
1912                   break;
1913                 }
1914         }
1915
1916       for (e = bb->pred; e; e = e->pred_next)
1917         {
1918           if (e->dest != bb)
1919             {
1920               error ("basic block %d pred edge is corrupted", bb->index);
1921               fputs ("Predecessor: ", stderr);
1922               dump_edge_info (stderr, e, 0);
1923               fputs ("\nSuccessor: ", stderr);
1924               dump_edge_info (stderr, e, 1);
1925               fputc ('\n', stderr);
1926               err = 1;
1927             }
1928           edge_checksum[e->dest->index + 2] -= (size_t) e;
1929         }
1930
1931       for (x = bb->head; x != NEXT_INSN (bb->end); x = NEXT_INSN (x))
1932         if (BLOCK_FOR_INSN (x) != bb)
1933           {
1934             debug_rtx (x);
1935             if (! BLOCK_FOR_INSN (x))
1936               error
1937                 ("insn %d inside basic block %d but block_for_insn is NULL",
1938                  INSN_UID (x), bb->index);
1939             else
1940               error
1941                 ("insn %d inside basic block %d but block_for_insn is %i",
1942                  INSN_UID (x), bb->index, BLOCK_FOR_INSN (x)->index);
1943
1944             err = 1;
1945           }
1946
1947       /* OK pointers are correct.  Now check the header of basic
1948          block.  It ought to contain optional CODE_LABEL followed
1949          by NOTE_BASIC_BLOCK.  */
1950       x = bb->head;
1951       if (GET_CODE (x) == CODE_LABEL)
1952         {
1953           if (bb->end == x)
1954             {
1955               error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
1956                      bb->index);
1957               err = 1;
1958             }
1959
1960           x = NEXT_INSN (x);
1961         }
1962
1963       if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
1964         {
1965           error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
1966                  bb->index);
1967           err = 1;
1968         }
1969
1970       if (bb->end == x)
1971         /* Do checks for empty blocks her. e */
1972         ;
1973       else
1974         for (x = NEXT_INSN (x); x; x = NEXT_INSN (x))
1975           {
1976             if (NOTE_INSN_BASIC_BLOCK_P (x))
1977               {
1978                 error ("NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d",
1979                        INSN_UID (x), bb->index);
1980                 err = 1;
1981               }
1982
1983             if (x == bb->end)
1984               break;
1985
1986             if (GET_CODE (x) == JUMP_INSN
1987                 || GET_CODE (x) == CODE_LABEL
1988                 || GET_CODE (x) == BARRIER)
1989               {
1990                 error ("in basic block %d:", bb->index);
1991                 fatal_insn ("flow control insn inside a basic block", x);
1992               }
1993           }
1994     }
1995
1996   /* Complete edge checksumming for ENTRY and EXIT.  */
1997   {
1998     edge e;
1999
2000     for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2001       edge_checksum[e->dest->index + 2] += (size_t) e;
2002
2003     for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
2004       edge_checksum[e->dest->index + 2] -= (size_t) e;
2005   }
2006
2007   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
2008     if (edge_checksum[bb->index + 2])
2009       {
2010         error ("basic block %i edge lists are corrupted", bb->index);
2011         err = 1;
2012       }
2013
2014   num_bb_notes = 0;
2015   last_bb_seen = ENTRY_BLOCK_PTR;
2016
2017   for (x = rtx_first; x; x = NEXT_INSN (x))
2018     {
2019       if (NOTE_INSN_BASIC_BLOCK_P (x))
2020         {
2021           bb = NOTE_BASIC_BLOCK (x);
2022
2023           num_bb_notes++;
2024           if (bb != last_bb_seen->next_bb)
2025             internal_error ("basic blocks not numbered consecutively");
2026
2027           last_bb_seen = bb;
2028         }
2029
2030       if (!bb_info[INSN_UID (x)])
2031         {
2032           switch (GET_CODE (x))
2033             {
2034             case BARRIER:
2035             case NOTE:
2036               break;
2037
2038             case CODE_LABEL:
2039               /* An addr_vec is placed outside any block block.  */
2040               if (NEXT_INSN (x)
2041                   && GET_CODE (NEXT_INSN (x)) == JUMP_INSN
2042                   && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
2043                       || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
2044                 x = NEXT_INSN (x);
2045
2046               /* But in any case, non-deletable labels can appear anywhere.  */
2047               break;
2048
2049             default:
2050               fatal_insn ("insn outside basic block", x);
2051             }
2052         }
2053
2054       if (INSN_P (x)
2055           && GET_CODE (x) == JUMP_INSN
2056           && returnjump_p (x) && ! condjump_p (x)
2057           && ! (NEXT_INSN (x) && GET_CODE (NEXT_INSN (x)) == BARRIER))
2058             fatal_insn ("return not followed by barrier", x);
2059     }
2060
2061   if (num_bb_notes != n_basic_blocks)
2062     internal_error
2063       ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2064        num_bb_notes, n_basic_blocks);
2065
2066   if (err)
2067     internal_error ("verify_flow_info failed");
2068
2069   /* Clean up.  */
2070   free (bb_info);
2071   free (last_visited);
2072   free (edge_checksum);
2073 }
2074 \f
2075 /* Assume that the preceding pass has possibly eliminated jump instructions
2076    or converted the unconditional jumps.  Eliminate the edges from CFG.
2077    Return true if any edges are eliminated.  */
2078
2079 bool
2080 purge_dead_edges (bb)
2081      basic_block bb;
2082 {
2083   edge e, next;
2084   rtx insn = bb->end, note;
2085   bool purged = false;
2086
2087   /* If this instruction cannot trap, remove REG_EH_REGION notes.  */
2088   if (GET_CODE (insn) == INSN
2089       && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
2090     {
2091       rtx eqnote;
2092
2093       if (! may_trap_p (PATTERN (insn))
2094           || ((eqnote = find_reg_equal_equiv_note (insn))
2095               && ! may_trap_p (XEXP (eqnote, 0))))
2096         remove_note (insn, note);
2097     }
2098
2099   /* Cleanup abnormal edges caused by exceptions or non-local gotos.  */
2100   for (e = bb->succ; e; e = next)
2101     {
2102       next = e->succ_next;
2103       if (e->flags & EDGE_EH)
2104         {
2105           if (can_throw_internal (bb->end))
2106             continue;
2107         }
2108       else if (e->flags & EDGE_ABNORMAL_CALL)
2109         {
2110           if (GET_CODE (bb->end) == CALL_INSN
2111               && (! (note = find_reg_note (insn, REG_EH_REGION, NULL))
2112                   || INTVAL (XEXP (note, 0)) >= 0))
2113             continue;
2114         }
2115       else
2116         continue;
2117
2118       remove_edge (e);
2119       bb->flags |= BB_DIRTY;
2120       purged = true;
2121     }
2122
2123   if (GET_CODE (insn) == JUMP_INSN)
2124     {
2125       rtx note;
2126       edge b,f;
2127
2128       /* We do care only about conditional jumps and simplejumps.  */
2129       if (!any_condjump_p (insn)
2130           && !returnjump_p (insn)
2131           && !simplejump_p (insn))
2132         return purged;
2133
2134       /* Branch probability/prediction notes are defined only for
2135          condjumps.  We've possibly turned condjump into simplejump.  */
2136       if (simplejump_p (insn))
2137         {
2138           note = find_reg_note (insn, REG_BR_PROB, NULL);
2139           if (note)
2140             remove_note (insn, note);
2141           while ((note = find_reg_note (insn, REG_BR_PRED, NULL)))
2142             remove_note (insn, note);
2143         }
2144
2145       for (e = bb->succ; e; e = next)
2146         {
2147           next = e->succ_next;
2148
2149           /* Avoid abnormal flags to leak from computed jumps turned
2150              into simplejumps.  */
2151
2152           e->flags &= ~EDGE_ABNORMAL;
2153
2154           /* See if this edge is one we should keep.  */
2155           if ((e->flags & EDGE_FALLTHRU) && any_condjump_p (insn))
2156             /* A conditional jump can fall through into the next
2157                block, so we should keep the edge.  */
2158             continue;
2159           else if (e->dest != EXIT_BLOCK_PTR
2160                    && e->dest->head == JUMP_LABEL (insn))
2161             /* If the destination block is the target of the jump,
2162                keep the edge.  */
2163             continue;
2164           else if (e->dest == EXIT_BLOCK_PTR && returnjump_p (insn))
2165             /* If the destination block is the exit block, and this
2166                instruction is a return, then keep the edge.  */
2167             continue;
2168           else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2169             /* Keep the edges that correspond to exceptions thrown by
2170                this instruction.  */
2171             continue;
2172
2173           /* We do not need this edge.  */
2174           bb->flags |= BB_DIRTY;
2175           purged = true;
2176           remove_edge (e);
2177         }
2178
2179       if (!bb->succ || !purged)
2180         return purged;
2181
2182       if (rtl_dump_file)
2183         fprintf (rtl_dump_file, "Purged edges from bb %i\n", bb->index);
2184
2185       if (!optimize)
2186         return purged;
2187
2188       /* Redistribute probabilities.  */
2189       if (!bb->succ->succ_next)
2190         {
2191           bb->succ->probability = REG_BR_PROB_BASE;
2192           bb->succ->count = bb->count;
2193         }
2194       else
2195         {
2196           note = find_reg_note (insn, REG_BR_PROB, NULL);
2197           if (!note)
2198             return purged;
2199
2200           b = BRANCH_EDGE (bb);
2201           f = FALLTHRU_EDGE (bb);
2202           b->probability = INTVAL (XEXP (note, 0));
2203           f->probability = REG_BR_PROB_BASE - b->probability;
2204           b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2205           f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2206         }
2207
2208       return purged;
2209     }
2210
2211   /* If we don't see a jump insn, we don't know exactly why the block would
2212      have been broken at this point.  Look for a simple, non-fallthru edge,
2213      as these are only created by conditional branches.  If we find such an
2214      edge we know that there used to be a jump here and can then safely
2215      remove all non-fallthru edges.  */
2216   for (e = bb->succ; e && (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU));
2217        e = e->succ_next)
2218     ;
2219
2220   if (!e)
2221     return purged;
2222
2223   for (e = bb->succ; e; e = next)
2224     {
2225       next = e->succ_next;
2226       if (!(e->flags & EDGE_FALLTHRU))
2227         {
2228           bb->flags |= BB_DIRTY;
2229           remove_edge (e);
2230           purged = true;
2231         }
2232     }
2233
2234   if (!bb->succ || bb->succ->succ_next)
2235     abort ();
2236
2237   bb->succ->probability = REG_BR_PROB_BASE;
2238   bb->succ->count = bb->count;
2239
2240   if (rtl_dump_file)
2241     fprintf (rtl_dump_file, "Purged non-fallthru edges from bb %i\n",
2242              bb->index);
2243   return purged;
2244 }
2245
2246 /* Search all basic blocks for potentially dead edges and purge them.  Return
2247    true if some edge has been eliminated.  */
2248
2249 bool
2250 purge_all_dead_edges (update_life_p)
2251      int update_life_p;
2252 {
2253   int purged = false;
2254   sbitmap blocks = 0;
2255   basic_block bb;
2256
2257   if (update_life_p)
2258     {
2259       blocks = sbitmap_alloc (last_basic_block);
2260       sbitmap_zero (blocks);
2261     }
2262
2263   FOR_EACH_BB (bb)
2264     {
2265       bool purged_here = purge_dead_edges (bb);
2266
2267       purged |= purged_here;
2268       if (purged_here && update_life_p)
2269         SET_BIT (blocks, bb->index);
2270     }
2271
2272   if (update_life_p && purged)
2273     update_life_info (blocks, UPDATE_LIFE_GLOBAL,
2274                       PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
2275                       | PROP_KILL_DEAD_CODE);
2276
2277   if (update_life_p)
2278     sbitmap_free (blocks);
2279   return purged;
2280 }