OSDN Git Service

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