OSDN Git Service

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