OSDN Git Service

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