OSDN Git Service

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