OSDN Git Service

* gfortran.dg/underflow.f90: Use tiny(x)/huge(x).
[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, 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    Abort if conversion is impossible.  */
1169
1170 static basic_block
1171 rtl_redirect_edge_and_branch_force (edge e, basic_block target)
1172 {
1173   if (redirect_edge_and_branch (e, target)
1174       || e->dest == target)
1175     return NULL;
1176
1177   /* In case the edge redirection failed, try to force it to be non-fallthru
1178      and redirect newly created simplejump.  */
1179   return force_nonfallthru_and_redirect (e, target);
1180 }
1181
1182 /* The given edge should potentially be a fallthru edge.  If that is in
1183    fact true, delete the jump and barriers that are in the way.  */
1184
1185 static void
1186 rtl_tidy_fallthru_edge (edge e)
1187 {
1188   rtx q;
1189   basic_block b = e->src, c = b->next_bb;
1190
1191   /* ??? In a late-running flow pass, other folks may have deleted basic
1192      blocks by nopping out blocks, leaving multiple BARRIERs between here
1193      and the target label. They ought to be chastized and fixed.
1194
1195      We can also wind up with a sequence of undeletable labels between
1196      one block and the next.
1197
1198      So search through a sequence of barriers, labels, and notes for
1199      the head of block C and assert that we really do fall through.  */
1200
1201   for (q = NEXT_INSN (BB_END (b)); q != BB_HEAD (c); q = NEXT_INSN (q))
1202     if (INSN_P (q))
1203       return;
1204
1205   /* Remove what will soon cease being the jump insn from the source block.
1206      If block B consisted only of this single jump, turn it into a deleted
1207      note.  */
1208   q = BB_END (b);
1209   if (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    Abort on abnormal edges.
1281
1282    ??? The code generally expects to be called on critical edges.
1283    The case of a block ending in an unconditional jump to a
1284    block with multiple predecessors is not handled optimally.  */
1285
1286 static basic_block
1287 rtl_split_edge (edge edge_in)
1288 {
1289   basic_block bb;
1290   rtx before;
1291
1292   /* Abnormal edges cannot be split.  */
1293   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 (int update_life_p)
2459 {
2460   int purged = false;
2461   sbitmap blocks = 0;
2462   basic_block bb;
2463
2464   if (update_life_p)
2465     {
2466       blocks = sbitmap_alloc (last_basic_block);
2467       sbitmap_zero (blocks);
2468     }
2469
2470   FOR_EACH_BB (bb)
2471     {
2472       bool purged_here = purge_dead_edges (bb);
2473
2474       purged |= purged_here;
2475       if (purged_here && update_life_p)
2476         SET_BIT (blocks, bb->index);
2477     }
2478
2479   if (update_life_p && purged)
2480     update_life_info (blocks, UPDATE_LIFE_GLOBAL,
2481                       PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
2482                       | PROP_KILL_DEAD_CODE);
2483
2484   if (update_life_p)
2485     sbitmap_free (blocks);
2486   return purged;
2487 }
2488
2489 /* Same as split_block but update cfg_layout structures.  */
2490
2491 static basic_block
2492 cfg_layout_split_block (basic_block bb, void *insnp)
2493 {
2494   rtx insn = insnp;
2495   basic_block new_bb = rtl_split_block (bb, insn);
2496
2497   new_bb->rbi->footer = bb->rbi->footer;
2498   bb->rbi->footer = NULL;
2499
2500   return new_bb;
2501 }
2502
2503
2504 /* Redirect Edge to DEST.  */
2505 static edge
2506 cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
2507 {
2508   basic_block src = e->src;
2509   edge ret;
2510
2511   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
2512     return NULL;
2513
2514   if (e->dest == dest)
2515     return e;
2516
2517   if (e->src != ENTRY_BLOCK_PTR
2518       && (ret = try_redirect_by_replacing_jump (e, dest, true)))
2519     {
2520       src->flags |= BB_DIRTY;
2521       return ret;
2522     }
2523
2524   if (e->src == ENTRY_BLOCK_PTR
2525       && (e->flags & EDGE_FALLTHRU) && !(e->flags & EDGE_COMPLEX))
2526     {
2527       if (dump_file)
2528         fprintf (dump_file, "Redirecting entry edge from bb %i to %i\n",
2529                  e->src->index, dest->index);
2530
2531       e->src->flags |= BB_DIRTY;
2532       redirect_edge_succ (e, dest);
2533       return e;
2534     }
2535
2536   /* Redirect_edge_and_branch may decide to turn branch into fallthru edge
2537      in the case the basic block appears to be in sequence.  Avoid this
2538      transformation.  */
2539
2540   if (e->flags & EDGE_FALLTHRU)
2541     {
2542       /* Redirect any branch edges unified with the fallthru one.  */
2543       if (JUMP_P (BB_END (src))
2544           && label_is_jump_target_p (BB_HEAD (e->dest),
2545                                      BB_END (src)))
2546         {
2547           edge redirected;
2548           
2549           if (dump_file)
2550             fprintf (dump_file, "Fallthru edge unified with branch "
2551                      "%i->%i redirected to %i\n",
2552                      e->src->index, e->dest->index, dest->index);
2553           e->flags &= ~EDGE_FALLTHRU;
2554           redirected = redirect_branch_edge (e, dest);
2555           gcc_assert (redirected);
2556           e->flags |= EDGE_FALLTHRU;
2557           e->src->flags |= BB_DIRTY;
2558           return e;
2559         }
2560       /* In case we are redirecting fallthru edge to the branch edge
2561          of conditional jump, remove it.  */
2562       if (EDGE_COUNT (src->succs) == 2)
2563         {
2564           /* Find the edge that is different from E.  */
2565           edge s = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e);
2566
2567           if (s->dest == dest
2568               && any_condjump_p (BB_END (src))
2569               && onlyjump_p (BB_END (src)))
2570             delete_insn (BB_END (src));
2571         }
2572       ret = redirect_edge_succ_nodup (e, dest);
2573       if (dump_file)
2574         fprintf (dump_file, "Fallthru edge %i->%i redirected to %i\n",
2575                  e->src->index, e->dest->index, dest->index);
2576     }
2577   else
2578     ret = redirect_branch_edge (e, dest);
2579
2580   /* We don't want simplejumps in the insn stream during cfglayout.  */
2581   gcc_assert (!simplejump_p (BB_END (src)));
2582
2583   src->flags |= BB_DIRTY;
2584   return ret;
2585 }
2586
2587 /* Simple wrapper as we always can redirect fallthru edges.  */
2588 static basic_block
2589 cfg_layout_redirect_edge_and_branch_force (edge e, basic_block dest)
2590 {
2591   edge redirected = cfg_layout_redirect_edge_and_branch (e, dest);
2592
2593   gcc_assert (redirected);
2594   return NULL;
2595 }
2596
2597 /* Same as delete_basic_block but update cfg_layout structures.  */
2598
2599 static void
2600 cfg_layout_delete_block (basic_block bb)
2601 {
2602   rtx insn, next, prev = PREV_INSN (BB_HEAD (bb)), *to, remaints;
2603
2604   if (bb->rbi->header)
2605     {
2606       next = BB_HEAD (bb);
2607       if (prev)
2608         NEXT_INSN (prev) = bb->rbi->header;
2609       else
2610         set_first_insn (bb->rbi->header);
2611       PREV_INSN (bb->rbi->header) = prev;
2612       insn = bb->rbi->header;
2613       while (NEXT_INSN (insn))
2614         insn = NEXT_INSN (insn);
2615       NEXT_INSN (insn) = next;
2616       PREV_INSN (next) = insn;
2617     }
2618   next = NEXT_INSN (BB_END (bb));
2619   if (bb->rbi->footer)
2620     {
2621       insn = bb->rbi->footer;
2622       while (insn)
2623         {
2624           if (BARRIER_P (insn))
2625             {
2626               if (PREV_INSN (insn))
2627                 NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
2628               else
2629                 bb->rbi->footer = NEXT_INSN (insn);
2630               if (NEXT_INSN (insn))
2631                 PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
2632             }
2633           if (LABEL_P (insn))
2634             break;
2635           insn = NEXT_INSN (insn);
2636         }
2637       if (bb->rbi->footer)
2638         {
2639           insn = BB_END (bb);
2640           NEXT_INSN (insn) = bb->rbi->footer;
2641           PREV_INSN (bb->rbi->footer) = insn;
2642           while (NEXT_INSN (insn))
2643             insn = NEXT_INSN (insn);
2644           NEXT_INSN (insn) = next;
2645           if (next)
2646             PREV_INSN (next) = insn;
2647           else
2648             set_last_insn (insn);
2649         }
2650     }
2651   if (bb->next_bb != EXIT_BLOCK_PTR)
2652     to = &bb->next_bb->rbi->header;
2653   else
2654     to = &cfg_layout_function_footer;
2655
2656   bb->rbi = NULL;
2657
2658   rtl_delete_block (bb);
2659
2660   if (prev)
2661     prev = NEXT_INSN (prev);
2662   else
2663     prev = get_insns ();
2664   if (next)
2665     next = PREV_INSN (next);
2666   else
2667     next = get_last_insn ();
2668
2669   if (next && NEXT_INSN (next) != prev)
2670     {
2671       remaints = unlink_insn_chain (prev, next);
2672       insn = remaints;
2673       while (NEXT_INSN (insn))
2674         insn = NEXT_INSN (insn);
2675       NEXT_INSN (insn) = *to;
2676       if (*to)
2677         PREV_INSN (*to) = insn;
2678       *to = remaints;
2679     }
2680 }
2681
2682 /* Return true when blocks A and B can be safely merged.  */
2683 static bool
2684 cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
2685 {
2686   /* If we are partitioning hot/cold basic blocks, we don't want to
2687      mess up unconditional or indirect jumps that cross between hot
2688      and cold sections.
2689
2690      Basic block partitioning may result in some jumps that appear to
2691      be optimizable (or blocks that appear to be mergeable), but which really 
2692      must be left untouched (they are required to make it safely across 
2693      partition boundaries).  See  the comments at the top of 
2694      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
2695
2696   if (BB_PARTITION (a) != BB_PARTITION (b))
2697     return false;
2698
2699   /* There must be exactly one edge in between the blocks.  */
2700   return (single_succ_p (a)
2701           && single_succ (a) == b
2702           && single_pred_p (b) == 1
2703           && a != b
2704           /* Must be simple edge.  */
2705           && !(single_succ_edge (a)->flags & EDGE_COMPLEX)
2706           && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
2707           /* If the jump insn has side effects,
2708              we can't kill the edge.  */
2709           && (!JUMP_P (BB_END (a))
2710               || (reload_completed
2711                   ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
2712 }
2713
2714 /* Merge block A and B, abort when it is not possible.  */
2715 static void
2716 cfg_layout_merge_blocks (basic_block a, basic_block b)
2717 {
2718 #ifdef ENABLE_CHECKING
2719   gcc_assert (cfg_layout_can_merge_blocks_p (a, b));
2720 #endif
2721
2722   /* If there was a CODE_LABEL beginning B, delete it.  */
2723   if (LABEL_P (BB_HEAD (b)))
2724     delete_insn (BB_HEAD (b));
2725
2726   /* We should have fallthru edge in a, or we can do dummy redirection to get
2727      it cleaned up.  */
2728   if (JUMP_P (BB_END (a)))
2729     try_redirect_by_replacing_jump (EDGE_SUCC (a, 0), b, true);
2730   gcc_assert (!JUMP_P (BB_END (a)));
2731
2732   /* Possible line number notes should appear in between.  */
2733   if (b->rbi->header)
2734     {
2735       rtx first = BB_END (a), last;
2736
2737       last = emit_insn_after_noloc (b->rbi->header, BB_END (a));
2738       delete_insn_chain (NEXT_INSN (first), last);
2739       b->rbi->header = NULL;
2740     }
2741
2742   /* In the case basic blocks are not adjacent, move them around.  */
2743   if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
2744     {
2745       rtx first = unlink_insn_chain (BB_HEAD (b), BB_END (b));
2746
2747       emit_insn_after_noloc (first, BB_END (a));
2748       /* Skip possible DELETED_LABEL insn.  */
2749       if (!NOTE_INSN_BASIC_BLOCK_P (first))
2750         first = NEXT_INSN (first);
2751       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (first));
2752       BB_HEAD (b) = NULL;
2753       delete_insn (first);
2754     }
2755   /* Otherwise just re-associate the instructions.  */
2756   else
2757     {
2758       rtx insn;
2759
2760       for (insn = BB_HEAD (b);
2761            insn != NEXT_INSN (BB_END (b));
2762            insn = NEXT_INSN (insn))
2763         set_block_for_insn (insn, a);
2764       insn = BB_HEAD (b);
2765       /* Skip possible DELETED_LABEL insn.  */
2766       if (!NOTE_INSN_BASIC_BLOCK_P (insn))
2767         insn = NEXT_INSN (insn);
2768       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
2769       BB_HEAD (b) = NULL;
2770       BB_END (a) = BB_END (b);
2771       delete_insn (insn);
2772     }
2773
2774   /* Possible tablejumps and barriers should appear after the block.  */
2775   if (b->rbi->footer)
2776     {
2777       if (!a->rbi->footer)
2778         a->rbi->footer = b->rbi->footer;
2779       else
2780         {
2781           rtx last = a->rbi->footer;
2782
2783           while (NEXT_INSN (last))
2784             last = NEXT_INSN (last);
2785           NEXT_INSN (last) = b->rbi->footer;
2786           PREV_INSN (b->rbi->footer) = last;
2787         }
2788       b->rbi->footer = NULL;
2789     }
2790
2791   if (dump_file)
2792     fprintf (dump_file, "Merged blocks %d and %d.\n",
2793              a->index, b->index);
2794 }
2795
2796 /* Split edge E.  */
2797
2798 static basic_block
2799 cfg_layout_split_edge (edge e)
2800 {
2801   basic_block new_bb =
2802     create_basic_block (e->src != ENTRY_BLOCK_PTR
2803                         ? NEXT_INSN (BB_END (e->src)) : get_insns (),
2804                         NULL_RTX, e->src);
2805
2806   /* ??? This info is likely going to be out of date very soon, but we must
2807      create it to avoid getting an ICE later.  */
2808   if (e->dest->global_live_at_start)
2809     {
2810       new_bb->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
2811       new_bb->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
2812       COPY_REG_SET (new_bb->global_live_at_start,
2813                     e->dest->global_live_at_start);
2814       COPY_REG_SET (new_bb->global_live_at_end,
2815                     e->dest->global_live_at_start);
2816     }
2817
2818   make_edge (new_bb, e->dest, EDGE_FALLTHRU);
2819   redirect_edge_and_branch_force (e, new_bb);
2820
2821   return new_bb;
2822 }
2823
2824 /* Do postprocessing after making a forwarder block joined by edge FALLTHRU.  */
2825
2826 static void
2827 rtl_make_forwarder_block (edge fallthru ATTRIBUTE_UNUSED)
2828 {
2829 }
2830
2831 /* Return 1 if BB ends with a call, possibly followed by some
2832    instructions that must stay with the call, 0 otherwise.  */
2833
2834 static bool
2835 rtl_block_ends_with_call_p (basic_block bb)
2836 {
2837   rtx insn = BB_END (bb);
2838
2839   while (!CALL_P (insn)
2840          && insn != BB_HEAD (bb)
2841          && keep_with_call_p (insn))
2842     insn = PREV_INSN (insn);
2843   return (CALL_P (insn));
2844 }
2845
2846 /* Return 1 if BB ends with a conditional branch, 0 otherwise.  */
2847
2848 static bool
2849 rtl_block_ends_with_condjump_p (basic_block bb)
2850 {
2851   return any_condjump_p (BB_END (bb));
2852 }
2853
2854 /* Return true if we need to add fake edge to exit.
2855    Helper function for rtl_flow_call_edges_add.  */
2856
2857 static bool
2858 need_fake_edge_p (rtx insn)
2859 {
2860   if (!INSN_P (insn))
2861     return false;
2862
2863   if ((CALL_P (insn)
2864        && !SIBLING_CALL_P (insn)
2865        && !find_reg_note (insn, REG_NORETURN, NULL)
2866        && !CONST_OR_PURE_CALL_P (insn)))
2867     return true;
2868
2869   return ((GET_CODE (PATTERN (insn)) == ASM_OPERANDS
2870            && MEM_VOLATILE_P (PATTERN (insn)))
2871           || (GET_CODE (PATTERN (insn)) == PARALLEL
2872               && asm_noperands (insn) != -1
2873               && MEM_VOLATILE_P (XVECEXP (PATTERN (insn), 0, 0)))
2874           || GET_CODE (PATTERN (insn)) == ASM_INPUT);
2875 }
2876
2877 /* Add fake edges to the function exit for any non constant and non noreturn
2878    calls, volatile inline assembly in the bitmap of blocks specified by
2879    BLOCKS or to the whole CFG if BLOCKS is zero.  Return the number of blocks
2880    that were split.
2881
2882    The goal is to expose cases in which entering a basic block does not imply
2883    that all subsequent instructions must be executed.  */
2884
2885 static int
2886 rtl_flow_call_edges_add (sbitmap blocks)
2887 {
2888   int i;
2889   int blocks_split = 0;
2890   int last_bb = last_basic_block;
2891   bool check_last_block = false;
2892
2893   if (n_basic_blocks == 0)
2894     return 0;
2895
2896   if (! blocks)
2897     check_last_block = true;
2898   else
2899     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
2900
2901   /* In the last basic block, before epilogue generation, there will be
2902      a fallthru edge to EXIT.  Special care is required if the last insn
2903      of the last basic block is a call because make_edge folds duplicate
2904      edges, which would result in the fallthru edge also being marked
2905      fake, which would result in the fallthru edge being removed by
2906      remove_fake_edges, which would result in an invalid CFG.
2907
2908      Moreover, we can't elide the outgoing fake edge, since the block
2909      profiler needs to take this into account in order to solve the minimal
2910      spanning tree in the case that the call doesn't return.
2911
2912      Handle this by adding a dummy instruction in a new last basic block.  */
2913   if (check_last_block)
2914     {
2915       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
2916       rtx insn = BB_END (bb);
2917
2918       /* Back up past insns that must be kept in the same block as a call.  */
2919       while (insn != BB_HEAD (bb)
2920              && keep_with_call_p (insn))
2921         insn = PREV_INSN (insn);
2922
2923       if (need_fake_edge_p (insn))
2924         {
2925           edge e;
2926
2927           e = find_edge (bb, EXIT_BLOCK_PTR);
2928           if (e)
2929             {
2930               insert_insn_on_edge (gen_rtx_USE (VOIDmode, const0_rtx), e);
2931               commit_edge_insertions ();
2932             }
2933         }
2934     }
2935
2936   /* Now add fake edges to the function exit for any non constant
2937      calls since there is no way that we can determine if they will
2938      return or not...  */
2939
2940   for (i = 0; i < last_bb; i++)
2941     {
2942       basic_block bb = BASIC_BLOCK (i);
2943       rtx insn;
2944       rtx prev_insn;
2945
2946       if (!bb)
2947         continue;
2948
2949       if (blocks && !TEST_BIT (blocks, i))
2950         continue;
2951
2952       for (insn = BB_END (bb); ; insn = prev_insn)
2953         {
2954           prev_insn = PREV_INSN (insn);
2955           if (need_fake_edge_p (insn))
2956             {
2957               edge e;
2958               rtx split_at_insn = insn;
2959
2960               /* Don't split the block between a call and an insn that should
2961                  remain in the same block as the call.  */
2962               if (CALL_P (insn))
2963                 while (split_at_insn != BB_END (bb)
2964                        && keep_with_call_p (NEXT_INSN (split_at_insn)))
2965                   split_at_insn = NEXT_INSN (split_at_insn);
2966
2967               /* The handling above of the final block before the epilogue
2968                  should be enough to verify that there is no edge to the exit
2969                  block in CFG already.  Calling make_edge in such case would
2970                  cause us to mark that edge as fake and remove it later.  */
2971
2972 #ifdef ENABLE_CHECKING
2973               if (split_at_insn == BB_END (bb))
2974                 {
2975                   e = find_edge (bb, EXIT_BLOCK_PTR);
2976                   gcc_assert (e == NULL);
2977                 }
2978 #endif
2979
2980               /* Note that the following may create a new basic block
2981                  and renumber the existing basic blocks.  */
2982               if (split_at_insn != BB_END (bb))
2983                 {
2984                   e = split_block (bb, split_at_insn);
2985                   if (e)
2986                     blocks_split++;
2987                 }
2988
2989               make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
2990             }
2991
2992           if (insn == BB_HEAD (bb))
2993             break;
2994         }
2995     }
2996
2997   if (blocks_split)
2998     verify_flow_info ();
2999
3000   return blocks_split;
3001 }
3002
3003 /* Add COMP_RTX as a condition at end of COND_BB.  FIRST_HEAD is
3004    the conditional branch target, SECOND_HEAD should be the fall-thru
3005    there is no need to handle this here the loop versioning code handles
3006    this.  the reason for SECON_HEAD is that it is needed for condition
3007    in trees, and this should be of the same type since it is a hook.  */
3008 static void
3009 rtl_lv_add_condition_to_bb (basic_block first_head ,
3010                             basic_block second_head ATTRIBUTE_UNUSED, 
3011                             basic_block cond_bb, void *comp_rtx)  
3012 {
3013   rtx label, seq, jump;
3014   rtx op0 = XEXP ((rtx)comp_rtx, 0);
3015   rtx op1 = XEXP ((rtx)comp_rtx, 1);
3016   enum rtx_code comp = GET_CODE ((rtx)comp_rtx);
3017   enum machine_mode mode;
3018
3019
3020   label = block_label (first_head);
3021   mode = GET_MODE (op0);
3022   if (mode == VOIDmode)
3023     mode = GET_MODE (op1);
3024
3025   start_sequence ();
3026   op0 = force_operand (op0, NULL_RTX);
3027   op1 = force_operand (op1, NULL_RTX);
3028   do_compare_rtx_and_jump (op0, op1, comp, 0,
3029                            mode, NULL_RTX, NULL_RTX, label);
3030   jump = get_last_insn ();
3031   JUMP_LABEL (jump) = label;
3032   LABEL_NUSES (label)++;
3033   seq = get_insns ();
3034   end_sequence ();
3035
3036   /* Add the new cond , in the new head.  */
3037   emit_insn_after(seq, BB_END(cond_bb));
3038 }
3039
3040
3041 /* Given a block B with unconditional branch at its end, get the
3042    store the return the branch edge and the fall-thru edge in
3043    BRANCH_EDGE and FALLTHRU_EDGE respectively.  */
3044 static void
3045 rtl_extract_cond_bb_edges (basic_block b, edge *branch_edge,
3046                            edge *fallthru_edge)
3047 {
3048   edge e = EDGE_SUCC (b, 0);
3049
3050   if (e->flags & EDGE_FALLTHRU)
3051     {
3052       *fallthru_edge = e;
3053       *branch_edge = EDGE_SUCC (b, 1);
3054     }
3055   else
3056     {
3057       *branch_edge = e;
3058       *fallthru_edge = EDGE_SUCC (b, 1);
3059     }
3060 }
3061
3062
3063 /* Implementation of CFG manipulation for linearized RTL.  */
3064 struct cfg_hooks rtl_cfg_hooks = {
3065   "rtl",
3066   rtl_verify_flow_info,
3067   rtl_dump_bb,
3068   rtl_create_basic_block,
3069   rtl_redirect_edge_and_branch,
3070   rtl_redirect_edge_and_branch_force,
3071   rtl_delete_block,
3072   rtl_split_block,
3073   rtl_move_block_after,
3074   rtl_can_merge_blocks,  /* can_merge_blocks_p */
3075   rtl_merge_blocks,
3076   rtl_predict_edge,
3077   rtl_predicted_by_p,
3078   NULL, /* can_duplicate_block_p */
3079   NULL, /* duplicate_block */
3080   rtl_split_edge,
3081   rtl_make_forwarder_block,
3082   rtl_tidy_fallthru_edge,
3083   rtl_block_ends_with_call_p,
3084   rtl_block_ends_with_condjump_p,
3085   rtl_flow_call_edges_add,
3086   NULL, /* execute_on_growing_pred */
3087   NULL, /* execute_on_shrinking_pred */
3088   NULL, /* duplicate loop for trees */
3089   NULL, /* lv_add_condition_to_bb */
3090   NULL, /* lv_adjust_loop_header_phi*/
3091   NULL, /* extract_cond_bb_edges */
3092   NULL          /* flush_pending_stmts */
3093 };
3094
3095 /* Implementation of CFG manipulation for cfg layout RTL, where
3096    basic block connected via fallthru edges does not have to be adjacent.
3097    This representation will hopefully become the default one in future
3098    version of the compiler.  */
3099
3100 /* We do not want to declare these functions in a header file, since they
3101    should only be used through the cfghooks interface, and we do not want to
3102    move them here since it would require also moving quite a lot of related
3103    code.  */
3104 extern bool cfg_layout_can_duplicate_bb_p (basic_block);
3105 extern basic_block cfg_layout_duplicate_bb (basic_block);
3106
3107 struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
3108   "cfglayout mode",
3109   rtl_verify_flow_info_1,
3110   rtl_dump_bb,
3111   cfg_layout_create_basic_block,
3112   cfg_layout_redirect_edge_and_branch,
3113   cfg_layout_redirect_edge_and_branch_force,
3114   cfg_layout_delete_block,
3115   cfg_layout_split_block,
3116   rtl_move_block_after,
3117   cfg_layout_can_merge_blocks_p,
3118   cfg_layout_merge_blocks,
3119   rtl_predict_edge,
3120   rtl_predicted_by_p,
3121   cfg_layout_can_duplicate_bb_p,
3122   cfg_layout_duplicate_bb,
3123   cfg_layout_split_edge,
3124   rtl_make_forwarder_block,
3125   NULL,
3126   rtl_block_ends_with_call_p,
3127   rtl_block_ends_with_condjump_p,
3128   rtl_flow_call_edges_add,
3129   NULL, /* execute_on_growing_pred */
3130   NULL, /* execute_on_shrinking_pred */
3131   duplicate_loop_to_header_edge, /* duplicate loop for trees */
3132   rtl_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
3133   NULL, /* lv_adjust_loop_header_phi*/
3134   rtl_extract_cond_bb_edges, /* extract_cond_bb_edges */
3135   NULL          /* flush_pending_stmts */  
3136 };
3137