OSDN Git Service

ce676a64f12e07fd8ef90e46c1768e470ed52077
[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             {
1974               error ("verify_flow_info: REG_BR_PROB does not match cfg %wi %i",
1975                      INTVAL (XEXP (note, 0)), BRANCH_EDGE (bb)->probability);
1976               err = 1;
1977             }
1978         }
1979       for (e = bb->succ; e; e = e->succ_next)
1980         {
1981           if (e->flags & EDGE_FALLTHRU)
1982             {
1983               n_fallthru++, fallthru = e;
1984               if ((e->flags & EDGE_CROSSING)
1985                   || (BB_PARTITION (e->src) != BB_PARTITION (e->dest)
1986                       && e->src != ENTRY_BLOCK_PTR
1987                       && e->dest != EXIT_BLOCK_PTR))
1988             { 
1989                   error ("Fallthru edge crosses section boundary (bb %i)",
1990                          e->src->index);
1991                   err = 1;
1992                 }
1993             }
1994
1995           if ((e->flags & ~(EDGE_DFS_BACK
1996                             | EDGE_CAN_FALLTHRU
1997                             | EDGE_IRREDUCIBLE_LOOP
1998                             | EDGE_LOOP_EXIT)) == 0)
1999             n_branch++;
2000
2001           if (e->flags & EDGE_ABNORMAL_CALL)
2002             n_call++;
2003
2004           if (e->flags & EDGE_EH)
2005             n_eh++;
2006           else if (e->flags & EDGE_ABNORMAL)
2007             n_abnormal++;
2008         }
2009
2010       if (n_eh && GET_CODE (PATTERN (BB_END (bb))) != RESX
2011           && !find_reg_note (BB_END (bb), REG_EH_REGION, NULL_RTX))
2012         {
2013           error ("Missing REG_EH_REGION note in the end of bb %i", bb->index);
2014           err = 1;
2015         }
2016       if (n_branch
2017           && (!JUMP_P (BB_END (bb))
2018               || (n_branch > 1 && (any_uncondjump_p (BB_END (bb))
2019                                    || any_condjump_p (BB_END (bb))))))
2020         {
2021           error ("Too many outgoing branch edges from bb %i", bb->index);
2022           err = 1;
2023         }
2024       if (n_fallthru && any_uncondjump_p (BB_END (bb)))
2025         {
2026           error ("Fallthru edge after unconditional jump %i", bb->index);
2027           err = 1;
2028         }
2029       if (n_branch != 1 && any_uncondjump_p (BB_END (bb)))
2030         {
2031           error ("Wrong amount of branch edges after unconditional jump %i", bb->index);
2032           err = 1;
2033         }
2034       if (n_branch != 1 && any_condjump_p (BB_END (bb))
2035           && JUMP_LABEL (BB_END (bb)) != BB_HEAD (fallthru->dest))
2036         {
2037           error ("Wrong amount of branch edges after conditional jump %i", bb->index);
2038           err = 1;
2039         }
2040       if (n_call && !CALL_P (BB_END (bb)))
2041         {
2042           error ("Call edges for non-call insn in bb %i", bb->index);
2043           err = 1;
2044         }
2045       if (n_abnormal
2046           && (!CALL_P (BB_END (bb)) && n_call != n_abnormal)
2047           && (!JUMP_P (BB_END (bb))
2048               || any_condjump_p (BB_END (bb))
2049               || any_uncondjump_p (BB_END (bb))))
2050         {
2051           error ("Abnormal edges for no purpose in bb %i", bb->index);
2052           err = 1;
2053         }
2054
2055       for (x = BB_HEAD (bb); x != NEXT_INSN (BB_END (bb)); x = NEXT_INSN (x))
2056         if (BLOCK_FOR_INSN (x) != bb)
2057           {
2058             debug_rtx (x);
2059             if (! BLOCK_FOR_INSN (x))
2060               error
2061                 ("insn %d inside basic block %d but block_for_insn is NULL",
2062                  INSN_UID (x), bb->index);
2063             else
2064               error
2065                 ("insn %d inside basic block %d but block_for_insn is %i",
2066                  INSN_UID (x), bb->index, BLOCK_FOR_INSN (x)->index);
2067
2068             err = 1;
2069           }
2070
2071       /* OK pointers are correct.  Now check the header of basic
2072          block.  It ought to contain optional CODE_LABEL followed
2073          by NOTE_BASIC_BLOCK.  */
2074       x = BB_HEAD (bb);
2075       if (LABEL_P (x))
2076         {
2077           if (BB_END (bb) == x)
2078             {
2079               error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2080                      bb->index);
2081               err = 1;
2082             }
2083
2084           x = NEXT_INSN (x);
2085         }
2086
2087       if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
2088         {
2089           error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2090                  bb->index);
2091           err = 1;
2092         }
2093
2094       if (BB_END (bb) == x)
2095         /* Do checks for empty blocks her. e */
2096         ;
2097       else
2098         for (x = NEXT_INSN (x); x; x = NEXT_INSN (x))
2099           {
2100             if (NOTE_INSN_BASIC_BLOCK_P (x))
2101               {
2102                 error ("NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d",
2103                        INSN_UID (x), bb->index);
2104                 err = 1;
2105               }
2106
2107             if (x == BB_END (bb))
2108               break;
2109
2110             if (control_flow_insn_p (x))
2111               {
2112                 error ("in basic block %d:", bb->index);
2113                 fatal_insn ("flow control insn inside a basic block", x);
2114               }
2115           }
2116     }
2117
2118   /* Clean up.  */
2119   free (bb_info);
2120   return err;
2121 }
2122
2123 /* Verify the CFG and RTL consistency common for both underlying RTL and
2124    cfglayout RTL.
2125
2126    Currently it does following checks:
2127    - all checks of rtl_verify_flow_info_1
2128    - check that all insns are in the basic blocks
2129      (except the switch handling code, barriers and notes)
2130    - check that all returns are followed by barriers
2131    - check that all fallthru edge points to the adjacent blocks.  */
2132 static int
2133 rtl_verify_flow_info (void)
2134 {
2135   basic_block bb;
2136   int err = rtl_verify_flow_info_1 ();
2137   rtx x;
2138   int num_bb_notes;
2139   const rtx rtx_first = get_insns ();
2140   basic_block last_bb_seen = ENTRY_BLOCK_PTR, curr_bb = NULL;
2141
2142   FOR_EACH_BB_REVERSE (bb)
2143     {
2144       edge e;
2145       for (e = bb->succ; e; e = e->succ_next)
2146         if (e->flags & EDGE_FALLTHRU)
2147           break;
2148       if (!e)
2149         {
2150           rtx insn;
2151
2152           /* Ensure existence of barrier in BB with no fallthru edges.  */
2153           for (insn = BB_END (bb); !insn || !BARRIER_P (insn);
2154                insn = NEXT_INSN (insn))
2155             if (!insn
2156                 || (NOTE_P (insn)
2157                     && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK))
2158                 {
2159                   error ("missing barrier after block %i", bb->index);
2160                   err = 1;
2161                   break;
2162                 }
2163         }
2164       else if (e->src != ENTRY_BLOCK_PTR
2165                && e->dest != EXIT_BLOCK_PTR)
2166         {
2167           rtx insn;
2168
2169           if (e->src->next_bb != e->dest)
2170             {
2171               error
2172                 ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
2173                  e->src->index, e->dest->index);
2174               err = 1;
2175             }
2176           else
2177             for (insn = NEXT_INSN (BB_END (e->src)); insn != BB_HEAD (e->dest);
2178                  insn = NEXT_INSN (insn))
2179               if (BARRIER_P (insn)
2180 #ifndef CASE_DROPS_THROUGH
2181                   || INSN_P (insn)
2182 #else
2183                   || (INSN_P (insn) && ! JUMP_TABLE_DATA_P (insn))
2184 #endif
2185                   )
2186                 {
2187                   error ("verify_flow_info: Incorrect fallthru %i->%i",
2188                          e->src->index, e->dest->index);
2189                   fatal_insn ("wrong insn in the fallthru edge", insn);
2190                   err = 1;
2191                 }
2192         }
2193     }
2194
2195   num_bb_notes = 0;
2196   last_bb_seen = ENTRY_BLOCK_PTR;
2197
2198   for (x = rtx_first; x; x = NEXT_INSN (x))
2199     {
2200       if (NOTE_INSN_BASIC_BLOCK_P (x))
2201         {
2202           bb = NOTE_BASIC_BLOCK (x);
2203
2204           num_bb_notes++;
2205           if (bb != last_bb_seen->next_bb)
2206             internal_error ("basic blocks not laid down consecutively");
2207
2208           curr_bb = last_bb_seen = bb;
2209         }
2210
2211       if (!curr_bb)
2212         {
2213           switch (GET_CODE (x))
2214             {
2215             case BARRIER:
2216             case NOTE:
2217               break;
2218
2219             case CODE_LABEL:
2220               /* An addr_vec is placed outside any basic block.  */
2221               if (NEXT_INSN (x)
2222                   && JUMP_P (NEXT_INSN (x))
2223                   && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
2224                       || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
2225                 x = NEXT_INSN (x);
2226
2227               /* But in any case, non-deletable labels can appear anywhere.  */
2228               break;
2229
2230             default:
2231               fatal_insn ("insn outside basic block", x);
2232             }
2233         }
2234
2235       if (INSN_P (x)
2236           && JUMP_P (x)
2237           && returnjump_p (x) && ! condjump_p (x)
2238           && ! (NEXT_INSN (x) && BARRIER_P (NEXT_INSN (x))))
2239             fatal_insn ("return not followed by barrier", x);
2240       if (curr_bb && x == BB_END (curr_bb))
2241         curr_bb = NULL;
2242     }
2243
2244   if (num_bb_notes != n_basic_blocks)
2245     internal_error
2246       ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2247        num_bb_notes, n_basic_blocks);
2248
2249    return err;
2250 }
2251 \f
2252 /* Assume that the preceding pass has possibly eliminated jump instructions
2253    or converted the unconditional jumps.  Eliminate the edges from CFG.
2254    Return true if any edges are eliminated.  */
2255
2256 bool
2257 purge_dead_edges (basic_block bb)
2258 {
2259   edge e, next;
2260   rtx insn = BB_END (bb), note;
2261   bool purged = false;
2262
2263   /* If this instruction cannot trap, remove REG_EH_REGION notes.  */
2264   if (NONJUMP_INSN_P (insn)
2265       && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
2266     {
2267       rtx eqnote;
2268
2269       if (! may_trap_p (PATTERN (insn))
2270           || ((eqnote = find_reg_equal_equiv_note (insn))
2271               && ! may_trap_p (XEXP (eqnote, 0))))
2272         remove_note (insn, note);
2273     }
2274
2275   /* Cleanup abnormal edges caused by exceptions or non-local gotos.  */
2276   for (e = bb->succ; e; e = next)
2277     {
2278       next = e->succ_next;
2279       if (e->flags & EDGE_EH)
2280         {
2281           if (can_throw_internal (BB_END (bb)))
2282             continue;
2283         }
2284       else if (e->flags & EDGE_ABNORMAL_CALL)
2285         {
2286           if (CALL_P (BB_END (bb))
2287               && (! (note = find_reg_note (insn, REG_EH_REGION, NULL))
2288                   || INTVAL (XEXP (note, 0)) >= 0))
2289             continue;
2290         }
2291       else
2292         continue;
2293
2294       remove_edge (e);
2295       bb->flags |= BB_DIRTY;
2296       purged = true;
2297     }
2298
2299   if (JUMP_P (insn))
2300     {
2301       rtx note;
2302       edge b,f;
2303
2304       /* We do care only about conditional jumps and simplejumps.  */
2305       if (!any_condjump_p (insn)
2306           && !returnjump_p (insn)
2307           && !simplejump_p (insn))
2308         return purged;
2309
2310       /* Branch probability/prediction notes are defined only for
2311          condjumps.  We've possibly turned condjump into simplejump.  */
2312       if (simplejump_p (insn))
2313         {
2314           note = find_reg_note (insn, REG_BR_PROB, NULL);
2315           if (note)
2316             remove_note (insn, note);
2317           while ((note = find_reg_note (insn, REG_BR_PRED, NULL)))
2318             remove_note (insn, note);
2319         }
2320
2321       for (e = bb->succ; e; e = next)
2322         {
2323           next = e->succ_next;
2324
2325           /* Avoid abnormal flags to leak from computed jumps turned
2326              into simplejumps.  */
2327
2328           e->flags &= ~EDGE_ABNORMAL;
2329
2330           /* See if this edge is one we should keep.  */
2331           if ((e->flags & EDGE_FALLTHRU) && any_condjump_p (insn))
2332             /* A conditional jump can fall through into the next
2333                block, so we should keep the edge.  */
2334             continue;
2335           else if (e->dest != EXIT_BLOCK_PTR
2336                    && BB_HEAD (e->dest) == JUMP_LABEL (insn))
2337             /* If the destination block is the target of the jump,
2338                keep the edge.  */
2339             continue;
2340           else if (e->dest == EXIT_BLOCK_PTR && returnjump_p (insn))
2341             /* If the destination block is the exit block, and this
2342                instruction is a return, then keep the edge.  */
2343             continue;
2344           else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2345             /* Keep the edges that correspond to exceptions thrown by
2346                this instruction and rematerialize the EDGE_ABNORMAL
2347                flag we just cleared above.  */
2348             {
2349               e->flags |= EDGE_ABNORMAL;
2350               continue;
2351             }
2352
2353           /* We do not need this edge.  */
2354           bb->flags |= BB_DIRTY;
2355           purged = true;
2356           remove_edge (e);
2357         }
2358
2359       if (!bb->succ || !purged)
2360         return purged;
2361
2362       if (dump_file)
2363         fprintf (dump_file, "Purged edges from bb %i\n", bb->index);
2364
2365       if (!optimize)
2366         return purged;
2367
2368       /* Redistribute probabilities.  */
2369       if (!bb->succ->succ_next)
2370         {
2371           bb->succ->probability = REG_BR_PROB_BASE;
2372           bb->succ->count = bb->count;
2373         }
2374       else
2375         {
2376           note = find_reg_note (insn, REG_BR_PROB, NULL);
2377           if (!note)
2378             return purged;
2379
2380           b = BRANCH_EDGE (bb);
2381           f = FALLTHRU_EDGE (bb);
2382           b->probability = INTVAL (XEXP (note, 0));
2383           f->probability = REG_BR_PROB_BASE - b->probability;
2384           b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2385           f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2386         }
2387
2388       return purged;
2389     }
2390   else if (CALL_P (insn) && SIBLING_CALL_P (insn))
2391     {
2392       /* First, there should not be any EH or ABCALL edges resulting
2393          from non-local gotos and the like.  If there were, we shouldn't
2394          have created the sibcall in the first place.  Second, there
2395          should of course never have been a fallthru edge.  */
2396       gcc_assert (bb->succ && !bb->succ->succ_next);
2397       gcc_assert (bb->succ->flags == (EDGE_SIBCALL | EDGE_ABNORMAL));
2398
2399       return 0;
2400     }
2401
2402   /* If we don't see a jump insn, we don't know exactly why the block would
2403      have been broken at this point.  Look for a simple, non-fallthru edge,
2404      as these are only created by conditional branches.  If we find such an
2405      edge we know that there used to be a jump here and can then safely
2406      remove all non-fallthru edges.  */
2407   for (e = bb->succ; e && (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU));
2408        e = e->succ_next)
2409     ;
2410
2411   if (!e)
2412     return purged;
2413
2414   for (e = bb->succ; e; e = next)
2415     {
2416       next = e->succ_next;
2417       if (!(e->flags & EDGE_FALLTHRU))
2418         {
2419           bb->flags |= BB_DIRTY;
2420           remove_edge (e);
2421           purged = true;
2422         }
2423     }
2424
2425   gcc_assert (bb->succ && !bb->succ->succ_next);
2426
2427   bb->succ->probability = REG_BR_PROB_BASE;
2428   bb->succ->count = bb->count;
2429
2430   if (dump_file)
2431     fprintf (dump_file, "Purged non-fallthru edges from bb %i\n",
2432              bb->index);
2433   return purged;
2434 }
2435
2436 /* Search all basic blocks for potentially dead edges and purge them.  Return
2437    true if some edge has been eliminated.  */
2438
2439 bool
2440 purge_all_dead_edges (int update_life_p)
2441 {
2442   int purged = false;
2443   sbitmap blocks = 0;
2444   basic_block bb;
2445
2446   if (update_life_p)
2447     {
2448       blocks = sbitmap_alloc (last_basic_block);
2449       sbitmap_zero (blocks);
2450     }
2451
2452   FOR_EACH_BB (bb)
2453     {
2454       bool purged_here = purge_dead_edges (bb);
2455
2456       purged |= purged_here;
2457       if (purged_here && update_life_p)
2458         SET_BIT (blocks, bb->index);
2459     }
2460
2461   if (update_life_p && purged)
2462     update_life_info (blocks, UPDATE_LIFE_GLOBAL,
2463                       PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
2464                       | PROP_KILL_DEAD_CODE);
2465
2466   if (update_life_p)
2467     sbitmap_free (blocks);
2468   return purged;
2469 }
2470
2471 /* Same as split_block but update cfg_layout structures.  */
2472
2473 static basic_block
2474 cfg_layout_split_block (basic_block bb, void *insnp)
2475 {
2476   rtx insn = insnp;
2477   basic_block new_bb = rtl_split_block (bb, insn);
2478
2479   new_bb->rbi->footer = bb->rbi->footer;
2480   bb->rbi->footer = NULL;
2481
2482   return new_bb;
2483 }
2484
2485
2486 /* Redirect Edge to DEST.  */
2487 static edge
2488 cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
2489 {
2490   basic_block src = e->src;
2491   edge ret;
2492
2493   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
2494     return NULL;
2495
2496   if (e->dest == dest)
2497     return e;
2498
2499   if (e->src != ENTRY_BLOCK_PTR
2500       && (ret = try_redirect_by_replacing_jump (e, dest, true)))
2501     {
2502       src->flags |= BB_DIRTY;
2503       return ret;
2504     }
2505
2506   if (e->src == ENTRY_BLOCK_PTR
2507       && (e->flags & EDGE_FALLTHRU) && !(e->flags & EDGE_COMPLEX))
2508     {
2509       if (dump_file)
2510         fprintf (dump_file, "Redirecting entry edge from bb %i to %i\n",
2511                  e->src->index, dest->index);
2512
2513       e->src->flags |= BB_DIRTY;
2514       redirect_edge_succ (e, dest);
2515       return e;
2516     }
2517
2518   /* Redirect_edge_and_branch may decide to turn branch into fallthru edge
2519      in the case the basic block appears to be in sequence.  Avoid this
2520      transformation.  */
2521
2522   if (e->flags & EDGE_FALLTHRU)
2523     {
2524       /* Redirect any branch edges unified with the fallthru one.  */
2525       if (JUMP_P (BB_END (src))
2526           && label_is_jump_target_p (BB_HEAD (e->dest),
2527                                      BB_END (src)))
2528         {
2529           edge redirected;
2530           
2531           if (dump_file)
2532             fprintf (dump_file, "Fallthru edge unified with branch "
2533                      "%i->%i redirected to %i\n",
2534                      e->src->index, e->dest->index, dest->index);
2535           e->flags &= ~EDGE_FALLTHRU;
2536           redirected = redirect_branch_edge (e, dest);
2537           gcc_assert (redirected);
2538           e->flags |= EDGE_FALLTHRU;
2539           e->src->flags |= BB_DIRTY;
2540           return e;
2541         }
2542       /* In case we are redirecting fallthru edge to the branch edge
2543          of conditional jump, remove it.  */
2544       if (src->succ->succ_next
2545           && !src->succ->succ_next->succ_next)
2546         {
2547           edge s = e->succ_next ? e->succ_next : src->succ;
2548           if (s->dest == dest
2549               && any_condjump_p (BB_END (src))
2550               && onlyjump_p (BB_END (src)))
2551             delete_insn (BB_END (src));
2552         }
2553       ret = redirect_edge_succ_nodup (e, dest);
2554       if (dump_file)
2555         fprintf (dump_file, "Fallthru edge %i->%i redirected to %i\n",
2556                  e->src->index, e->dest->index, dest->index);
2557     }
2558   else
2559     ret = redirect_branch_edge (e, dest);
2560
2561   /* We don't want simplejumps in the insn stream during cfglayout.  */
2562   gcc_assert (!simplejump_p (BB_END (src)));
2563
2564   src->flags |= BB_DIRTY;
2565   return ret;
2566 }
2567
2568 /* Simple wrapper as we always can redirect fallthru edges.  */
2569 static basic_block
2570 cfg_layout_redirect_edge_and_branch_force (edge e, basic_block dest)
2571 {
2572   edge redirected = cfg_layout_redirect_edge_and_branch (e, dest);
2573
2574   gcc_assert (redirected);
2575   return NULL;
2576 }
2577
2578 /* Same as delete_basic_block but update cfg_layout structures.  */
2579
2580 static void
2581 cfg_layout_delete_block (basic_block bb)
2582 {
2583   rtx insn, next, prev = PREV_INSN (BB_HEAD (bb)), *to, remaints;
2584
2585   if (bb->rbi->header)
2586     {
2587       next = BB_HEAD (bb);
2588       if (prev)
2589         NEXT_INSN (prev) = bb->rbi->header;
2590       else
2591         set_first_insn (bb->rbi->header);
2592       PREV_INSN (bb->rbi->header) = prev;
2593       insn = bb->rbi->header;
2594       while (NEXT_INSN (insn))
2595         insn = NEXT_INSN (insn);
2596       NEXT_INSN (insn) = next;
2597       PREV_INSN (next) = insn;
2598     }
2599   next = NEXT_INSN (BB_END (bb));
2600   if (bb->rbi->footer)
2601     {
2602       insn = bb->rbi->footer;
2603       while (insn)
2604         {
2605           if (BARRIER_P (insn))
2606             {
2607               if (PREV_INSN (insn))
2608                 NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
2609               else
2610                 bb->rbi->footer = NEXT_INSN (insn);
2611               if (NEXT_INSN (insn))
2612                 PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
2613             }
2614           if (LABEL_P (insn))
2615             break;
2616           insn = NEXT_INSN (insn);
2617         }
2618       if (bb->rbi->footer)
2619         {
2620           insn = BB_END (bb);
2621           NEXT_INSN (insn) = bb->rbi->footer;
2622           PREV_INSN (bb->rbi->footer) = insn;
2623           while (NEXT_INSN (insn))
2624             insn = NEXT_INSN (insn);
2625           NEXT_INSN (insn) = next;
2626           if (next)
2627             PREV_INSN (next) = insn;
2628           else
2629             set_last_insn (insn);
2630         }
2631     }
2632   if (bb->next_bb != EXIT_BLOCK_PTR)
2633     to = &bb->next_bb->rbi->header;
2634   else
2635     to = &cfg_layout_function_footer;
2636   rtl_delete_block (bb);
2637
2638   if (prev)
2639     prev = NEXT_INSN (prev);
2640   else
2641     prev = get_insns ();
2642   if (next)
2643     next = PREV_INSN (next);
2644   else
2645     next = get_last_insn ();
2646
2647   if (next && NEXT_INSN (next) != prev)
2648     {
2649       remaints = unlink_insn_chain (prev, next);
2650       insn = remaints;
2651       while (NEXT_INSN (insn))
2652         insn = NEXT_INSN (insn);
2653       NEXT_INSN (insn) = *to;
2654       if (*to)
2655         PREV_INSN (*to) = insn;
2656       *to = remaints;
2657     }
2658 }
2659
2660 /* Return true when blocks A and B can be safely merged.  */
2661 static bool
2662 cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
2663 {
2664   /* If we are partitioning hot/cold basic blocks, we don't want to
2665      mess up unconditional or indirect jumps that cross between hot
2666      and cold sections.
2667
2668      Basic block partitioning may result in some jumps that appear to
2669      be optimizable (or blocks that appear to be mergeable), but which really 
2670      must be left untouched (they are required to make it safely across 
2671      partition boundaries).  See  the comments at the top of 
2672      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
2673
2674   if (flag_reorder_blocks_and_partition
2675       && (find_reg_note (BB_END (a), REG_CROSSING_JUMP, NULL_RTX)
2676           || find_reg_note (BB_END (b), REG_CROSSING_JUMP, NULL_RTX)
2677           || BB_PARTITION (a) != BB_PARTITION (b)))
2678     return false;
2679
2680   /* There must be exactly one edge in between the blocks.  */
2681   return (a->succ && !a->succ->succ_next && a->succ->dest == b
2682           && !b->pred->pred_next && a != b
2683           /* Must be simple edge.  */
2684           && !(a->succ->flags & EDGE_COMPLEX)
2685           && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
2686           /* If the jump insn has side effects,
2687              we can't kill the edge.  */
2688           && (!JUMP_P (BB_END (a))
2689               || (reload_completed
2690                   ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
2691 }
2692
2693 /* Merge block A and B, abort when it is not possible.  */
2694 static void
2695 cfg_layout_merge_blocks (basic_block a, basic_block b)
2696 {
2697 #ifdef ENABLE_CHECKING
2698   gcc_assert (cfg_layout_can_merge_blocks_p (a, b));
2699 #endif
2700
2701   /* If there was a CODE_LABEL beginning B, delete it.  */
2702   if (LABEL_P (BB_HEAD (b)))
2703     delete_insn (BB_HEAD (b));
2704
2705   /* We should have fallthru edge in a, or we can do dummy redirection to get
2706      it cleaned up.  */
2707   if (JUMP_P (BB_END (a)))
2708     try_redirect_by_replacing_jump (a->succ, b, true);
2709   gcc_assert (!JUMP_P (BB_END (a)));
2710
2711   /* Possible line number notes should appear in between.  */
2712   if (b->rbi->header)
2713     {
2714       rtx first = BB_END (a), last;
2715
2716       last = emit_insn_after (b->rbi->header, BB_END (a));
2717       delete_insn_chain (NEXT_INSN (first), last);
2718       b->rbi->header = NULL;
2719     }
2720
2721   /* In the case basic blocks are not adjacent, move them around.  */
2722   if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
2723     {
2724       rtx first = unlink_insn_chain (BB_HEAD (b), BB_END (b));
2725
2726       emit_insn_after (first, BB_END (a));
2727       /* Skip possible DELETED_LABEL insn.  */
2728       if (!NOTE_INSN_BASIC_BLOCK_P (first))
2729         first = NEXT_INSN (first);
2730       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (first));
2731       BB_HEAD (b) = NULL;
2732       delete_insn (first);
2733     }
2734   /* Otherwise just re-associate the instructions.  */
2735   else
2736     {
2737       rtx insn;
2738
2739       for (insn = BB_HEAD (b);
2740            insn != NEXT_INSN (BB_END (b));
2741            insn = NEXT_INSN (insn))
2742         set_block_for_insn (insn, a);
2743       insn = BB_HEAD (b);
2744       /* Skip possible DELETED_LABEL insn.  */
2745       if (!NOTE_INSN_BASIC_BLOCK_P (insn))
2746         insn = NEXT_INSN (insn);
2747       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
2748       BB_HEAD (b) = NULL;
2749       BB_END (a) = BB_END (b);
2750       delete_insn (insn);
2751     }
2752
2753   /* Possible tablejumps and barriers should appear after the block.  */
2754   if (b->rbi->footer)
2755     {
2756       if (!a->rbi->footer)
2757         a->rbi->footer = b->rbi->footer;
2758       else
2759         {
2760           rtx last = a->rbi->footer;
2761
2762           while (NEXT_INSN (last))
2763             last = NEXT_INSN (last);
2764           NEXT_INSN (last) = b->rbi->footer;
2765           PREV_INSN (b->rbi->footer) = last;
2766         }
2767       b->rbi->footer = NULL;
2768     }
2769
2770   if (dump_file)
2771     fprintf (dump_file, "Merged blocks %d and %d.\n",
2772              a->index, b->index);
2773 }
2774
2775 /* Split edge E.  */
2776
2777 static basic_block
2778 cfg_layout_split_edge (edge e)
2779 {
2780   edge new_e;
2781   basic_block new_bb =
2782     create_basic_block (e->src != ENTRY_BLOCK_PTR
2783                         ? NEXT_INSN (BB_END (e->src)) : get_insns (),
2784                         NULL_RTX, e->src);
2785
2786   /* ??? This info is likely going to be out of date very soon, but we must
2787      create it to avoid getting an ICE later.  */
2788   if (e->dest->global_live_at_start)
2789     {
2790       new_bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
2791       new_bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
2792       COPY_REG_SET (new_bb->global_live_at_start,
2793                     e->dest->global_live_at_start);
2794       COPY_REG_SET (new_bb->global_live_at_end,
2795                     e->dest->global_live_at_start);
2796     }
2797
2798   new_e = make_edge (new_bb, e->dest, EDGE_FALLTHRU);
2799   redirect_edge_and_branch_force (e, new_bb);
2800
2801   return new_bb;
2802 }
2803
2804 /* Do postprocessing after making a forwarder block joined by edge FALLTHRU.  */
2805
2806 static void
2807 rtl_make_forwarder_block (edge fallthru ATTRIBUTE_UNUSED)
2808 {
2809 }
2810
2811 /* Return 1 if BB ends with a call, possibly followed by some
2812    instructions that must stay with the call, 0 otherwise.  */
2813
2814 static bool
2815 rtl_block_ends_with_call_p (basic_block bb)
2816 {
2817   rtx insn = BB_END (bb);
2818
2819   while (!CALL_P (insn)
2820          && insn != BB_HEAD (bb)
2821          && keep_with_call_p (insn))
2822     insn = PREV_INSN (insn);
2823   return (CALL_P (insn));
2824 }
2825
2826 /* Return 1 if BB ends with a conditional branch, 0 otherwise.  */
2827
2828 static bool
2829 rtl_block_ends_with_condjump_p (basic_block bb)
2830 {
2831   return any_condjump_p (BB_END (bb));
2832 }
2833
2834 /* Return true if we need to add fake edge to exit.
2835    Helper function for rtl_flow_call_edges_add.  */
2836
2837 static bool
2838 need_fake_edge_p (rtx insn)
2839 {
2840   if (!INSN_P (insn))
2841     return false;
2842
2843   if ((CALL_P (insn)
2844        && !SIBLING_CALL_P (insn)
2845        && !find_reg_note (insn, REG_NORETURN, NULL)
2846        && !find_reg_note (insn, REG_ALWAYS_RETURN, NULL)
2847        && !CONST_OR_PURE_CALL_P (insn)))
2848     return true;
2849
2850   return ((GET_CODE (PATTERN (insn)) == ASM_OPERANDS
2851            && MEM_VOLATILE_P (PATTERN (insn)))
2852           || (GET_CODE (PATTERN (insn)) == PARALLEL
2853               && asm_noperands (insn) != -1
2854               && MEM_VOLATILE_P (XVECEXP (PATTERN (insn), 0, 0)))
2855           || GET_CODE (PATTERN (insn)) == ASM_INPUT);
2856 }
2857
2858 /* Add fake edges to the function exit for any non constant and non noreturn
2859    calls, volatile inline assembly in the bitmap of blocks specified by
2860    BLOCKS or to the whole CFG if BLOCKS is zero.  Return the number of blocks
2861    that were split.
2862
2863    The goal is to expose cases in which entering a basic block does not imply
2864    that all subsequent instructions must be executed.  */
2865
2866 static int
2867 rtl_flow_call_edges_add (sbitmap blocks)
2868 {
2869   int i;
2870   int blocks_split = 0;
2871   int last_bb = last_basic_block;
2872   bool check_last_block = false;
2873
2874   if (n_basic_blocks == 0)
2875     return 0;
2876
2877   if (! blocks)
2878     check_last_block = true;
2879   else
2880     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
2881
2882   /* In the last basic block, before epilogue generation, there will be
2883      a fallthru edge to EXIT.  Special care is required if the last insn
2884      of the last basic block is a call because make_edge folds duplicate
2885      edges, which would result in the fallthru edge also being marked
2886      fake, which would result in the fallthru edge being removed by
2887      remove_fake_edges, which would result in an invalid CFG.
2888
2889      Moreover, we can't elide the outgoing fake edge, since the block
2890      profiler needs to take this into account in order to solve the minimal
2891      spanning tree in the case that the call doesn't return.
2892
2893      Handle this by adding a dummy instruction in a new last basic block.  */
2894   if (check_last_block)
2895     {
2896       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
2897       rtx insn = BB_END (bb);
2898
2899       /* Back up past insns that must be kept in the same block as a call.  */
2900       while (insn != BB_HEAD (bb)
2901              && keep_with_call_p (insn))
2902         insn = PREV_INSN (insn);
2903
2904       if (need_fake_edge_p (insn))
2905         {
2906           edge e;
2907
2908           for (e = bb->succ; e; e = e->succ_next)
2909             if (e->dest == EXIT_BLOCK_PTR)
2910               {
2911                 insert_insn_on_edge (gen_rtx_USE (VOIDmode, const0_rtx), e);
2912                 commit_edge_insertions ();
2913                 break;
2914               }
2915         }
2916     }
2917
2918   /* Now add fake edges to the function exit for any non constant
2919      calls since there is no way that we can determine if they will
2920      return or not...  */
2921
2922   for (i = 0; i < last_bb; i++)
2923     {
2924       basic_block bb = BASIC_BLOCK (i);
2925       rtx insn;
2926       rtx prev_insn;
2927
2928       if (!bb)
2929         continue;
2930
2931       if (blocks && !TEST_BIT (blocks, i))
2932         continue;
2933
2934       for (insn = BB_END (bb); ; insn = prev_insn)
2935         {
2936           prev_insn = PREV_INSN (insn);
2937           if (need_fake_edge_p (insn))
2938             {
2939               edge e;
2940               rtx split_at_insn = insn;
2941
2942               /* Don't split the block between a call and an insn that should
2943                  remain in the same block as the call.  */
2944               if (CALL_P (insn))
2945                 while (split_at_insn != BB_END (bb)
2946                        && keep_with_call_p (NEXT_INSN (split_at_insn)))
2947                   split_at_insn = NEXT_INSN (split_at_insn);
2948
2949               /* The handling above of the final block before the epilogue
2950                  should be enough to verify that there is no edge to the exit
2951                  block in CFG already.  Calling make_edge in such case would
2952                  cause us to mark that edge as fake and remove it later.  */
2953
2954 #ifdef ENABLE_CHECKING
2955               if (split_at_insn == BB_END (bb))
2956                 for (e = bb->succ; e; e = e->succ_next)
2957                   gcc_assert (e->dest != EXIT_BLOCK_PTR);
2958 #endif
2959
2960               /* Note that the following may create a new basic block
2961                  and renumber the existing basic blocks.  */
2962               if (split_at_insn != BB_END (bb))
2963                 {
2964                   e = split_block (bb, split_at_insn);
2965                   if (e)
2966                     blocks_split++;
2967                 }
2968
2969               make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
2970             }
2971
2972           if (insn == BB_HEAD (bb))
2973             break;
2974         }
2975     }
2976
2977   if (blocks_split)
2978     verify_flow_info ();
2979
2980   return blocks_split;
2981 }
2982
2983 /* Implementation of CFG manipulation for linearized RTL.  */
2984 struct cfg_hooks rtl_cfg_hooks = {
2985   "rtl",
2986   rtl_verify_flow_info,
2987   rtl_dump_bb,
2988   rtl_create_basic_block,
2989   rtl_redirect_edge_and_branch,
2990   rtl_redirect_edge_and_branch_force,
2991   rtl_delete_block,
2992   rtl_split_block,
2993   rtl_move_block_after,
2994   rtl_can_merge_blocks,  /* can_merge_blocks_p */
2995   rtl_merge_blocks,
2996   rtl_predict_edge,
2997   rtl_predicted_by_p,
2998   NULL, /* can_duplicate_block_p */
2999   NULL, /* duplicate_block */
3000   rtl_split_edge,
3001   rtl_make_forwarder_block,
3002   rtl_tidy_fallthru_edge,
3003   rtl_block_ends_with_call_p,
3004   rtl_block_ends_with_condjump_p,
3005   rtl_flow_call_edges_add
3006 };
3007
3008 /* Implementation of CFG manipulation for cfg layout RTL, where
3009    basic block connected via fallthru edges does not have to be adjacent.
3010    This representation will hopefully become the default one in future
3011    version of the compiler.  */
3012
3013 /* We do not want to declare these functions in a header file, since they
3014    should only be used through the cfghooks interface, and we do not want to
3015    move them here since it would require also moving quite a lot of related
3016    code.  */
3017 extern bool cfg_layout_can_duplicate_bb_p (basic_block);
3018 extern basic_block cfg_layout_duplicate_bb (basic_block);
3019
3020 struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
3021   "cfglayout mode",
3022   rtl_verify_flow_info_1,
3023   rtl_dump_bb,
3024   cfg_layout_create_basic_block,
3025   cfg_layout_redirect_edge_and_branch,
3026   cfg_layout_redirect_edge_and_branch_force,
3027   cfg_layout_delete_block,
3028   cfg_layout_split_block,
3029   rtl_move_block_after,
3030   cfg_layout_can_merge_blocks_p,
3031   cfg_layout_merge_blocks,
3032   rtl_predict_edge,
3033   rtl_predicted_by_p,
3034   cfg_layout_can_duplicate_bb_p,
3035   cfg_layout_duplicate_bb,
3036   cfg_layout_split_edge,
3037   rtl_make_forwarder_block,
3038   NULL,
3039   rtl_block_ends_with_call_p,
3040   rtl_block_ends_with_condjump_p,
3041   rtl_flow_call_edges_add
3042 };
3043