OSDN Git Service

* cfgexpand.c (add_reg_br_prob_note): New function.
[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, 2003, 2004 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      - Basic CFG/RTL manipulation API documented in cfghooks.h
27      - CFG-aware instruction chain manipulation
28          delete_insn, delete_insn_chain
29      - Edge splitting and committing to edges
30          insert_insn_on_edge, commit_edge_insertions
31      - CFG updating after insn simplification
32          purge_dead_edges, purge_all_dead_edges
33
34    Functions not supposed for generic use:
35      - Infrastructure to determine quickly basic block for insn
36          compute_bb_for_insn, update_bb_for_insn, set_block_for_insn,
37      - Edge redirection with updating and optimizing of insn chain
38          block_label, tidy_fallthru_edge, force_nonfallthru  */
39 \f
40 #include "config.h"
41 #include "system.h"
42 #include "coretypes.h"
43 #include "tm.h"
44 #include "tree.h"
45 #include "rtl.h"
46 #include "hard-reg-set.h"
47 #include "basic-block.h"
48 #include "regs.h"
49 #include "flags.h"
50 #include "output.h"
51 #include "function.h"
52 #include "except.h"
53 #include "toplev.h"
54 #include "tm_p.h"
55 #include "obstack.h"
56 #include "insn-config.h"
57 #include "cfglayout.h"
58 #include "expr.h"
59 #include "target.h"
60
61
62 /* The labels mentioned in non-jump rtl.  Valid during find_basic_blocks.  */
63 /* ??? Should probably be using LABEL_NUSES instead.  It would take a
64    bit of surgery to be able to use or co-opt the routines in jump.  */
65 rtx label_value_list;
66
67 static int can_delete_note_p (rtx);
68 static int can_delete_label_p (rtx);
69 static void commit_one_edge_insertion (edge, int);
70 static rtx last_loop_beg_note (rtx);
71 static bool back_edge_of_syntactic_loop_p (basic_block, basic_block);
72 basic_block force_nonfallthru_and_redirect (edge, basic_block);
73 static basic_block rtl_split_edge (edge);
74 static bool rtl_move_block_after (basic_block, basic_block);
75 static int rtl_verify_flow_info (void);
76 static basic_block cfg_layout_split_block (basic_block, void *);
77 static edge cfg_layout_redirect_edge_and_branch (edge, basic_block);
78 static basic_block cfg_layout_redirect_edge_and_branch_force (edge, basic_block);
79 static void cfg_layout_delete_block (basic_block);
80 static void rtl_delete_block (basic_block);
81 static basic_block rtl_redirect_edge_and_branch_force (edge, basic_block);
82 static edge rtl_redirect_edge_and_branch (edge, basic_block);
83 static basic_block rtl_split_block (basic_block, void *);
84 static void rtl_dump_bb (basic_block, FILE *, int);
85 static int rtl_verify_flow_info_1 (void);
86 static void mark_killed_regs (rtx, rtx, void *);
87 static void rtl_make_forwarder_block (edge);
88 \f
89 /* Return true if NOTE is not one of the ones that must be kept paired,
90    so that we may simply delete it.  */
91
92 static int
93 can_delete_note_p (rtx note)
94 {
95   return (NOTE_LINE_NUMBER (note) == NOTE_INSN_DELETED
96           || NOTE_LINE_NUMBER (note) == NOTE_INSN_BASIC_BLOCK
97           || NOTE_LINE_NUMBER (note) == NOTE_INSN_UNLIKELY_EXECUTED_CODE);
98 }
99
100 /* True if a given label can be deleted.  */
101
102 static int
103 can_delete_label_p (rtx label)
104 {
105   return (!LABEL_PRESERVE_P (label)
106           /* User declared labels must be preserved.  */
107           && LABEL_NAME (label) == 0
108           && !in_expr_list_p (forced_labels, label)
109           && !in_expr_list_p (label_value_list, label));
110 }
111
112 /* Delete INSN by patching it out.  Return the next insn.  */
113
114 rtx
115 delete_insn (rtx insn)
116 {
117   rtx next = NEXT_INSN (insn);
118   rtx note;
119   bool really_delete = true;
120
121   if (LABEL_P (insn))
122     {
123       /* Some labels can't be directly removed from the INSN chain, as they
124          might be references via variables, constant pool etc.
125          Convert them to the special NOTE_INSN_DELETED_LABEL note.  */
126       if (! can_delete_label_p (insn))
127         {
128           const char *name = LABEL_NAME (insn);
129
130           really_delete = false;
131           PUT_CODE (insn, NOTE);
132           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED_LABEL;
133           NOTE_DELETED_LABEL_NAME (insn) = name;
134         }
135
136       remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
137     }
138
139   if (really_delete)
140     {
141       /* If this insn has already been deleted, something is very wrong.  */
142       gcc_assert (!INSN_DELETED_P (insn));
143       remove_insn (insn);
144       INSN_DELETED_P (insn) = 1;
145     }
146
147   /* If deleting a jump, decrement the use count of the label.  Deleting
148      the label itself should happen in the normal course of block merging.  */
149   if (JUMP_P (insn)
150       && JUMP_LABEL (insn)
151       && LABEL_P (JUMP_LABEL (insn)))
152     LABEL_NUSES (JUMP_LABEL (insn))--;
153
154   /* Also if deleting an insn that references a label.  */
155   else
156     {
157       while ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX
158              && LABEL_P (XEXP (note, 0)))
159         {
160           LABEL_NUSES (XEXP (note, 0))--;
161           remove_note (insn, note);
162         }
163     }
164
165   if (JUMP_P (insn)
166       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
167           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
168     {
169       rtx pat = PATTERN (insn);
170       int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
171       int len = XVECLEN (pat, diff_vec_p);
172       int i;
173
174       for (i = 0; i < len; i++)
175         {
176           rtx label = XEXP (XVECEXP (pat, diff_vec_p, i), 0);
177
178           /* When deleting code in bulk (e.g. removing many unreachable
179              blocks) we can delete a label that's a target of the vector
180              before deleting the vector itself.  */
181           if (!NOTE_P (label))
182             LABEL_NUSES (label)--;
183         }
184     }
185
186   return next;
187 }
188
189 /* Like delete_insn but also purge dead edges from BB.  */
190 rtx
191 delete_insn_and_edges (rtx insn)
192 {
193   rtx x;
194   bool purge = false;
195
196   if (INSN_P (insn)
197       && BLOCK_FOR_INSN (insn)
198       && BB_END (BLOCK_FOR_INSN (insn)) == insn)
199     purge = true;
200   x = delete_insn (insn);
201   if (purge)
202     purge_dead_edges (BLOCK_FOR_INSN (insn));
203   return x;
204 }
205
206 /* Unlink a chain of insns between START and FINISH, leaving notes
207    that must be paired.  */
208
209 void
210 delete_insn_chain (rtx start, rtx finish)
211 {
212   rtx next;
213
214   /* Unchain the insns one by one.  It would be quicker to delete all of these
215      with a single unchaining, rather than one at a time, but we need to keep
216      the NOTE's.  */
217   while (1)
218     {
219       next = NEXT_INSN (start);
220       if (NOTE_P (start) && !can_delete_note_p (start))
221         ;
222       else
223         next = delete_insn (start);
224
225       if (start == finish)
226         break;
227       start = next;
228     }
229 }
230
231 /* Like delete_insn but also purge dead edges from BB.  */
232 void
233 delete_insn_chain_and_edges (rtx first, rtx last)
234 {
235   bool purge = false;
236
237   if (INSN_P (last)
238       && BLOCK_FOR_INSN (last)
239       && BB_END (BLOCK_FOR_INSN (last)) == last)
240     purge = true;
241   delete_insn_chain (first, last);
242   if (purge)
243     purge_dead_edges (BLOCK_FOR_INSN (last));
244 }
245 \f
246 /* Create a new basic block consisting of the instructions between HEAD and END
247    inclusive.  This function is designed to allow fast BB construction - reuses
248    the note and basic block struct in BB_NOTE, if any and do not grow
249    BASIC_BLOCK chain and should be used directly only by CFG construction code.
250    END can be NULL in to create new empty basic block before HEAD.  Both END
251    and HEAD can be NULL to create basic block at the end of INSN chain.
252    AFTER is the basic block we should be put after.  */
253
254 basic_block
255 create_basic_block_structure (rtx head, rtx end, rtx bb_note, basic_block after)
256 {
257   basic_block bb;
258
259   if (bb_note
260       && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
261       && bb->aux == NULL)
262     {
263       /* If we found an existing note, thread it back onto the chain.  */
264
265       rtx after;
266
267       if (LABEL_P (head))
268         after = head;
269       else
270         {
271           after = PREV_INSN (head);
272           head = bb_note;
273         }
274
275       if (after != bb_note && NEXT_INSN (after) != bb_note)
276         reorder_insns_nobb (bb_note, bb_note, after);
277     }
278   else
279     {
280       /* Otherwise we must create a note and a basic block structure.  */
281
282       bb = alloc_block ();
283
284       if (!head && !end)
285         head = end = bb_note
286           = emit_note_after (NOTE_INSN_BASIC_BLOCK, get_last_insn ());
287       else if (LABEL_P (head) && end)
288         {
289           bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
290           if (head == end)
291             end = bb_note;
292         }
293       else
294         {
295           bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
296           head = bb_note;
297           if (!end)
298             end = head;
299         }
300
301       NOTE_BASIC_BLOCK (bb_note) = bb;
302     }
303
304   /* Always include the bb note in the block.  */
305   if (NEXT_INSN (end) == bb_note)
306     end = bb_note;
307
308   BB_HEAD (bb) = head;
309   BB_END (bb) = end;
310   bb->index = last_basic_block++;
311   bb->flags = BB_NEW;
312   link_block (bb, after);
313   BASIC_BLOCK (bb->index) = bb;
314   update_bb_for_insn (bb);
315   BB_SET_PARTITION (bb, BB_UNPARTITIONED);
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 after block AFTER.  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 static basic_block
330 rtl_create_basic_block (void *headp, void *endp, basic_block after)
331 {
332   rtx head = headp, end = endp;
333   basic_block bb;
334
335   /* Grow the basic block array if needed.  */
336   if ((size_t) last_basic_block >= VARRAY_SIZE (basic_block_info))
337     {
338       size_t new_size = last_basic_block + (last_basic_block + 3) / 4;
339       VARRAY_GROW (basic_block_info, new_size);
340     }
341
342   n_basic_blocks++;
343
344   bb = create_basic_block_structure (head, end, NULL, after);
345   bb->aux = NULL;
346   return bb;
347 }
348
349 static basic_block
350 cfg_layout_create_basic_block (void *head, void *end, basic_block after)
351 {
352   basic_block newbb = rtl_create_basic_block (head, end, after);
353
354   initialize_bb_rbi (newbb);
355   return newbb;
356 }
357 \f
358 /* Delete the insns in a (non-live) block.  We physically delete every
359    non-deleted-note insn, and update the flow graph appropriately.
360
361    Return nonzero if we deleted an exception handler.  */
362
363 /* ??? Preserving all such notes strikes me as wrong.  It would be nice
364    to post-process the stream to remove empty blocks, loops, ranges, etc.  */
365
366 static void
367 rtl_delete_block (basic_block b)
368 {
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 = BB_HEAD (b);
379
380   if (LABEL_P (insn))
381     maybe_remove_eh_handler (insn);
382
383   /* Include any jump table following the basic block.  */
384   end = BB_END (b);
385   if (tablejump_p (end, NULL, &tmp))
386     end = tmp;
387
388   /* Include any barrier that may follow the basic block.  */
389   tmp = next_nonnote_insn (end);
390   if (tmp && BARRIER_P (tmp))
391     end = tmp;
392
393   /* Selectively delete the entire chain.  */
394   BB_HEAD (b) = NULL;
395   delete_insn_chain (insn, end);
396 }
397 \f
398 /* Records the basic block struct in BLOCK_FOR_INSN for every insn.  */
399
400 void
401 compute_bb_for_insn (void)
402 {
403   basic_block bb;
404
405   FOR_EACH_BB (bb)
406     {
407       rtx end = BB_END (bb);
408       rtx insn;
409
410       for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
411         {
412           BLOCK_FOR_INSN (insn) = bb;
413           if (insn == end)
414             break;
415         }
416     }
417 }
418
419 /* Release the basic_block_for_insn array.  */
420
421 void
422 free_bb_for_insn (void)
423 {
424   rtx insn;
425   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
426     if (!BARRIER_P (insn))
427       BLOCK_FOR_INSN (insn) = NULL;
428 }
429
430 /* Return RTX to emit after when we want to emit code on the entry of function.  */
431 rtx
432 entry_of_function (void)
433 {
434   return (n_basic_blocks ? BB_HEAD (ENTRY_BLOCK_PTR->next_bb) : get_insns ());
435 }
436
437 /* Update insns block within BB.  */
438
439 void
440 update_bb_for_insn (basic_block bb)
441 {
442   rtx insn;
443
444   for (insn = BB_HEAD (bb); ; insn = NEXT_INSN (insn))
445     {
446       if (!BARRIER_P (insn))
447         set_block_for_insn (insn, bb);
448       if (insn == BB_END (bb))
449         break;
450     }
451 }
452 \f
453 /* Creates a new basic block just after basic block B by splitting
454    everything after specified instruction I.  */
455
456 static basic_block
457 rtl_split_block (basic_block bb, void *insnp)
458 {
459   basic_block new_bb;
460   rtx insn = insnp;
461   edge e;
462
463   if (!insn)
464     {
465       insn = first_insn_after_basic_block_note (bb);
466
467       if (insn)
468         insn = PREV_INSN (insn);
469       else
470         insn = get_last_insn ();
471     }
472
473   /* We probably should check type of the insn so that we do not create
474      inconsistent cfg.  It is checked in verify_flow_info anyway, so do not
475      bother.  */
476   if (insn == BB_END (bb))
477     emit_note_after (NOTE_INSN_DELETED, insn);
478
479   /* Create the new basic block.  */
480   new_bb = create_basic_block (NEXT_INSN (insn), BB_END (bb), bb);
481   BB_COPY_PARTITION (new_bb, bb);
482   BB_END (bb) = insn;
483
484   /* Redirect the outgoing edges.  */
485   new_bb->succ = bb->succ;
486   bb->succ = NULL;
487   for (e = new_bb->succ; e; e = e->succ_next)
488     e->src = new_bb;
489
490   if (bb->global_live_at_start)
491     {
492       new_bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
493       new_bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
494       COPY_REG_SET (new_bb->global_live_at_end, bb->global_live_at_end);
495
496       /* We now have to calculate which registers are live at the end
497          of the split basic block and at the start of the new basic
498          block.  Start with those registers that are known to be live
499          at the end of the original basic block and get
500          propagate_block to determine which registers are live.  */
501       COPY_REG_SET (new_bb->global_live_at_start, bb->global_live_at_end);
502       propagate_block (new_bb, new_bb->global_live_at_start, NULL, NULL, 0);
503       COPY_REG_SET (bb->global_live_at_end,
504                     new_bb->global_live_at_start);
505 #ifdef HAVE_conditional_execution
506       /* In the presence of conditional execution we are not able to update
507          liveness precisely.  */
508       if (reload_completed)
509         {
510           bb->flags |= BB_DIRTY;
511           new_bb->flags |= BB_DIRTY;
512         }
513 #endif
514     }
515
516   return new_bb;
517 }
518
519 /* Blocks A and B are to be merged into a single block A.  The insns
520    are already contiguous.  */
521
522 static void
523 rtl_merge_blocks (basic_block a, basic_block b)
524 {
525   rtx b_head = BB_HEAD (b), b_end = BB_END (b), a_end = BB_END (a);
526   rtx del_first = NULL_RTX, del_last = NULL_RTX;
527   int b_empty = 0;
528
529   /* If there was a CODE_LABEL beginning B, delete it.  */
530   if (LABEL_P (b_head))
531     {
532       /* Detect basic blocks with nothing but a label.  This can happen
533          in particular at the end of a function.  */
534       if (b_head == b_end)
535         b_empty = 1;
536
537       del_first = del_last = b_head;
538       b_head = NEXT_INSN (b_head);
539     }
540
541   /* Delete the basic block note and handle blocks containing just that
542      note.  */
543   if (NOTE_INSN_BASIC_BLOCK_P (b_head))
544     {
545       if (b_head == b_end)
546         b_empty = 1;
547       if (! del_last)
548         del_first = b_head;
549
550       del_last = b_head;
551       b_head = NEXT_INSN (b_head);
552     }
553
554   /* If there was a jump out of A, delete it.  */
555   if (JUMP_P (a_end))
556     {
557       rtx prev;
558
559       for (prev = PREV_INSN (a_end); ; prev = PREV_INSN (prev))
560         if (!NOTE_P (prev)
561             || NOTE_LINE_NUMBER (prev) == NOTE_INSN_BASIC_BLOCK
562             || prev == BB_HEAD (a))
563           break;
564
565       del_first = a_end;
566
567 #ifdef HAVE_cc0
568       /* If this was a conditional jump, we need to also delete
569          the insn that set cc0.  */
570       if (only_sets_cc0_p (prev))
571         {
572           rtx tmp = prev;
573
574           prev = prev_nonnote_insn (prev);
575           if (!prev)
576             prev = BB_HEAD (a);
577           del_first = tmp;
578         }
579 #endif
580
581       a_end = PREV_INSN (del_first);
582     }
583   else if (BARRIER_P (NEXT_INSN (a_end)))
584     del_first = NEXT_INSN (a_end);
585
586   /* Delete everything marked above as well as crap that might be
587      hanging out between the two blocks.  */
588   BB_HEAD (b) = NULL;
589   delete_insn_chain (del_first, del_last);
590
591   /* Reassociate the insns of B with A.  */
592   if (!b_empty)
593     {
594       rtx x;
595
596       for (x = a_end; x != b_end; x = NEXT_INSN (x))
597         set_block_for_insn (x, a);
598
599       set_block_for_insn (b_end, a);
600
601       a_end = b_end;
602     }
603
604   BB_END (a) = a_end;
605 }
606
607 /* Return true when block A and B can be merged.  */
608 static bool
609 rtl_can_merge_blocks (basic_block a,basic_block b)
610 {
611   /* If we are partitioning hot/cold basic blocks, we don't want to
612      mess up unconditional or indirect jumps that cross between hot
613      and cold sections.
614
615      Basic block partitioning may result in some jumps that appear to
616      be optimizable (or blocks that appear to be mergeable), but which really 
617      must be left untouched (they are required to make it safely across 
618      partition boundaries).  See  the comments at the top of 
619      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
620
621   if (flag_reorder_blocks_and_partition
622       && (find_reg_note (BB_END (a), REG_CROSSING_JUMP, NULL_RTX)
623           || find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX)
624           || BB_PARTITION (a) != BB_PARTITION (b)))
625     return false;
626
627   /* There must be exactly one edge in between the blocks.  */
628   return (a->succ && !a->succ->succ_next && a->succ->dest == b
629           && !b->pred->pred_next && a != b
630           /* Must be simple edge.  */
631           && !(a->succ->flags & EDGE_COMPLEX)
632           && a->next_bb == b
633           && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
634           /* If the jump insn has side effects,
635              we can't kill the edge.  */
636           && (!JUMP_P (BB_END (a))
637               || (reload_completed
638                   ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
639 }
640 \f
641 /* Return the label in the head of basic block BLOCK.  Create one if it doesn't
642    exist.  */
643
644 rtx
645 block_label (basic_block block)
646 {
647   if (block == EXIT_BLOCK_PTR)
648     return NULL_RTX;
649
650   if (!LABEL_P (BB_HEAD (block)))
651     {
652       BB_HEAD (block) = emit_label_before (gen_label_rtx (), BB_HEAD (block));
653     }
654
655   return BB_HEAD (block);
656 }
657
658 /* Attempt to perform edge redirection by replacing possibly complex jump
659    instruction by unconditional jump or removing jump completely.  This can
660    apply only if all edges now point to the same block.  The parameters and
661    return values are equivalent to redirect_edge_and_branch.  */
662
663 edge
664 try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
665 {
666   basic_block src = e->src;
667   rtx insn = BB_END (src), kill_from;
668   edge tmp;
669   rtx set;
670   int fallthru = 0;
671
672
673   /* If we are partitioning hot/cold basic blocks, we don't want to
674      mess up unconditional or indirect jumps that cross between hot
675      and cold sections.
676
677      Basic block partitioning may result in some jumps that appear to
678      be optimizable (or blocks that appear to be mergeable), but which really 
679      must be left untouched (they are required to make it safely across 
680      partition boundaries).  See  the comments at the top of 
681      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
682   
683   if (flag_reorder_blocks_and_partition
684       && (find_reg_note (insn, REG_CROSSING_JUMP, NULL_RTX)
685           || BB_PARTITION (src) != BB_PARTITION (target)))
686     return NULL;
687
688   /* Verify that all targets will be TARGET.  */
689   for (tmp = src->succ; tmp; tmp = tmp->succ_next)
690     if (tmp->dest != target && tmp != e)
691       break;
692
693   if (tmp || !onlyjump_p (insn))
694     return NULL;
695   if ((!optimize || reload_completed) && tablejump_p (insn, NULL, NULL))
696     return NULL;
697
698   /* Avoid removing branch with side effects.  */
699   set = single_set (insn);
700   if (!set || side_effects_p (set))
701     return NULL;
702
703   /* In case we zap a conditional jump, we'll need to kill
704      the cc0 setter too.  */
705   kill_from = insn;
706 #ifdef HAVE_cc0
707   if (reg_mentioned_p (cc0_rtx, PATTERN (insn)))
708     kill_from = PREV_INSN (insn);
709 #endif
710
711   /* See if we can create the fallthru edge.  */
712   if (in_cfglayout || can_fallthru (src, target))
713     {
714       if (dump_file)
715         fprintf (dump_file, "Removing jump %i.\n", INSN_UID (insn));
716       fallthru = 1;
717
718       /* Selectively unlink whole insn chain.  */
719       if (in_cfglayout)
720         {
721           rtx insn = src->rbi->footer;
722
723           delete_insn_chain (kill_from, BB_END (src));
724
725           /* Remove barriers but keep jumptables.  */
726           while (insn)
727             {
728               if (BARRIER_P (insn))
729                 {
730                   if (PREV_INSN (insn))
731                     NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
732                   else
733                     src->rbi->footer = NEXT_INSN (insn);
734                   if (NEXT_INSN (insn))
735                     PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
736                 }
737               if (LABEL_P (insn))
738                 break;
739               insn = NEXT_INSN (insn);
740             }
741         }
742       else
743         delete_insn_chain (kill_from, PREV_INSN (BB_HEAD (target)));
744     }
745
746   /* If this already is simplejump, redirect it.  */
747   else if (simplejump_p (insn))
748     {
749       if (e->dest == target)
750         return NULL;
751       if (dump_file)
752         fprintf (dump_file, "Redirecting jump %i from %i to %i.\n",
753                  INSN_UID (insn), e->dest->index, target->index);
754       if (!redirect_jump (insn, block_label (target), 0))
755         {
756           gcc_assert (target == EXIT_BLOCK_PTR);
757           return NULL;
758         }
759     }
760
761   /* Cannot do anything for target exit block.  */
762   else if (target == EXIT_BLOCK_PTR)
763     return NULL;
764
765   /* Or replace possibly complicated jump insn by simple jump insn.  */
766   else
767     {
768       rtx target_label = block_label (target);
769       rtx barrier, label, table;
770
771       emit_jump_insn_after (gen_jump (target_label), insn);
772       JUMP_LABEL (BB_END (src)) = target_label;
773       LABEL_NUSES (target_label)++;
774       if (dump_file)
775         fprintf (dump_file, "Replacing insn %i by jump %i\n",
776                  INSN_UID (insn), INSN_UID (BB_END (src)));
777
778
779       delete_insn_chain (kill_from, insn);
780
781       /* Recognize a tablejump that we are converting to a
782          simple jump and remove its associated CODE_LABEL
783          and ADDR_VEC or ADDR_DIFF_VEC.  */
784       if (tablejump_p (insn, &label, &table))
785         delete_insn_chain (label, table);
786
787       barrier = next_nonnote_insn (BB_END (src));
788       if (!barrier || !BARRIER_P (barrier))
789         emit_barrier_after (BB_END (src));
790       else
791         {
792           if (barrier != NEXT_INSN (BB_END (src)))
793             {
794               /* Move the jump before barrier so that the notes
795                  which originally were or were created before jump table are
796                  inside the basic block.  */
797               rtx new_insn = BB_END (src);
798               rtx tmp;
799
800               for (tmp = NEXT_INSN (BB_END (src)); tmp != barrier;
801                    tmp = NEXT_INSN (tmp))
802                 set_block_for_insn (tmp, src);
803
804               NEXT_INSN (PREV_INSN (new_insn)) = NEXT_INSN (new_insn);
805               PREV_INSN (NEXT_INSN (new_insn)) = PREV_INSN (new_insn);
806
807               NEXT_INSN (new_insn) = barrier;
808               NEXT_INSN (PREV_INSN (barrier)) = new_insn;
809
810               PREV_INSN (new_insn) = PREV_INSN (barrier);
811               PREV_INSN (barrier) = new_insn;
812             }
813         }
814     }
815
816   /* Keep only one edge out and set proper flags.  */
817   while (src->succ->succ_next)
818     remove_edge (src->succ);
819   e = src->succ;
820   if (fallthru)
821     e->flags = EDGE_FALLTHRU;
822   else
823     e->flags = 0;
824
825   e->probability = REG_BR_PROB_BASE;
826   e->count = src->count;
827
828   /* We don't want a block to end on a line-number note since that has
829      the potential of changing the code between -g and not -g.  */
830   while (NOTE_P (BB_END (e->src))
831          && NOTE_LINE_NUMBER (BB_END (e->src)) >= 0)
832     delete_insn (BB_END (e->src));
833
834   if (e->dest != target)
835     redirect_edge_succ (e, target);
836
837   return e;
838 }
839
840 /* Return last loop_beg note appearing after INSN, before start of next
841    basic block.  Return INSN if there are no such notes.
842
843    When emitting jump to redirect a fallthru edge, it should always appear
844    after the LOOP_BEG notes, as loop optimizer expect loop to either start by
845    fallthru edge or jump following the LOOP_BEG note jumping to the loop exit
846    test.  */
847
848 static rtx
849 last_loop_beg_note (rtx insn)
850 {
851   rtx last = insn;
852
853   for (insn = NEXT_INSN (insn); insn && NOTE_P (insn)
854        && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK;
855        insn = NEXT_INSN (insn))
856     if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
857       last = insn;
858
859   return last;
860 }
861
862 /* Redirect edge representing branch of (un)conditional jump or tablejump,
863    NULL on failure  */
864 static edge
865 redirect_branch_edge (edge e, basic_block target)
866 {
867   rtx tmp;
868   rtx old_label = BB_HEAD (e->dest);
869   basic_block src = e->src;
870   rtx insn = BB_END (src);
871
872   /* We can only redirect non-fallthru edges of jump insn.  */
873   if (e->flags & EDGE_FALLTHRU)
874     return NULL;
875   else if (!JUMP_P (insn))
876     return NULL;
877
878   /* Recognize a tablejump and adjust all matching cases.  */
879   if (tablejump_p (insn, NULL, &tmp))
880     {
881       rtvec vec;
882       int j;
883       rtx new_label = block_label (target);
884
885       if (target == EXIT_BLOCK_PTR)
886         return NULL;
887       if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
888         vec = XVEC (PATTERN (tmp), 0);
889       else
890         vec = XVEC (PATTERN (tmp), 1);
891
892       for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
893         if (XEXP (RTVEC_ELT (vec, j), 0) == old_label)
894           {
895             RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (Pmode, new_label);
896             --LABEL_NUSES (old_label);
897             ++LABEL_NUSES (new_label);
898           }
899
900       /* Handle casesi dispatch insns.  */
901       if ((tmp = single_set (insn)) != NULL
902           && SET_DEST (tmp) == pc_rtx
903           && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
904           && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF
905           && XEXP (XEXP (SET_SRC (tmp), 2), 0) == old_label)
906         {
907           XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (VOIDmode,
908                                                        new_label);
909           --LABEL_NUSES (old_label);
910           ++LABEL_NUSES (new_label);
911         }
912     }
913   else
914     {
915       /* ?? We may play the games with moving the named labels from
916          one basic block to the other in case only one computed_jump is
917          available.  */
918       if (computed_jump_p (insn)
919           /* A return instruction can't be redirected.  */
920           || returnjump_p (insn))
921         return NULL;
922
923       /* If the insn doesn't go where we think, we're confused.  */
924       gcc_assert (JUMP_LABEL (insn) == old_label);
925
926       /* If the substitution doesn't succeed, die.  This can happen
927          if the back end emitted unrecognizable instructions or if
928          target is exit block on some arches.  */
929       if (!redirect_jump (insn, block_label (target), 0))
930         {
931           gcc_assert (target == EXIT_BLOCK_PTR);
932           return NULL;
933         }
934     }
935
936   if (dump_file)
937     fprintf (dump_file, "Edge %i->%i redirected to %i\n",
938              e->src->index, e->dest->index, target->index);
939
940   if (e->dest != target)
941     e = redirect_edge_succ_nodup (e, target);
942   return e;
943 }
944
945 /* Attempt to change code to redirect edge E to TARGET.  Don't do that on
946    expense of adding new instructions or reordering basic blocks.
947
948    Function can be also called with edge destination equivalent to the TARGET.
949    Then it should try the simplifications and do nothing if none is possible.
950
951    Return edge representing the branch if transformation succeeded.  Return NULL
952    on failure.
953    We still return NULL in case E already destinated TARGET and we didn't
954    managed to simplify instruction stream.  */
955
956 static edge
957 rtl_redirect_edge_and_branch (edge e, basic_block target)
958 {
959   edge ret;
960   basic_block src = e->src;
961
962   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
963     return NULL;
964
965   if (e->dest == target)
966     return e;
967
968   if ((ret = try_redirect_by_replacing_jump (e, target, false)) != NULL)
969     {
970       src->flags |= BB_DIRTY;
971       return ret;
972     }
973
974   ret = redirect_branch_edge (e, target);
975   if (!ret)
976     return NULL;
977
978   src->flags |= BB_DIRTY;
979   return ret;
980 }
981
982 /* Like force_nonfallthru below, but additionally performs redirection
983    Used by redirect_edge_and_branch_force.  */
984
985 basic_block
986 force_nonfallthru_and_redirect (edge e, basic_block target)
987 {
988   basic_block jump_block, new_bb = NULL, src = e->src;
989   rtx note;
990   edge new_edge;
991   int abnormal_edge_flags = 0;
992
993   /* In the case the last instruction is conditional jump to the next
994      instruction, first redirect the jump itself and then continue
995      by creating a basic block afterwards to redirect fallthru edge.  */
996   if (e->src != ENTRY_BLOCK_PTR && e->dest != EXIT_BLOCK_PTR
997       && any_condjump_p (BB_END (e->src))
998       /* When called from cfglayout, fallthru edges do not
999          necessarily go to the next block.  */
1000       && e->src->next_bb == e->dest
1001       && JUMP_LABEL (BB_END (e->src)) == BB_HEAD (e->dest))
1002     {
1003       rtx note;
1004       edge b = unchecked_make_edge (e->src, target, 0);
1005       bool redirected;
1006
1007       redirected = redirect_jump (BB_END (e->src), block_label (target), 0);
1008       gcc_assert (redirected);
1009       
1010       note = find_reg_note (BB_END (e->src), REG_BR_PROB, NULL_RTX);
1011       if (note)
1012         {
1013           int prob = INTVAL (XEXP (note, 0));
1014
1015           b->probability = prob;
1016           b->count = e->count * prob / REG_BR_PROB_BASE;
1017           e->probability -= e->probability;
1018           e->count -= b->count;
1019           if (e->probability < 0)
1020             e->probability = 0;
1021           if (e->count < 0)
1022             e->count = 0;
1023         }
1024     }
1025
1026   if (e->flags & EDGE_ABNORMAL)
1027     {
1028       /* Irritating special case - fallthru edge to the same block as abnormal
1029          edge.
1030          We can't redirect abnormal edge, but we still can split the fallthru
1031          one and create separate abnormal edge to original destination.
1032          This allows bb-reorder to make such edge non-fallthru.  */
1033       gcc_assert (e->dest == target);
1034       abnormal_edge_flags = e->flags & ~(EDGE_FALLTHRU | EDGE_CAN_FALLTHRU);
1035       e->flags &= EDGE_FALLTHRU | EDGE_CAN_FALLTHRU;
1036     }
1037   else
1038     {
1039       gcc_assert (e->flags & EDGE_FALLTHRU);
1040       if (e->src == ENTRY_BLOCK_PTR)
1041         {
1042           /* We can't redirect the entry block.  Create an empty block
1043              at the start of the function which we use to add the new
1044              jump.  */
1045           edge *pe1;
1046           basic_block bb
1047             = create_basic_block (BB_HEAD (e->dest), NULL, ENTRY_BLOCK_PTR);
1048
1049           /* Change the existing edge's source to be the new block, and add
1050              a new edge from the entry block to the new block.  */
1051           e->src = bb;
1052           for (pe1 = &ENTRY_BLOCK_PTR->succ; *pe1; pe1 = &(*pe1)->succ_next)
1053             if (*pe1 == e)
1054               {
1055                 *pe1 = e->succ_next;
1056                 break;
1057               }
1058           e->succ_next = 0;
1059           bb->succ = e;
1060           make_single_succ_edge (ENTRY_BLOCK_PTR, bb, EDGE_FALLTHRU);
1061         }
1062     }
1063
1064   if (e->src->succ->succ_next || abnormal_edge_flags)
1065     {
1066       /* Create the new structures.  */
1067
1068       /* If the old block ended with a tablejump, skip its table
1069          by searching forward from there.  Otherwise start searching
1070          forward from the last instruction of the old block.  */
1071       if (!tablejump_p (BB_END (e->src), NULL, &note))
1072         note = BB_END (e->src);
1073
1074       /* Position the new block correctly relative to loop notes.  */
1075       note = last_loop_beg_note (note);
1076       note = NEXT_INSN (note);
1077
1078       jump_block = create_basic_block (note, NULL, e->src);
1079       jump_block->count = e->count;
1080       jump_block->frequency = EDGE_FREQUENCY (e);
1081       jump_block->loop_depth = target->loop_depth;
1082
1083       if (target->global_live_at_start)
1084         {
1085           jump_block->global_live_at_start
1086             = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1087           jump_block->global_live_at_end
1088             = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1089           COPY_REG_SET (jump_block->global_live_at_start,
1090                         target->global_live_at_start);
1091           COPY_REG_SET (jump_block->global_live_at_end,
1092                         target->global_live_at_start);
1093         }
1094
1095       /* Make sure new block ends up in correct hot/cold section.  */
1096
1097       BB_COPY_PARTITION (jump_block, e->src);
1098       if (flag_reorder_blocks_and_partition
1099           && targetm.have_named_sections)
1100         {
1101           if (BB_PARTITION (jump_block) == BB_COLD_PARTITION)
1102             {
1103               rtx bb_note, new_note;
1104               for (bb_note = BB_HEAD (jump_block); 
1105                    bb_note && bb_note != NEXT_INSN (BB_END (jump_block));
1106                    bb_note = NEXT_INSN (bb_note))
1107                 if (NOTE_P (bb_note)
1108                     && NOTE_LINE_NUMBER (bb_note) == NOTE_INSN_BASIC_BLOCK)
1109                   break;
1110               new_note = emit_note_after (NOTE_INSN_UNLIKELY_EXECUTED_CODE,
1111                                           bb_note);
1112               NOTE_BASIC_BLOCK (new_note) = jump_block; 
1113             }
1114           if (JUMP_P (BB_END (jump_block))
1115               && !any_condjump_p (BB_END (jump_block))
1116               && (jump_block->succ->flags & EDGE_CROSSING))
1117             REG_NOTES (BB_END (jump_block)) = gen_rtx_EXPR_LIST 
1118               (REG_CROSSING_JUMP, NULL_RTX, 
1119                REG_NOTES (BB_END (jump_block)));
1120         }
1121
1122       /* Wire edge in.  */
1123       new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
1124       new_edge->probability = e->probability;
1125       new_edge->count = e->count;
1126
1127       /* Redirect old edge.  */
1128       redirect_edge_pred (e, jump_block);
1129       e->probability = REG_BR_PROB_BASE;
1130
1131       new_bb = jump_block;
1132     }
1133   else
1134     jump_block = e->src;
1135
1136   e->flags &= ~EDGE_FALLTHRU;
1137   if (target == EXIT_BLOCK_PTR)
1138     {
1139 #ifdef HAVE_return
1140         emit_jump_insn_after (gen_return (), BB_END (jump_block));
1141 #else
1142         gcc_unreachable ();
1143 #endif
1144     }
1145   else
1146     {
1147       rtx label = block_label (target);
1148       emit_jump_insn_after (gen_jump (label), BB_END (jump_block));
1149       JUMP_LABEL (BB_END (jump_block)) = label;
1150       LABEL_NUSES (label)++;
1151     }
1152
1153   emit_barrier_after (BB_END (jump_block));
1154   redirect_edge_succ_nodup (e, target);
1155
1156   if (abnormal_edge_flags)
1157     make_edge (src, target, abnormal_edge_flags);
1158
1159   return new_bb;
1160 }
1161
1162 /* Edge E is assumed to be fallthru edge.  Emit needed jump instruction
1163    (and possibly create new basic block) to make edge non-fallthru.
1164    Return newly created BB or NULL if none.  */
1165
1166 basic_block
1167 force_nonfallthru (edge e)
1168 {
1169   return force_nonfallthru_and_redirect (e, e->dest);
1170 }
1171
1172 /* Redirect edge even at the expense of creating new jump insn or
1173    basic block.  Return new basic block if created, NULL otherwise.
1174    Abort if conversion is impossible.  */
1175
1176 static basic_block
1177 rtl_redirect_edge_and_branch_force (edge e, basic_block target)
1178 {
1179   if (redirect_edge_and_branch (e, target)
1180       || e->dest == target)
1181     return NULL;
1182
1183   /* In case the edge redirection failed, try to force it to be non-fallthru
1184      and redirect newly created simplejump.  */
1185   return force_nonfallthru_and_redirect (e, target);
1186 }
1187
1188 /* The given edge should potentially be a fallthru edge.  If that is in
1189    fact true, delete the jump and barriers that are in the way.  */
1190
1191 static void
1192 rtl_tidy_fallthru_edge (edge e)
1193 {
1194   rtx q;
1195   basic_block b = e->src, c = b->next_bb;
1196
1197   /* ??? In a late-running flow pass, other folks may have deleted basic
1198      blocks by nopping out blocks, leaving multiple BARRIERs between here
1199      and the target label. They ought to be chastized and fixed.
1200
1201      We can also wind up with a sequence of undeletable labels between
1202      one block and the next.
1203
1204      So search through a sequence of barriers, labels, and notes for
1205      the head of block C and assert that we really do fall through.  */
1206
1207   for (q = NEXT_INSN (BB_END (b)); q != BB_HEAD (c); q = NEXT_INSN (q))
1208     if (INSN_P (q))
1209       return;
1210
1211   /* Remove what will soon cease being the jump insn from the source block.
1212      If block B consisted only of this single jump, turn it into a deleted
1213      note.  */
1214   q = BB_END (b);
1215   if (JUMP_P (q)
1216       && onlyjump_p (q)
1217       && (any_uncondjump_p (q)
1218           || (b->succ == e && e->succ_next == NULL)))
1219     {
1220 #ifdef HAVE_cc0
1221       /* If this was a conditional jump, we need to also delete
1222          the insn that set cc0.  */
1223       if (any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1224         q = PREV_INSN (q);
1225 #endif
1226
1227       q = PREV_INSN (q);
1228
1229       /* We don't want a block to end on a line-number note since that has
1230          the potential of changing the code between -g and not -g.  */
1231       while (NOTE_P (q) && NOTE_LINE_NUMBER (q) >= 0)
1232         q = PREV_INSN (q);
1233     }
1234
1235   /* Selectively unlink the sequence.  */
1236   if (q != PREV_INSN (BB_HEAD (c)))
1237     delete_insn_chain (NEXT_INSN (q), PREV_INSN (BB_HEAD (c)));
1238
1239   e->flags |= EDGE_FALLTHRU;
1240 }
1241 \f
1242 /* Helper function for split_edge.  Return true in case edge BB2 to BB1
1243    is back edge of syntactic loop.  */
1244
1245 static bool
1246 back_edge_of_syntactic_loop_p (basic_block bb1, basic_block bb2)
1247 {
1248   rtx insn;
1249   int count = 0;
1250   basic_block bb;
1251
1252   if (bb1 == bb2)
1253     return true;
1254
1255   /* ??? Could we guarantee that bb indices are monotone, so that we could
1256      just compare them?  */
1257   for (bb = bb1; bb && bb != bb2; bb = bb->next_bb)
1258     continue;
1259
1260   if (!bb)
1261     return false;
1262
1263   for (insn = BB_END (bb1); insn != BB_HEAD (bb2) && count >= 0;
1264        insn = NEXT_INSN (insn))
1265     if (NOTE_P (insn))
1266       {
1267         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1268           count++;
1269         else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
1270           count--;
1271       }
1272
1273   return count >= 0;
1274 }
1275
1276 /* Should move basic block BB after basic block AFTER.  NIY.  */
1277
1278 static bool
1279 rtl_move_block_after (basic_block bb ATTRIBUTE_UNUSED,
1280                       basic_block after ATTRIBUTE_UNUSED)
1281 {
1282   return false;
1283 }
1284
1285 /* Split a (typically critical) edge.  Return the new block.
1286    Abort on abnormal edges.
1287
1288    ??? The code generally expects to be called on critical edges.
1289    The case of a block ending in an unconditional jump to a
1290    block with multiple predecessors is not handled optimally.  */
1291
1292 static basic_block
1293 rtl_split_edge (edge edge_in)
1294 {
1295   basic_block bb;
1296   rtx before;
1297
1298   /* Abnormal edges cannot be split.  */
1299   gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
1300
1301   /* We are going to place the new block in front of edge destination.
1302      Avoid existence of fallthru predecessors.  */
1303   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1304     {
1305       edge e;
1306
1307       for (e = edge_in->dest->pred; e; e = e->pred_next)
1308         if (e->flags & EDGE_FALLTHRU)
1309           break;
1310
1311       if (e)
1312         force_nonfallthru (e);
1313     }
1314
1315   /* Create the basic block note.
1316
1317      Where we place the note can have a noticeable impact on the generated
1318      code.  Consider this cfg:
1319
1320                         E
1321                         |
1322                         0
1323                        / \
1324                    +->1-->2--->E
1325                    |  |
1326                    +--+
1327
1328       If we need to insert an insn on the edge from block 0 to block 1,
1329       we want to ensure the instructions we insert are outside of any
1330       loop notes that physically sit between block 0 and block 1.  Otherwise
1331       we confuse the loop optimizer into thinking the loop is a phony.  */
1332
1333   if (edge_in->dest != EXIT_BLOCK_PTR
1334       && PREV_INSN (BB_HEAD (edge_in->dest))
1335       && NOTE_P (PREV_INSN (BB_HEAD (edge_in->dest)))
1336       && (NOTE_LINE_NUMBER (PREV_INSN (BB_HEAD (edge_in->dest)))
1337           == NOTE_INSN_LOOP_BEG)
1338       && !back_edge_of_syntactic_loop_p (edge_in->dest, edge_in->src))
1339     before = PREV_INSN (BB_HEAD (edge_in->dest));
1340   else if (edge_in->dest != EXIT_BLOCK_PTR)
1341     before = BB_HEAD (edge_in->dest);
1342   else
1343     before = NULL_RTX;
1344
1345   /* If this is a fall through edge to the exit block, the blocks might be
1346      not adjacent, and the right place is the after the source.  */
1347   if (edge_in->flags & EDGE_FALLTHRU && edge_in->dest == EXIT_BLOCK_PTR)
1348     {
1349       before = NEXT_INSN (BB_END (edge_in->src));
1350       if (before
1351           && NOTE_P (before)
1352           && NOTE_LINE_NUMBER (before) == NOTE_INSN_LOOP_END)
1353         before = NEXT_INSN (before);
1354       bb = create_basic_block (before, NULL, edge_in->src);
1355       BB_COPY_PARTITION (bb, edge_in->src);
1356     }
1357   else
1358     {
1359       bb = create_basic_block (before, NULL, edge_in->dest->prev_bb);
1360       /* ??? Why not edge_in->dest->prev_bb here?  */
1361       BB_COPY_PARTITION (bb, edge_in->dest);
1362     }
1363
1364   /* ??? This info is likely going to be out of date very soon.  */
1365   if (edge_in->dest->global_live_at_start)
1366     {
1367       bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1368       bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1369       COPY_REG_SET (bb->global_live_at_start,
1370                     edge_in->dest->global_live_at_start);
1371       COPY_REG_SET (bb->global_live_at_end,
1372                     edge_in->dest->global_live_at_start);
1373     }
1374
1375   make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
1376
1377   /* For non-fallthru edges, we must adjust the predecessor's
1378      jump instruction to target our new block.  */
1379   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1380     {
1381       edge redirected = redirect_edge_and_branch (edge_in, bb);
1382       gcc_assert (redirected);
1383     }
1384   else
1385     redirect_edge_succ (edge_in, bb);
1386
1387   return bb;
1388 }
1389
1390 /* Queue instructions for insertion on an edge between two basic blocks.
1391    The new instructions and basic blocks (if any) will not appear in the
1392    CFG until commit_edge_insertions is called.  */
1393
1394 void
1395 insert_insn_on_edge (rtx pattern, edge e)
1396 {
1397   /* We cannot insert instructions on an abnormal critical edge.
1398      It will be easier to find the culprit if we die now.  */
1399   gcc_assert (!((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e)));
1400
1401   if (e->insns.r == NULL_RTX)
1402     start_sequence ();
1403   else
1404     push_to_sequence (e->insns.r);
1405
1406   emit_insn (pattern);
1407
1408   e->insns.r = get_insns ();
1409   end_sequence ();
1410 }
1411
1412 /* Called from safe_insert_insn_on_edge through note_stores, marks live
1413    registers that are killed by the store.  */
1414 static void
1415 mark_killed_regs (rtx reg, rtx set ATTRIBUTE_UNUSED, void *data)
1416 {
1417   regset killed = data;
1418   int regno, i;
1419
1420   if (GET_CODE (reg) == SUBREG)
1421     reg = SUBREG_REG (reg);
1422   if (!REG_P (reg))
1423     return;
1424   regno = REGNO (reg);
1425   if (regno >= FIRST_PSEUDO_REGISTER)
1426     SET_REGNO_REG_SET (killed, regno);
1427   else
1428     {
1429       for (i = 0; i < (int) hard_regno_nregs[regno][GET_MODE (reg)]; i++)
1430         SET_REGNO_REG_SET (killed, regno + i);
1431     }
1432 }
1433
1434 /* Similar to insert_insn_on_edge, tries to put INSN to edge E.  Additionally
1435    it checks whether this will not clobber the registers that are live on the
1436    edge (i.e. it requires liveness information to be up-to-date) and if there
1437    are some, then it tries to save and restore them.  Returns true if
1438    successful.  */
1439 bool
1440 safe_insert_insn_on_edge (rtx insn, edge e)
1441 {
1442   rtx x;
1443   regset_head killed_head;
1444   regset killed = INITIALIZE_REG_SET (killed_head);
1445   rtx save_regs = NULL_RTX;
1446   int regno, noccmode;
1447   enum machine_mode mode;
1448
1449 #ifdef AVOID_CCMODE_COPIES
1450   noccmode = true;
1451 #else
1452   noccmode = false;
1453 #endif
1454
1455   for (x = insn; x; x = NEXT_INSN (x))
1456     if (INSN_P (x))
1457       note_stores (PATTERN (x), mark_killed_regs, killed);
1458   bitmap_operation (killed, killed, e->dest->global_live_at_start,
1459                     BITMAP_AND);
1460
1461   EXECUTE_IF_SET_IN_REG_SET (killed, 0, regno,
1462     {
1463       mode = regno < FIRST_PSEUDO_REGISTER
1464               ? reg_raw_mode[regno]
1465               : GET_MODE (regno_reg_rtx[regno]);
1466       if (mode == VOIDmode)
1467         return false;
1468
1469       if (noccmode && mode == CCmode)
1470         return false;
1471         
1472       save_regs = alloc_EXPR_LIST (0,
1473                                    alloc_EXPR_LIST (0,
1474                                                     gen_reg_rtx (mode),
1475                                                     gen_raw_REG (mode, regno)),
1476                                    save_regs);
1477     });
1478
1479   if (save_regs)
1480     {
1481       rtx from, to;
1482
1483       start_sequence ();
1484       for (x = save_regs; x; x = XEXP (x, 1))
1485         {
1486           from = XEXP (XEXP (x, 0), 1);
1487           to = XEXP (XEXP (x, 0), 0);
1488           emit_move_insn (to, from);
1489         }
1490       emit_insn (insn);
1491       for (x = save_regs; x; x = XEXP (x, 1))
1492         {
1493           from = XEXP (XEXP (x, 0), 0);
1494           to = XEXP (XEXP (x, 0), 1);
1495           emit_move_insn (to, from);
1496         }
1497       insn = get_insns ();
1498       end_sequence ();
1499       free_EXPR_LIST_list (&save_regs);
1500     }
1501   insert_insn_on_edge (insn, e);
1502   
1503   FREE_REG_SET (killed);
1504   return true;
1505 }
1506
1507 /* Update the CFG for the instructions queued on edge E.  */
1508
1509 static void
1510 commit_one_edge_insertion (edge e, int watch_calls)
1511 {
1512   rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1513   basic_block bb = NULL;
1514
1515   /* Pull the insns off the edge now since the edge might go away.  */
1516   insns = e->insns.r;
1517   e->insns.r = NULL_RTX;
1518
1519   /* Special case -- avoid inserting code between call and storing
1520      its return value.  */
1521   if (watch_calls && (e->flags & EDGE_FALLTHRU) && !e->dest->pred->pred_next
1522       && e->src != ENTRY_BLOCK_PTR
1523       && CALL_P (BB_END (e->src)))
1524     {
1525       rtx next = next_nonnote_insn (BB_END (e->src));
1526
1527       after = BB_HEAD (e->dest);
1528       /* The first insn after the call may be a stack pop, skip it.  */
1529       while (next
1530              && keep_with_call_p (next))
1531         {
1532           after = next;
1533           next = next_nonnote_insn (next);
1534         }
1535       bb = e->dest;
1536     }
1537   if (!before && !after)
1538     {
1539       /* Figure out where to put these things.  If the destination has
1540          one predecessor, insert there.  Except for the exit block.  */
1541       if (e->dest->pred->pred_next == NULL && e->dest != EXIT_BLOCK_PTR)
1542         {
1543           bb = e->dest;
1544
1545           /* Get the location correct wrt a code label, and "nice" wrt
1546              a basic block note, and before everything else.  */
1547           tmp = BB_HEAD (bb);
1548           if (LABEL_P (tmp))
1549             tmp = NEXT_INSN (tmp);
1550           if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1551             tmp = NEXT_INSN (tmp);
1552           if (tmp 
1553               && NOTE_P (tmp)
1554               && NOTE_LINE_NUMBER (tmp) == NOTE_INSN_UNLIKELY_EXECUTED_CODE)
1555             tmp = NEXT_INSN (tmp);
1556           if (tmp == BB_HEAD (bb))
1557             before = tmp;
1558           else if (tmp)
1559             after = PREV_INSN (tmp);
1560           else
1561             after = get_last_insn ();
1562         }
1563
1564       /* If the source has one successor and the edge is not abnormal,
1565          insert there.  Except for the entry block.  */
1566       else if ((e->flags & EDGE_ABNORMAL) == 0
1567                && e->src->succ->succ_next == NULL
1568                && e->src != ENTRY_BLOCK_PTR)
1569         {
1570           bb = e->src;
1571
1572           /* It is possible to have a non-simple jump here.  Consider a target
1573              where some forms of unconditional jumps clobber a register.  This
1574              happens on the fr30 for example.
1575
1576              We know this block has a single successor, so we can just emit
1577              the queued insns before the jump.  */
1578           if (JUMP_P (BB_END (bb)))
1579             for (before = BB_END (bb);
1580                  NOTE_P (PREV_INSN (before))
1581                  && NOTE_LINE_NUMBER (PREV_INSN (before)) ==
1582                  NOTE_INSN_LOOP_BEG; before = PREV_INSN (before))
1583               ;
1584           else
1585             {
1586               /* We'd better be fallthru, or we've lost track of
1587                  what's what.  */
1588               gcc_assert (e->flags & EDGE_FALLTHRU);
1589
1590               after = BB_END (bb);
1591             }
1592         }
1593       /* Otherwise we must split the edge.  */
1594       else
1595         {
1596           bb = split_edge (e);
1597           after = BB_END (bb);
1598
1599           if (flag_reorder_blocks_and_partition
1600               && targetm.have_named_sections
1601               && e->src != ENTRY_BLOCK_PTR
1602               && BB_PARTITION (e->src) == BB_COLD_PARTITION
1603               && !(e->flags & EDGE_CROSSING))
1604             {
1605               rtx bb_note, new_note, cur_insn;
1606
1607               bb_note = NULL_RTX;
1608               for (cur_insn = BB_HEAD (bb); cur_insn != NEXT_INSN (BB_END (bb));
1609                    cur_insn = NEXT_INSN (cur_insn))
1610                 if (NOTE_P (cur_insn)
1611                     && NOTE_LINE_NUMBER (cur_insn) == NOTE_INSN_BASIC_BLOCK)
1612                   {
1613                     bb_note = cur_insn;
1614                     break;
1615                   }
1616
1617               new_note = emit_note_after (NOTE_INSN_UNLIKELY_EXECUTED_CODE,
1618                                           bb_note);
1619               NOTE_BASIC_BLOCK (new_note) = bb;
1620               if (JUMP_P (BB_END (bb))
1621                   && !any_condjump_p (BB_END (bb))
1622                   && (bb->succ->flags & EDGE_CROSSING))
1623                 REG_NOTES (BB_END (bb)) = gen_rtx_EXPR_LIST 
1624                   (REG_CROSSING_JUMP, NULL_RTX, REG_NOTES (BB_END (bb)));
1625               if (after == bb_note)
1626                 after = new_note;
1627             }
1628         }
1629     }
1630
1631   /* Now that we've found the spot, do the insertion.  */
1632
1633   if (before)
1634     {
1635       emit_insn_before (insns, before);
1636       last = prev_nonnote_insn (before);
1637     }
1638   else
1639     last = emit_insn_after (insns, after);
1640
1641   if (returnjump_p (last))
1642     {
1643       /* ??? Remove all outgoing edges from BB and add one for EXIT.
1644          This is not currently a problem because this only happens
1645          for the (single) epilogue, which already has a fallthru edge
1646          to EXIT.  */
1647
1648       e = bb->succ;
1649       gcc_assert (e->dest == EXIT_BLOCK_PTR
1650                   && !e->succ_next && (e->flags & EDGE_FALLTHRU));
1651
1652       e->flags &= ~EDGE_FALLTHRU;
1653       emit_barrier_after (last);
1654
1655       if (before)
1656         delete_insn (before);
1657     }
1658   else
1659     gcc_assert (!JUMP_P (last));
1660
1661   /* Mark the basic block for find_sub_basic_blocks.  */
1662   bb->aux = &bb->aux;
1663 }
1664
1665 /* Update the CFG for all queued instructions.  */
1666
1667 void
1668 commit_edge_insertions (void)
1669 {
1670   basic_block bb;
1671   sbitmap blocks;
1672   bool changed = false;
1673
1674 #ifdef ENABLE_CHECKING
1675   verify_flow_info ();
1676 #endif
1677
1678   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
1679     {
1680       edge e, next;
1681
1682       for (e = bb->succ; e; e = next)
1683         {
1684           next = e->succ_next;
1685           if (e->insns.r)
1686             {
1687               changed = true;
1688               commit_one_edge_insertion (e, false);
1689             }
1690         }
1691     }
1692
1693   if (!changed)
1694     return;
1695
1696   blocks = sbitmap_alloc (last_basic_block);
1697   sbitmap_zero (blocks);
1698   FOR_EACH_BB (bb)
1699     if (bb->aux)
1700       {
1701         SET_BIT (blocks, bb->index);
1702         /* Check for forgotten bb->aux values before commit_edge_insertions
1703            call.  */
1704         gcc_assert (bb->aux == &bb->aux);
1705         bb->aux = NULL;
1706       }
1707   find_many_sub_basic_blocks (blocks);
1708   sbitmap_free (blocks);
1709 }
1710 \f
1711 /* Update the CFG for all queued instructions, taking special care of inserting
1712    code on edges between call and storing its return value.  */
1713
1714 void
1715 commit_edge_insertions_watch_calls (void)
1716 {
1717   basic_block bb;
1718   sbitmap blocks;
1719   bool changed = false;
1720
1721 #ifdef ENABLE_CHECKING
1722   verify_flow_info ();
1723 #endif
1724
1725   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
1726     {
1727       edge e, next;
1728
1729       for (e = bb->succ; e; e = next)
1730         {
1731           next = e->succ_next;
1732           if (e->insns.r)
1733             {
1734               changed = true;
1735               commit_one_edge_insertion (e, true);
1736             }
1737         }
1738     }
1739
1740   if (!changed)
1741     return;
1742
1743   blocks = sbitmap_alloc (last_basic_block);
1744   sbitmap_zero (blocks);
1745   FOR_EACH_BB (bb)
1746     if (bb->aux)
1747       {
1748         SET_BIT (blocks, bb->index);
1749         /* Check for forgotten bb->aux values before commit_edge_insertions
1750            call.  */
1751         gcc_assert (bb->aux == &bb->aux);
1752         bb->aux = NULL;
1753       }
1754   find_many_sub_basic_blocks (blocks);
1755   sbitmap_free (blocks);
1756 }
1757 \f
1758 /* Print out RTL-specific basic block information (live information
1759    at start and end).  */
1760
1761 static void
1762 rtl_dump_bb (basic_block bb, FILE *outf, int indent)
1763 {
1764   rtx insn;
1765   rtx last;
1766   char *s_indent;
1767
1768   s_indent = alloca ((size_t) indent + 1);
1769   memset (s_indent, ' ', (size_t) indent);
1770   s_indent[indent] = '\0';
1771
1772   fprintf (outf, ";;%s Registers live at start: ", s_indent);
1773   dump_regset (bb->global_live_at_start, outf);
1774   putc ('\n', outf);
1775
1776   for (insn = BB_HEAD (bb), last = NEXT_INSN (BB_END (bb)); insn != last;
1777        insn = NEXT_INSN (insn))
1778     print_rtl_single (outf, insn);
1779
1780   fprintf (outf, ";;%s Registers live at end: ", s_indent);
1781   dump_regset (bb->global_live_at_end, outf);
1782   putc ('\n', outf);
1783 }
1784 \f
1785 /* Like print_rtl, but also print out live information for the start of each
1786    basic block.  */
1787
1788 void
1789 print_rtl_with_bb (FILE *outf, rtx rtx_first)
1790 {
1791   rtx tmp_rtx;
1792
1793   if (rtx_first == 0)
1794     fprintf (outf, "(nil)\n");
1795   else
1796     {
1797       enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
1798       int max_uid = get_max_uid ();
1799       basic_block *start = xcalloc (max_uid, sizeof (basic_block));
1800       basic_block *end = xcalloc (max_uid, sizeof (basic_block));
1801       enum bb_state *in_bb_p = xcalloc (max_uid, sizeof (enum bb_state));
1802
1803       basic_block bb;
1804
1805       FOR_EACH_BB_REVERSE (bb)
1806         {
1807           rtx x;
1808
1809           start[INSN_UID (BB_HEAD (bb))] = bb;
1810           end[INSN_UID (BB_END (bb))] = bb;
1811           for (x = BB_HEAD (bb); x != NULL_RTX; x = NEXT_INSN (x))
1812             {
1813               enum bb_state state = IN_MULTIPLE_BB;
1814
1815               if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1816                 state = IN_ONE_BB;
1817               in_bb_p[INSN_UID (x)] = state;
1818
1819               if (x == BB_END (bb))
1820                 break;
1821             }
1822         }
1823
1824       for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1825         {
1826           int did_output;
1827
1828           if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
1829             {
1830               fprintf (outf, ";; Start of basic block %d, registers live:",
1831                        bb->index);
1832               dump_regset (bb->global_live_at_start, outf);
1833               putc ('\n', outf);
1834             }
1835
1836           if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1837               && !NOTE_P (tmp_rtx)
1838               && !BARRIER_P (tmp_rtx))
1839             fprintf (outf, ";; Insn is not within a basic block\n");
1840           else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1841             fprintf (outf, ";; Insn is in multiple basic blocks\n");
1842
1843           did_output = print_rtl_single (outf, tmp_rtx);
1844
1845           if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
1846             {
1847               fprintf (outf, ";; End of basic block %d, registers live:\n",
1848                        bb->index);
1849               dump_regset (bb->global_live_at_end, outf);
1850               putc ('\n', outf);
1851             }
1852
1853           if (did_output)
1854             putc ('\n', outf);
1855         }
1856
1857       free (start);
1858       free (end);
1859       free (in_bb_p);
1860     }
1861
1862   if (current_function_epilogue_delay_list != 0)
1863     {
1864       fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1865       for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
1866            tmp_rtx = XEXP (tmp_rtx, 1))
1867         print_rtl_single (outf, XEXP (tmp_rtx, 0));
1868     }
1869 }
1870 \f
1871 void
1872 update_br_prob_note (basic_block bb)
1873 {
1874   rtx note;
1875   if (!JUMP_P (BB_END (bb)))
1876     return;
1877   note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX);
1878   if (!note || INTVAL (XEXP (note, 0)) == BRANCH_EDGE (bb)->probability)
1879     return;
1880   XEXP (note, 0) = GEN_INT (BRANCH_EDGE (bb)->probability);
1881 }
1882 \f
1883 /* Verify the CFG and RTL consistency common for both underlying RTL and
1884    cfglayout RTL.
1885
1886    Currently it does following checks:
1887
1888    - test head/end pointers
1889    - overlapping of basic blocks
1890    - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
1891    - tails of basic blocks (ensure that boundary is necessary)
1892    - scans body of the basic block for JUMP_INSN, CODE_LABEL
1893      and NOTE_INSN_BASIC_BLOCK
1894    - verify that no fall_thru edge crosses hot/cold partition boundaries
1895
1896    In future it can be extended check a lot of other stuff as well
1897    (reachability of basic blocks, life information, etc. etc.).  */
1898
1899 static int
1900 rtl_verify_flow_info_1 (void)
1901 {
1902   const int max_uid = get_max_uid ();
1903   rtx last_head = get_last_insn ();
1904   basic_block *bb_info;
1905   rtx x;
1906   int err = 0;
1907   basic_block bb, last_bb_seen;
1908
1909   bb_info = xcalloc (max_uid, sizeof (basic_block));
1910
1911   /* Check bb chain & numbers.  */
1912   last_bb_seen = ENTRY_BLOCK_PTR;
1913
1914   FOR_EACH_BB_REVERSE (bb)
1915     {
1916       rtx head = BB_HEAD (bb);
1917       rtx end = BB_END (bb);
1918
1919       /* Verify the end of the basic block is in the INSN chain.  */
1920       for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
1921         if (x == end)
1922           break;
1923
1924       if (!x)
1925         {
1926           error ("end insn %d for block %d not found in the insn stream",
1927                  INSN_UID (end), bb->index);
1928           err = 1;
1929         }
1930
1931       /* Work backwards from the end to the head of the basic block
1932          to verify the head is in the RTL chain.  */
1933       for (; x != NULL_RTX; x = PREV_INSN (x))
1934         {
1935           /* While walking over the insn chain, verify insns appear
1936              in only one basic block and initialize the BB_INFO array
1937              used by other passes.  */
1938           if (bb_info[INSN_UID (x)] != NULL)
1939             {
1940               error ("insn %d is in multiple basic blocks (%d and %d)",
1941                      INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
1942               err = 1;
1943             }
1944
1945           bb_info[INSN_UID (x)] = bb;
1946
1947           if (x == head)
1948             break;
1949         }
1950       if (!x)
1951         {
1952           error ("head insn %d for block %d not found in the insn stream",
1953                  INSN_UID (head), bb->index);
1954           err = 1;
1955         }
1956
1957       last_head = x;
1958     }
1959
1960   /* Now check the basic blocks (boundaries etc.) */
1961   FOR_EACH_BB_REVERSE (bb)
1962     {
1963       int n_fallthru = 0, n_eh = 0, n_call = 0, n_abnormal = 0, n_branch = 0;
1964       edge e, fallthru = NULL;
1965       rtx note;
1966
1967       if (INSN_P (BB_END (bb))
1968           && (note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX))
1969           && bb->succ && bb->succ->succ_next
1970           && any_condjump_p (BB_END (bb)))
1971         {
1972           if (INTVAL (XEXP (note, 0)) != BRANCH_EDGE (bb)->probability
1973               && profile_status != PROFILE_ABSENT)
1974             {
1975               error ("verify_flow_info: REG_BR_PROB does not match cfg %wi %i",
1976                      INTVAL (XEXP (note, 0)), BRANCH_EDGE (bb)->probability);
1977               err = 1;
1978             }
1979         }
1980       for (e = bb->succ; e; e = e->succ_next)
1981         {
1982           if (e->flags & EDGE_FALLTHRU)
1983             {
1984               n_fallthru++, fallthru = e;
1985               if ((e->flags & EDGE_CROSSING)
1986                   || (BB_PARTITION (e->src) != BB_PARTITION (e->dest)
1987                       && e->src != ENTRY_BLOCK_PTR
1988                       && e->dest != EXIT_BLOCK_PTR))
1989             { 
1990                   error ("Fallthru edge crosses section boundary (bb %i)",
1991                          e->src->index);
1992                   err = 1;
1993                 }
1994             }
1995
1996           if ((e->flags & ~(EDGE_DFS_BACK
1997                             | EDGE_CAN_FALLTHRU
1998                             | EDGE_IRREDUCIBLE_LOOP
1999                             | EDGE_LOOP_EXIT
2000                             | EDGE_CROSSING)) == 0)
2001             n_branch++;
2002
2003           if (e->flags & EDGE_ABNORMAL_CALL)
2004             n_call++;
2005
2006           if (e->flags & EDGE_EH)
2007             n_eh++;
2008           else if (e->flags & EDGE_ABNORMAL)
2009             n_abnormal++;
2010         }
2011
2012       if (n_eh && GET_CODE (PATTERN (BB_END (bb))) != RESX
2013           && !find_reg_note (BB_END (bb), REG_EH_REGION, NULL_RTX))
2014         {
2015           error ("Missing REG_EH_REGION note in the end of bb %i", bb->index);
2016           err = 1;
2017         }
2018       if (n_branch
2019           && (!JUMP_P (BB_END (bb))
2020               || (n_branch > 1 && (any_uncondjump_p (BB_END (bb))
2021                                    || any_condjump_p (BB_END (bb))))))
2022         {
2023           error ("Too many outgoing branch edges from bb %i", bb->index);
2024           err = 1;
2025         }
2026       if (n_fallthru && any_uncondjump_p (BB_END (bb)))
2027         {
2028           error ("Fallthru edge after unconditional jump %i", bb->index);
2029           err = 1;
2030         }
2031       if (n_branch != 1 && any_uncondjump_p (BB_END (bb)))
2032         {
2033           error ("Wrong amount of branch edges after unconditional jump %i", bb->index);
2034           err = 1;
2035         }
2036       if (n_branch != 1 && any_condjump_p (BB_END (bb))
2037           && JUMP_LABEL (BB_END (bb)) != BB_HEAD (fallthru->dest))
2038         {
2039           error ("Wrong amount of branch edges after conditional jump %i", bb->index);
2040           err = 1;
2041         }
2042       if (n_call && !CALL_P (BB_END (bb)))
2043         {
2044           error ("Call edges for non-call insn in bb %i", bb->index);
2045           err = 1;
2046         }
2047       if (n_abnormal
2048           && (!CALL_P (BB_END (bb)) && n_call != n_abnormal)
2049           && (!JUMP_P (BB_END (bb))
2050               || any_condjump_p (BB_END (bb))
2051               || any_uncondjump_p (BB_END (bb))))
2052         {
2053           error ("Abnormal edges for no purpose in bb %i", bb->index);
2054           err = 1;
2055         }
2056
2057       for (x = BB_HEAD (bb); x != NEXT_INSN (BB_END (bb)); x = NEXT_INSN (x))
2058         if (BLOCK_FOR_INSN (x) != bb)
2059           {
2060             debug_rtx (x);
2061             if (! BLOCK_FOR_INSN (x))
2062               error
2063                 ("insn %d inside basic block %d but block_for_insn is NULL",
2064                  INSN_UID (x), bb->index);
2065             else
2066               error
2067                 ("insn %d inside basic block %d but block_for_insn is %i",
2068                  INSN_UID (x), bb->index, BLOCK_FOR_INSN (x)->index);
2069
2070             err = 1;
2071           }
2072
2073       /* OK pointers are correct.  Now check the header of basic
2074          block.  It ought to contain optional CODE_LABEL followed
2075          by NOTE_BASIC_BLOCK.  */
2076       x = BB_HEAD (bb);
2077       if (LABEL_P (x))
2078         {
2079           if (BB_END (bb) == x)
2080             {
2081               error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2082                      bb->index);
2083               err = 1;
2084             }
2085
2086           x = NEXT_INSN (x);
2087         }
2088
2089       if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
2090         {
2091           error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2092                  bb->index);
2093           err = 1;
2094         }
2095
2096       if (BB_END (bb) == x)
2097         /* Do checks for empty blocks her. e */
2098         ;
2099       else
2100         for (x = NEXT_INSN (x); x; x = NEXT_INSN (x))
2101           {
2102             if (NOTE_INSN_BASIC_BLOCK_P (x))
2103               {
2104                 error ("NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d",
2105                        INSN_UID (x), bb->index);
2106                 err = 1;
2107               }
2108
2109             if (x == BB_END (bb))
2110               break;
2111
2112             if (control_flow_insn_p (x))
2113               {
2114                 error ("in basic block %d:", bb->index);
2115                 fatal_insn ("flow control insn inside a basic block", x);
2116               }
2117           }
2118     }
2119
2120   /* Clean up.  */
2121   free (bb_info);
2122   return err;
2123 }
2124
2125 /* Verify the CFG and RTL consistency common for both underlying RTL and
2126    cfglayout RTL.
2127
2128    Currently it does following checks:
2129    - all checks of rtl_verify_flow_info_1
2130    - check that all insns are in the basic blocks
2131      (except the switch handling code, barriers and notes)
2132    - check that all returns are followed by barriers
2133    - check that all fallthru edge points to the adjacent blocks.  */
2134 static int
2135 rtl_verify_flow_info (void)
2136 {
2137   basic_block bb;
2138   int err = rtl_verify_flow_info_1 ();
2139   rtx x;
2140   int num_bb_notes;
2141   const rtx rtx_first = get_insns ();
2142   basic_block last_bb_seen = ENTRY_BLOCK_PTR, curr_bb = NULL;
2143
2144   FOR_EACH_BB_REVERSE (bb)
2145     {
2146       edge e;
2147       for (e = bb->succ; e; e = e->succ_next)
2148         if (e->flags & EDGE_FALLTHRU)
2149           break;
2150       if (!e)
2151         {
2152           rtx insn;
2153
2154           /* Ensure existence of barrier in BB with no fallthru edges.  */
2155           for (insn = BB_END (bb); !insn || !BARRIER_P (insn);
2156                insn = NEXT_INSN (insn))
2157             if (!insn
2158                 || (NOTE_P (insn)
2159                     && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK))
2160                 {
2161                   error ("missing barrier after block %i", bb->index);
2162                   err = 1;
2163                   break;
2164                 }
2165         }
2166       else if (e->src != ENTRY_BLOCK_PTR
2167                && e->dest != EXIT_BLOCK_PTR)
2168         {
2169           rtx insn;
2170
2171           if (e->src->next_bb != e->dest)
2172             {
2173               error
2174                 ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
2175                  e->src->index, e->dest->index);
2176               err = 1;
2177             }
2178           else
2179             for (insn = NEXT_INSN (BB_END (e->src)); insn != BB_HEAD (e->dest);
2180                  insn = NEXT_INSN (insn))
2181               if (BARRIER_P (insn)
2182 #ifndef CASE_DROPS_THROUGH
2183                   || INSN_P (insn)
2184 #else
2185                   || (INSN_P (insn) && ! JUMP_TABLE_DATA_P (insn))
2186 #endif
2187                   )
2188                 {
2189                   error ("verify_flow_info: Incorrect fallthru %i->%i",
2190                          e->src->index, e->dest->index);
2191                   fatal_insn ("wrong insn in the fallthru edge", insn);
2192                   err = 1;
2193                 }
2194         }
2195     }
2196
2197   num_bb_notes = 0;
2198   last_bb_seen = ENTRY_BLOCK_PTR;
2199
2200   for (x = rtx_first; x; x = NEXT_INSN (x))
2201     {
2202       if (NOTE_INSN_BASIC_BLOCK_P (x))
2203         {
2204           bb = NOTE_BASIC_BLOCK (x);
2205
2206           num_bb_notes++;
2207           if (bb != last_bb_seen->next_bb)
2208             internal_error ("basic blocks not laid down consecutively");
2209
2210           curr_bb = last_bb_seen = bb;
2211         }
2212
2213       if (!curr_bb)
2214         {
2215           switch (GET_CODE (x))
2216             {
2217             case BARRIER:
2218             case NOTE:
2219               break;
2220
2221             case CODE_LABEL:
2222               /* An addr_vec is placed outside any basic block.  */
2223               if (NEXT_INSN (x)
2224                   && JUMP_P (NEXT_INSN (x))
2225                   && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
2226                       || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
2227                 x = NEXT_INSN (x);
2228
2229               /* But in any case, non-deletable labels can appear anywhere.  */
2230               break;
2231
2232             default:
2233               fatal_insn ("insn outside basic block", x);
2234             }
2235         }
2236
2237       if (INSN_P (x)
2238           && JUMP_P (x)
2239           && returnjump_p (x) && ! condjump_p (x)
2240           && ! (NEXT_INSN (x) && BARRIER_P (NEXT_INSN (x))))
2241             fatal_insn ("return not followed by barrier", x);
2242       if (curr_bb && x == BB_END (curr_bb))
2243         curr_bb = NULL;
2244     }
2245
2246   if (num_bb_notes != n_basic_blocks)
2247     internal_error
2248       ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2249        num_bb_notes, n_basic_blocks);
2250
2251    return err;
2252 }
2253 \f
2254 /* Assume that the preceding pass has possibly eliminated jump instructions
2255    or converted the unconditional jumps.  Eliminate the edges from CFG.
2256    Return true if any edges are eliminated.  */
2257
2258 bool
2259 purge_dead_edges (basic_block bb)
2260 {
2261   edge e, next;
2262   rtx insn = BB_END (bb), note;
2263   bool purged = false;
2264
2265   /* If this instruction cannot trap, remove REG_EH_REGION notes.  */
2266   if (NONJUMP_INSN_P (insn)
2267       && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
2268     {
2269       rtx eqnote;
2270
2271       if (! may_trap_p (PATTERN (insn))
2272           || ((eqnote = find_reg_equal_equiv_note (insn))
2273               && ! may_trap_p (XEXP (eqnote, 0))))
2274         remove_note (insn, note);
2275     }
2276
2277   /* Cleanup abnormal edges caused by exceptions or non-local gotos.  */
2278   for (e = bb->succ; e; e = next)
2279     {
2280       next = e->succ_next;
2281       if (e->flags & EDGE_EH)
2282         {
2283           if (can_throw_internal (BB_END (bb)))
2284             continue;
2285         }
2286       else if (e->flags & EDGE_ABNORMAL_CALL)
2287         {
2288           if (CALL_P (BB_END (bb))
2289               && (! (note = find_reg_note (insn, REG_EH_REGION, NULL))
2290                   || INTVAL (XEXP (note, 0)) >= 0))
2291             continue;
2292         }
2293       else
2294         continue;
2295
2296       remove_edge (e);
2297       bb->flags |= BB_DIRTY;
2298       purged = true;
2299     }
2300
2301   if (JUMP_P (insn))
2302     {
2303       rtx note;
2304       edge b,f;
2305
2306       /* We do care only about conditional jumps and simplejumps.  */
2307       if (!any_condjump_p (insn)
2308           && !returnjump_p (insn)
2309           && !simplejump_p (insn))
2310         return purged;
2311
2312       /* Branch probability/prediction notes are defined only for
2313          condjumps.  We've possibly turned condjump into simplejump.  */
2314       if (simplejump_p (insn))
2315         {
2316           note = find_reg_note (insn, REG_BR_PROB, NULL);
2317           if (note)
2318             remove_note (insn, note);
2319           while ((note = find_reg_note (insn, REG_BR_PRED, NULL)))
2320             remove_note (insn, note);
2321         }
2322
2323       for (e = bb->succ; e; e = next)
2324         {
2325           next = e->succ_next;
2326
2327           /* Avoid abnormal flags to leak from computed jumps turned
2328              into simplejumps.  */
2329
2330           e->flags &= ~EDGE_ABNORMAL;
2331
2332           /* See if this edge is one we should keep.  */
2333           if ((e->flags & EDGE_FALLTHRU) && any_condjump_p (insn))
2334             /* A conditional jump can fall through into the next
2335                block, so we should keep the edge.  */
2336             continue;
2337           else if (e->dest != EXIT_BLOCK_PTR
2338                    && BB_HEAD (e->dest) == JUMP_LABEL (insn))
2339             /* If the destination block is the target of the jump,
2340                keep the edge.  */
2341             continue;
2342           else if (e->dest == EXIT_BLOCK_PTR && returnjump_p (insn))
2343             /* If the destination block is the exit block, and this
2344                instruction is a return, then keep the edge.  */
2345             continue;
2346           else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2347             /* Keep the edges that correspond to exceptions thrown by
2348                this instruction and rematerialize the EDGE_ABNORMAL
2349                flag we just cleared above.  */
2350             {
2351               e->flags |= EDGE_ABNORMAL;
2352               continue;
2353             }
2354
2355           /* We do not need this edge.  */
2356           bb->flags |= BB_DIRTY;
2357           purged = true;
2358           remove_edge (e);
2359         }
2360
2361       if (!bb->succ || !purged)
2362         return purged;
2363
2364       if (dump_file)
2365         fprintf (dump_file, "Purged edges from bb %i\n", bb->index);
2366
2367       if (!optimize)
2368         return purged;
2369
2370       /* Redistribute probabilities.  */
2371       if (!bb->succ->succ_next)
2372         {
2373           bb->succ->probability = REG_BR_PROB_BASE;
2374           bb->succ->count = bb->count;
2375         }
2376       else
2377         {
2378           note = find_reg_note (insn, REG_BR_PROB, NULL);
2379           if (!note)
2380             return purged;
2381
2382           b = BRANCH_EDGE (bb);
2383           f = FALLTHRU_EDGE (bb);
2384           b->probability = INTVAL (XEXP (note, 0));
2385           f->probability = REG_BR_PROB_BASE - b->probability;
2386           b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2387           f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2388         }
2389
2390       return purged;
2391     }
2392   else if (CALL_P (insn) && SIBLING_CALL_P (insn))
2393     {
2394       /* First, there should not be any EH or ABCALL edges resulting
2395          from non-local gotos and the like.  If there were, we shouldn't
2396          have created the sibcall in the first place.  Second, there
2397          should of course never have been a fallthru edge.  */
2398       gcc_assert (bb->succ && !bb->succ->succ_next);
2399       gcc_assert (bb->succ->flags == (EDGE_SIBCALL | EDGE_ABNORMAL));
2400
2401       return 0;
2402     }
2403
2404   /* If we don't see a jump insn, we don't know exactly why the block would
2405      have been broken at this point.  Look for a simple, non-fallthru edge,
2406      as these are only created by conditional branches.  If we find such an
2407      edge we know that there used to be a jump here and can then safely
2408      remove all non-fallthru edges.  */
2409   for (e = bb->succ; e && (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU));
2410        e = e->succ_next)
2411     ;
2412
2413   if (!e)
2414     return purged;
2415
2416   for (e = bb->succ; e; e = next)
2417     {
2418       next = e->succ_next;
2419       if (!(e->flags & EDGE_FALLTHRU))
2420         {
2421           bb->flags |= BB_DIRTY;
2422           remove_edge (e);
2423           purged = true;
2424         }
2425     }
2426
2427   gcc_assert (bb->succ && !bb->succ->succ_next);
2428
2429   bb->succ->probability = REG_BR_PROB_BASE;
2430   bb->succ->count = bb->count;
2431
2432   if (dump_file)
2433     fprintf (dump_file, "Purged non-fallthru edges from bb %i\n",
2434              bb->index);
2435   return purged;
2436 }
2437
2438 /* Search all basic blocks for potentially dead edges and purge them.  Return
2439    true if some edge has been eliminated.  */
2440
2441 bool
2442 purge_all_dead_edges (int update_life_p)
2443 {
2444   int purged = false;
2445   sbitmap blocks = 0;
2446   basic_block bb;
2447
2448   if (update_life_p)
2449     {
2450       blocks = sbitmap_alloc (last_basic_block);
2451       sbitmap_zero (blocks);
2452     }
2453
2454   FOR_EACH_BB (bb)
2455     {
2456       bool purged_here = purge_dead_edges (bb);
2457
2458       purged |= purged_here;
2459       if (purged_here && update_life_p)
2460         SET_BIT (blocks, bb->index);
2461     }
2462
2463   if (update_life_p && purged)
2464     update_life_info (blocks, UPDATE_LIFE_GLOBAL,
2465                       PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
2466                       | PROP_KILL_DEAD_CODE);
2467
2468   if (update_life_p)
2469     sbitmap_free (blocks);
2470   return purged;
2471 }
2472
2473 /* Same as split_block but update cfg_layout structures.  */
2474
2475 static basic_block
2476 cfg_layout_split_block (basic_block bb, void *insnp)
2477 {
2478   rtx insn = insnp;
2479   basic_block new_bb = rtl_split_block (bb, insn);
2480
2481   new_bb->rbi->footer = bb->rbi->footer;
2482   bb->rbi->footer = NULL;
2483
2484   return new_bb;
2485 }
2486
2487
2488 /* Redirect Edge to DEST.  */
2489 static edge
2490 cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
2491 {
2492   basic_block src = e->src;
2493   edge ret;
2494
2495   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
2496     return NULL;
2497
2498   if (e->dest == dest)
2499     return e;
2500
2501   if (e->src != ENTRY_BLOCK_PTR
2502       && (ret = try_redirect_by_replacing_jump (e, dest, true)))
2503     {
2504       src->flags |= BB_DIRTY;
2505       return ret;
2506     }
2507
2508   if (e->src == ENTRY_BLOCK_PTR
2509       && (e->flags & EDGE_FALLTHRU) && !(e->flags & EDGE_COMPLEX))
2510     {
2511       if (dump_file)
2512         fprintf (dump_file, "Redirecting entry edge from bb %i to %i\n",
2513                  e->src->index, dest->index);
2514
2515       e->src->flags |= BB_DIRTY;
2516       redirect_edge_succ (e, dest);
2517       return e;
2518     }
2519
2520   /* Redirect_edge_and_branch may decide to turn branch into fallthru edge
2521      in the case the basic block appears to be in sequence.  Avoid this
2522      transformation.  */
2523
2524   if (e->flags & EDGE_FALLTHRU)
2525     {
2526       /* Redirect any branch edges unified with the fallthru one.  */
2527       if (JUMP_P (BB_END (src))
2528           && label_is_jump_target_p (BB_HEAD (e->dest),
2529                                      BB_END (src)))
2530         {
2531           edge redirected;
2532           
2533           if (dump_file)
2534             fprintf (dump_file, "Fallthru edge unified with branch "
2535                      "%i->%i redirected to %i\n",
2536                      e->src->index, e->dest->index, dest->index);
2537           e->flags &= ~EDGE_FALLTHRU;
2538           redirected = redirect_branch_edge (e, dest);
2539           gcc_assert (redirected);
2540           e->flags |= EDGE_FALLTHRU;
2541           e->src->flags |= BB_DIRTY;
2542           return e;
2543         }
2544       /* In case we are redirecting fallthru edge to the branch edge
2545          of conditional jump, remove it.  */
2546       if (src->succ->succ_next
2547           && !src->succ->succ_next->succ_next)
2548         {
2549           edge s = e->succ_next ? e->succ_next : src->succ;
2550           if (s->dest == dest
2551               && any_condjump_p (BB_END (src))
2552               && onlyjump_p (BB_END (src)))
2553             delete_insn (BB_END (src));
2554         }
2555       ret = redirect_edge_succ_nodup (e, dest);
2556       if (dump_file)
2557         fprintf (dump_file, "Fallthru edge %i->%i redirected to %i\n",
2558                  e->src->index, e->dest->index, dest->index);
2559     }
2560   else
2561     ret = redirect_branch_edge (e, dest);
2562
2563   /* We don't want simplejumps in the insn stream during cfglayout.  */
2564   gcc_assert (!simplejump_p (BB_END (src)));
2565
2566   src->flags |= BB_DIRTY;
2567   return ret;
2568 }
2569
2570 /* Simple wrapper as we always can redirect fallthru edges.  */
2571 static basic_block
2572 cfg_layout_redirect_edge_and_branch_force (edge e, basic_block dest)
2573 {
2574   edge redirected = cfg_layout_redirect_edge_and_branch (e, dest);
2575
2576   gcc_assert (redirected);
2577   return NULL;
2578 }
2579
2580 /* Same as delete_basic_block but update cfg_layout structures.  */
2581
2582 static void
2583 cfg_layout_delete_block (basic_block bb)
2584 {
2585   rtx insn, next, prev = PREV_INSN (BB_HEAD (bb)), *to, remaints;
2586
2587   if (bb->rbi->header)
2588     {
2589       next = BB_HEAD (bb);
2590       if (prev)
2591         NEXT_INSN (prev) = bb->rbi->header;
2592       else
2593         set_first_insn (bb->rbi->header);
2594       PREV_INSN (bb->rbi->header) = prev;
2595       insn = bb->rbi->header;
2596       while (NEXT_INSN (insn))
2597         insn = NEXT_INSN (insn);
2598       NEXT_INSN (insn) = next;
2599       PREV_INSN (next) = insn;
2600     }
2601   next = NEXT_INSN (BB_END (bb));
2602   if (bb->rbi->footer)
2603     {
2604       insn = bb->rbi->footer;
2605       while (insn)
2606         {
2607           if (BARRIER_P (insn))
2608             {
2609               if (PREV_INSN (insn))
2610                 NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
2611               else
2612                 bb->rbi->footer = NEXT_INSN (insn);
2613               if (NEXT_INSN (insn))
2614                 PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
2615             }
2616           if (LABEL_P (insn))
2617             break;
2618           insn = NEXT_INSN (insn);
2619         }
2620       if (bb->rbi->footer)
2621         {
2622           insn = BB_END (bb);
2623           NEXT_INSN (insn) = bb->rbi->footer;
2624           PREV_INSN (bb->rbi->footer) = insn;
2625           while (NEXT_INSN (insn))
2626             insn = NEXT_INSN (insn);
2627           NEXT_INSN (insn) = next;
2628           if (next)
2629             PREV_INSN (next) = insn;
2630           else
2631             set_last_insn (insn);
2632         }
2633     }
2634   if (bb->next_bb != EXIT_BLOCK_PTR)
2635     to = &bb->next_bb->rbi->header;
2636   else
2637     to = &cfg_layout_function_footer;
2638   rtl_delete_block (bb);
2639
2640   if (prev)
2641     prev = NEXT_INSN (prev);
2642   else
2643     prev = get_insns ();
2644   if (next)
2645     next = PREV_INSN (next);
2646   else
2647     next = get_last_insn ();
2648
2649   if (next && NEXT_INSN (next) != prev)
2650     {
2651       remaints = unlink_insn_chain (prev, next);
2652       insn = remaints;
2653       while (NEXT_INSN (insn))
2654         insn = NEXT_INSN (insn);
2655       NEXT_INSN (insn) = *to;
2656       if (*to)
2657         PREV_INSN (*to) = insn;
2658       *to = remaints;
2659     }
2660 }
2661
2662 /* Return true when blocks A and B can be safely merged.  */
2663 static bool
2664 cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
2665 {
2666   /* If we are partitioning hot/cold basic blocks, we don't want to
2667      mess up unconditional or indirect jumps that cross between hot
2668      and cold sections.
2669
2670      Basic block partitioning may result in some jumps that appear to
2671      be optimizable (or blocks that appear to be mergeable), but which really 
2672      must be left untouched (they are required to make it safely across 
2673      partition boundaries).  See  the comments at the top of 
2674      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
2675
2676   if (flag_reorder_blocks_and_partition
2677       && (find_reg_note (BB_END (a), REG_CROSSING_JUMP, NULL_RTX)
2678           || find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX)
2679           || BB_PARTITION (a) != BB_PARTITION (b)))
2680     return false;
2681
2682   /* There must be exactly one edge in between the blocks.  */
2683   return (a->succ && !a->succ->succ_next && a->succ->dest == b
2684           && !b->pred->pred_next && a != b
2685           /* Must be simple edge.  */
2686           && !(a->succ->flags & EDGE_COMPLEX)
2687           && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
2688           /* If the jump insn has side effects,
2689              we can't kill the edge.  */
2690           && (!JUMP_P (BB_END (a))
2691               || (reload_completed
2692                   ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
2693 }
2694
2695 /* Merge block A and B, abort when it is not possible.  */
2696 static void
2697 cfg_layout_merge_blocks (basic_block a, basic_block b)
2698 {
2699 #ifdef ENABLE_CHECKING
2700   gcc_assert (cfg_layout_can_merge_blocks_p (a, b));
2701 #endif
2702
2703   /* If there was a CODE_LABEL beginning B, delete it.  */
2704   if (LABEL_P (BB_HEAD (b)))
2705     delete_insn (BB_HEAD (b));
2706
2707   /* We should have fallthru edge in a, or we can do dummy redirection to get
2708      it cleaned up.  */
2709   if (JUMP_P (BB_END (a)))
2710     try_redirect_by_replacing_jump (a->succ, b, true);
2711   gcc_assert (!JUMP_P (BB_END (a)));
2712
2713   /* Possible line number notes should appear in between.  */
2714   if (b->rbi->header)
2715     {
2716       rtx first = BB_END (a), last;
2717
2718       last = emit_insn_after (b->rbi->header, BB_END (a));
2719       delete_insn_chain (NEXT_INSN (first), last);
2720       b->rbi->header = NULL;
2721     }
2722
2723   /* In the case basic blocks are not adjacent, move them around.  */
2724   if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
2725     {
2726       rtx first = unlink_insn_chain (BB_HEAD (b), BB_END (b));
2727
2728       emit_insn_after (first, BB_END (a));
2729       /* Skip possible DELETED_LABEL insn.  */
2730       if (!NOTE_INSN_BASIC_BLOCK_P (first))
2731         first = NEXT_INSN (first);
2732       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (first));
2733       BB_HEAD (b) = NULL;
2734       delete_insn (first);
2735     }
2736   /* Otherwise just re-associate the instructions.  */
2737   else
2738     {
2739       rtx insn;
2740
2741       for (insn = BB_HEAD (b);
2742            insn != NEXT_INSN (BB_END (b));
2743            insn = NEXT_INSN (insn))
2744         set_block_for_insn (insn, a);
2745       insn = BB_HEAD (b);
2746       /* Skip possible DELETED_LABEL insn.  */
2747       if (!NOTE_INSN_BASIC_BLOCK_P (insn))
2748         insn = NEXT_INSN (insn);
2749       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
2750       BB_HEAD (b) = NULL;
2751       BB_END (a) = BB_END (b);
2752       delete_insn (insn);
2753     }
2754
2755   /* Possible tablejumps and barriers should appear after the block.  */
2756   if (b->rbi->footer)
2757     {
2758       if (!a->rbi->footer)
2759         a->rbi->footer = b->rbi->footer;
2760       else
2761         {
2762           rtx last = a->rbi->footer;
2763
2764           while (NEXT_INSN (last))
2765             last = NEXT_INSN (last);
2766           NEXT_INSN (last) = b->rbi->footer;
2767           PREV_INSN (b->rbi->footer) = last;
2768         }
2769       b->rbi->footer = NULL;
2770     }
2771
2772   if (dump_file)
2773     fprintf (dump_file, "Merged blocks %d and %d.\n",
2774              a->index, b->index);
2775 }
2776
2777 /* Split edge E.  */
2778
2779 static basic_block
2780 cfg_layout_split_edge (edge e)
2781 {
2782   edge new_e;
2783   basic_block new_bb =
2784     create_basic_block (e->src != ENTRY_BLOCK_PTR
2785                         ? NEXT_INSN (BB_END (e->src)) : get_insns (),
2786                         NULL_RTX, e->src);
2787
2788   /* ??? This info is likely going to be out of date very soon, but we must
2789      create it to avoid getting an ICE later.  */
2790   if (e->dest->global_live_at_start)
2791     {
2792       new_bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
2793       new_bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
2794       COPY_REG_SET (new_bb->global_live_at_start,
2795                     e->dest->global_live_at_start);
2796       COPY_REG_SET (new_bb->global_live_at_end,
2797                     e->dest->global_live_at_start);
2798     }
2799
2800   new_e = make_edge (new_bb, e->dest, EDGE_FALLTHRU);
2801   redirect_edge_and_branch_force (e, new_bb);
2802
2803   return new_bb;
2804 }
2805
2806 /* Do postprocessing after making a forwarder block joined by edge FALLTHRU.  */
2807
2808 static void
2809 rtl_make_forwarder_block (edge fallthru ATTRIBUTE_UNUSED)
2810 {
2811 }
2812
2813 /* Return 1 if BB ends with a call, possibly followed by some
2814    instructions that must stay with the call, 0 otherwise.  */
2815
2816 static bool
2817 rtl_block_ends_with_call_p (basic_block bb)
2818 {
2819   rtx insn = BB_END (bb);
2820
2821   while (!CALL_P (insn)
2822          && insn != BB_HEAD (bb)
2823          && keep_with_call_p (insn))
2824     insn = PREV_INSN (insn);
2825   return (CALL_P (insn));
2826 }
2827
2828 /* Return 1 if BB ends with a conditional branch, 0 otherwise.  */
2829
2830 static bool
2831 rtl_block_ends_with_condjump_p (basic_block bb)
2832 {
2833   return any_condjump_p (BB_END (bb));
2834 }
2835
2836 /* Return true if we need to add fake edge to exit.
2837    Helper function for rtl_flow_call_edges_add.  */
2838
2839 static bool
2840 need_fake_edge_p (rtx insn)
2841 {
2842   if (!INSN_P (insn))
2843     return false;
2844
2845   if ((CALL_P (insn)
2846        && !SIBLING_CALL_P (insn)
2847        && !find_reg_note (insn, REG_NORETURN, NULL)
2848        && !find_reg_note (insn, REG_ALWAYS_RETURN, NULL)
2849        && !CONST_OR_PURE_CALL_P (insn)))
2850     return true;
2851
2852   return ((GET_CODE (PATTERN (insn)) == ASM_OPERANDS
2853            && MEM_VOLATILE_P (PATTERN (insn)))
2854           || (GET_CODE (PATTERN (insn)) == PARALLEL
2855               && asm_noperands (insn) != -1
2856               && MEM_VOLATILE_P (XVECEXP (PATTERN (insn), 0, 0)))
2857           || GET_CODE (PATTERN (insn)) == ASM_INPUT);
2858 }
2859
2860 /* Add fake edges to the function exit for any non constant and non noreturn
2861    calls, volatile inline assembly in the bitmap of blocks specified by
2862    BLOCKS or to the whole CFG if BLOCKS is zero.  Return the number of blocks
2863    that were split.
2864
2865    The goal is to expose cases in which entering a basic block does not imply
2866    that all subsequent instructions must be executed.  */
2867
2868 static int
2869 rtl_flow_call_edges_add (sbitmap blocks)
2870 {
2871   int i;
2872   int blocks_split = 0;
2873   int last_bb = last_basic_block;
2874   bool check_last_block = false;
2875
2876   if (n_basic_blocks == 0)
2877     return 0;
2878
2879   if (! blocks)
2880     check_last_block = true;
2881   else
2882     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
2883
2884   /* In the last basic block, before epilogue generation, there will be
2885      a fallthru edge to EXIT.  Special care is required if the last insn
2886      of the last basic block is a call because make_edge folds duplicate
2887      edges, which would result in the fallthru edge also being marked
2888      fake, which would result in the fallthru edge being removed by
2889      remove_fake_edges, which would result in an invalid CFG.
2890
2891      Moreover, we can't elide the outgoing fake edge, since the block
2892      profiler needs to take this into account in order to solve the minimal
2893      spanning tree in the case that the call doesn't return.
2894
2895      Handle this by adding a dummy instruction in a new last basic block.  */
2896   if (check_last_block)
2897     {
2898       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
2899       rtx insn = BB_END (bb);
2900
2901       /* Back up past insns that must be kept in the same block as a call.  */
2902       while (insn != BB_HEAD (bb)
2903              && keep_with_call_p (insn))
2904         insn = PREV_INSN (insn);
2905
2906       if (need_fake_edge_p (insn))
2907         {
2908           edge e;
2909
2910           for (e = bb->succ; e; e = e->succ_next)
2911             if (e->dest == EXIT_BLOCK_PTR)
2912               {
2913                 insert_insn_on_edge (gen_rtx_USE (VOIDmode, const0_rtx), e);
2914                 commit_edge_insertions ();
2915                 break;
2916               }
2917         }
2918     }
2919
2920   /* Now add fake edges to the function exit for any non constant
2921      calls since there is no way that we can determine if they will
2922      return or not...  */
2923
2924   for (i = 0; i < last_bb; i++)
2925     {
2926       basic_block bb = BASIC_BLOCK (i);
2927       rtx insn;
2928       rtx prev_insn;
2929
2930       if (!bb)
2931         continue;
2932
2933       if (blocks && !TEST_BIT (blocks, i))
2934         continue;
2935
2936       for (insn = BB_END (bb); ; insn = prev_insn)
2937         {
2938           prev_insn = PREV_INSN (insn);
2939           if (need_fake_edge_p (insn))
2940             {
2941               edge e;
2942               rtx split_at_insn = insn;
2943
2944               /* Don't split the block between a call and an insn that should
2945                  remain in the same block as the call.  */
2946               if (CALL_P (insn))
2947                 while (split_at_insn != BB_END (bb)
2948                        && keep_with_call_p (NEXT_INSN (split_at_insn)))
2949                   split_at_insn = NEXT_INSN (split_at_insn);
2950
2951               /* The handling above of the final block before the epilogue
2952                  should be enough to verify that there is no edge to the exit
2953                  block in CFG already.  Calling make_edge in such case would
2954                  cause us to mark that edge as fake and remove it later.  */
2955
2956 #ifdef ENABLE_CHECKING
2957               if (split_at_insn == BB_END (bb))
2958                 for (e = bb->succ; e; e = e->succ_next)
2959                   gcc_assert (e->dest != EXIT_BLOCK_PTR);
2960 #endif
2961
2962               /* Note that the following may create a new basic block
2963                  and renumber the existing basic blocks.  */
2964               if (split_at_insn != BB_END (bb))
2965                 {
2966                   e = split_block (bb, split_at_insn);
2967                   if (e)
2968                     blocks_split++;
2969                 }
2970
2971               make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
2972             }
2973
2974           if (insn == BB_HEAD (bb))
2975             break;
2976         }
2977     }
2978
2979   if (blocks_split)
2980     verify_flow_info ();
2981
2982   return blocks_split;
2983 }
2984
2985 /* Implementation of CFG manipulation for linearized RTL.  */
2986 struct cfg_hooks rtl_cfg_hooks = {
2987   "rtl",
2988   rtl_verify_flow_info,
2989   rtl_dump_bb,
2990   rtl_create_basic_block,
2991   rtl_redirect_edge_and_branch,
2992   rtl_redirect_edge_and_branch_force,
2993   rtl_delete_block,
2994   rtl_split_block,
2995   rtl_move_block_after,
2996   rtl_can_merge_blocks,  /* can_merge_blocks_p */
2997   rtl_merge_blocks,
2998   rtl_predict_edge,
2999   rtl_predicted_by_p,
3000   NULL, /* can_duplicate_block_p */
3001   NULL, /* duplicate_block */
3002   rtl_split_edge,
3003   rtl_make_forwarder_block,
3004   rtl_tidy_fallthru_edge,
3005   rtl_block_ends_with_call_p,
3006   rtl_block_ends_with_condjump_p,
3007   rtl_flow_call_edges_add
3008 };
3009
3010 /* Implementation of CFG manipulation for cfg layout RTL, where
3011    basic block connected via fallthru edges does not have to be adjacent.
3012    This representation will hopefully become the default one in future
3013    version of the compiler.  */
3014
3015 /* We do not want to declare these functions in a header file, since they
3016    should only be used through the cfghooks interface, and we do not want to
3017    move them here since it would require also moving quite a lot of related
3018    code.  */
3019 extern bool cfg_layout_can_duplicate_bb_p (basic_block);
3020 extern basic_block cfg_layout_duplicate_bb (basic_block);
3021
3022 struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
3023   "cfglayout mode",
3024   rtl_verify_flow_info_1,
3025   rtl_dump_bb,
3026   cfg_layout_create_basic_block,
3027   cfg_layout_redirect_edge_and_branch,
3028   cfg_layout_redirect_edge_and_branch_force,
3029   cfg_layout_delete_block,
3030   cfg_layout_split_block,
3031   rtl_move_block_after,
3032   cfg_layout_can_merge_blocks_p,
3033   cfg_layout_merge_blocks,
3034   rtl_predict_edge,
3035   rtl_predicted_by_p,
3036   cfg_layout_can_duplicate_bb_p,
3037   cfg_layout_duplicate_bb,
3038   cfg_layout_split_edge,
3039   rtl_make_forwarder_block,
3040   NULL,
3041   rtl_block_ends_with_call_p,
3042   rtl_block_ends_with_condjump_p,
3043   rtl_flow_call_edges_add
3044 };
3045