OSDN Git Service

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