OSDN Git Service

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