OSDN Git Service

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