OSDN Git Service

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