OSDN Git Service

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