OSDN Git Service

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