OSDN Git Service

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