OSDN Git Service

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