OSDN Git Service

PR target/31733
[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_KIND (note) == NOTE_INSN_DELETED
89           || NOTE_KIND (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_KIND (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_INSN_BASIC_BLOCK_P (prev)
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_INSN_BASIC_BLOCK_P (cur_insn))
1412                   {
1413                     bb_note = cur_insn;
1414                     break;
1415                   }
1416
1417               if (JUMP_P (BB_END (bb))
1418                   && !any_condjump_p (BB_END (bb))
1419                   && (single_succ_edge (bb)->flags & EDGE_CROSSING))
1420                 REG_NOTES (BB_END (bb)) = gen_rtx_EXPR_LIST
1421                   (REG_CROSSING_JUMP, NULL_RTX, REG_NOTES (BB_END (bb)));
1422             }
1423         }
1424     }
1425
1426   /* Now that we've found the spot, do the insertion.  */
1427
1428   if (before)
1429     {
1430       emit_insn_before_noloc (insns, before);
1431       last = prev_nonnote_insn (before);
1432     }
1433   else
1434     last = emit_insn_after_noloc (insns, after);
1435
1436   if (returnjump_p (last))
1437     {
1438       /* ??? Remove all outgoing edges from BB and add one for EXIT.
1439          This is not currently a problem because this only happens
1440          for the (single) epilogue, which already has a fallthru edge
1441          to EXIT.  */
1442
1443       e = single_succ_edge (bb);
1444       gcc_assert (e->dest == EXIT_BLOCK_PTR
1445                   && single_succ_p (bb) && (e->flags & EDGE_FALLTHRU));
1446
1447       e->flags &= ~EDGE_FALLTHRU;
1448       emit_barrier_after (last);
1449
1450       if (before)
1451         delete_insn (before);
1452     }
1453   else
1454     gcc_assert (!JUMP_P (last));
1455
1456   /* Mark the basic block for find_many_sub_basic_blocks.  */
1457   if (current_ir_type () != IR_RTL_CFGLAYOUT)
1458     bb->aux = &bb->aux;
1459 }
1460
1461 /* Update the CFG for all queued instructions.  */
1462
1463 void
1464 commit_edge_insertions (void)
1465 {
1466   basic_block bb;
1467   sbitmap blocks;
1468   bool changed = false;
1469
1470 #ifdef ENABLE_CHECKING
1471   verify_flow_info ();
1472 #endif
1473
1474   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
1475     {
1476       edge e;
1477       edge_iterator ei;
1478
1479       FOR_EACH_EDGE (e, ei, bb->succs)
1480         if (e->insns.r)
1481           {
1482             changed = true;
1483             commit_one_edge_insertion (e);
1484           }
1485     }
1486
1487   if (!changed)
1488     return;
1489
1490   /* In the old rtl CFG API, it was OK to insert control flow on an
1491      edge, apparently?  In cfglayout mode, this will *not* work, and
1492      the caller is responsible for making sure that control flow is
1493      valid at all times.  */
1494   if (current_ir_type () == IR_RTL_CFGLAYOUT)
1495     return;
1496
1497   blocks = sbitmap_alloc (last_basic_block);
1498   sbitmap_zero (blocks);
1499   FOR_EACH_BB (bb)
1500     if (bb->aux)
1501       {
1502         SET_BIT (blocks, bb->index);
1503         /* Check for forgotten bb->aux values before commit_edge_insertions
1504            call.  */
1505         gcc_assert (bb->aux == &bb->aux);
1506         bb->aux = NULL;
1507       }
1508   find_many_sub_basic_blocks (blocks);
1509   sbitmap_free (blocks);
1510 }
1511 \f
1512 /* Print out RTL-specific basic block information (live information
1513    at start and end).  */
1514
1515 static void
1516 rtl_dump_bb (basic_block bb, FILE *outf, int indent)
1517 {
1518   rtx insn;
1519   rtx last;
1520   char *s_indent;
1521
1522   s_indent = alloca ((size_t) indent + 1);
1523   memset (s_indent, ' ', (size_t) indent);
1524   s_indent[indent] = '\0';
1525
1526   fprintf (outf, ";;%s Registers live at start: ", s_indent);
1527   dump_regset (bb->il.rtl->global_live_at_start, outf);
1528   putc ('\n', outf);
1529
1530   for (insn = BB_HEAD (bb), last = NEXT_INSN (BB_END (bb)); insn != last;
1531        insn = NEXT_INSN (insn))
1532     print_rtl_single (outf, insn);
1533
1534   fprintf (outf, ";;%s Registers live at end: ", s_indent);
1535   dump_regset (bb->il.rtl->global_live_at_end, outf);
1536   putc ('\n', outf);
1537 }
1538 \f
1539 /* Like print_rtl, but also print out live information for the start of each
1540    basic block.  */
1541
1542 void
1543 print_rtl_with_bb (FILE *outf, rtx rtx_first)
1544 {
1545   rtx tmp_rtx;
1546
1547   if (rtx_first == 0)
1548     fprintf (outf, "(nil)\n");
1549   else
1550     {
1551       enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
1552       int max_uid = get_max_uid ();
1553       basic_block *start = XCNEWVEC (basic_block, max_uid);
1554       basic_block *end = XCNEWVEC (basic_block, max_uid);
1555       enum bb_state *in_bb_p = XCNEWVEC (enum bb_state, max_uid);
1556
1557       basic_block bb;
1558
1559       FOR_EACH_BB_REVERSE (bb)
1560         {
1561           rtx x;
1562
1563           start[INSN_UID (BB_HEAD (bb))] = bb;
1564           end[INSN_UID (BB_END (bb))] = bb;
1565           for (x = BB_HEAD (bb); x != NULL_RTX; x = NEXT_INSN (x))
1566             {
1567               enum bb_state state = IN_MULTIPLE_BB;
1568
1569               if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1570                 state = IN_ONE_BB;
1571               in_bb_p[INSN_UID (x)] = state;
1572
1573               if (x == BB_END (bb))
1574                 break;
1575             }
1576         }
1577
1578       for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1579         {
1580           int did_output;
1581           edge_iterator ei;
1582           edge e;
1583
1584           if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
1585             {
1586               fprintf (outf, ";; Start of basic block %d, registers live:",
1587                        bb->index);
1588               dump_regset (bb->il.rtl->global_live_at_start, outf);
1589               putc ('\n', outf);
1590               FOR_EACH_EDGE (e, ei, bb->preds)
1591                 {
1592                   fputs (";; Pred edge ", outf);
1593                   dump_edge_info (outf, e, 0);
1594                   fputc ('\n', outf);
1595                 }
1596             }
1597
1598           if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1599               && !NOTE_P (tmp_rtx)
1600               && !BARRIER_P (tmp_rtx))
1601             fprintf (outf, ";; Insn is not within a basic block\n");
1602           else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1603             fprintf (outf, ";; Insn is in multiple basic blocks\n");
1604
1605           did_output = print_rtl_single (outf, tmp_rtx);
1606
1607           if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
1608             {
1609               fprintf (outf, ";; End of basic block %d, registers live:",
1610                        bb->index);
1611               dump_regset (bb->il.rtl->global_live_at_end, outf);
1612               putc ('\n', outf);
1613               FOR_EACH_EDGE (e, ei, bb->succs)
1614                 {
1615                   fputs (";; Succ edge ", outf);
1616                   dump_edge_info (outf, e, 1);
1617                   fputc ('\n', outf);
1618                 }
1619             }
1620
1621           if (did_output)
1622             putc ('\n', outf);
1623         }
1624
1625       free (start);
1626       free (end);
1627       free (in_bb_p);
1628     }
1629
1630   if (current_function_epilogue_delay_list != 0)
1631     {
1632       fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1633       for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
1634            tmp_rtx = XEXP (tmp_rtx, 1))
1635         print_rtl_single (outf, XEXP (tmp_rtx, 0));
1636     }
1637 }
1638 \f
1639 void
1640 update_br_prob_note (basic_block bb)
1641 {
1642   rtx note;
1643   if (!JUMP_P (BB_END (bb)))
1644     return;
1645   note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX);
1646   if (!note || INTVAL (XEXP (note, 0)) == BRANCH_EDGE (bb)->probability)
1647     return;
1648   XEXP (note, 0) = GEN_INT (BRANCH_EDGE (bb)->probability);
1649 }
1650
1651 /* Get the last insn associated with block BB (that includes barriers and
1652    tablejumps after BB).  */
1653 rtx
1654 get_last_bb_insn (basic_block bb)
1655 {
1656   rtx tmp;
1657   rtx end = BB_END (bb);
1658
1659   /* Include any jump table following the basic block.  */
1660   if (tablejump_p (end, NULL, &tmp))
1661     end = tmp;
1662
1663   /* Include any barriers that may follow the basic block.  */
1664   tmp = next_nonnote_insn (end);
1665   while (tmp && BARRIER_P (tmp))
1666     {
1667       end = tmp;
1668       tmp = next_nonnote_insn (end);
1669     }
1670
1671   return end;
1672 }
1673 \f
1674 /* Verify the CFG and RTL consistency common for both underlying RTL and
1675    cfglayout RTL.
1676
1677    Currently it does following checks:
1678
1679    - overlapping of basic blocks
1680    - insns with wrong BLOCK_FOR_INSN pointers
1681    - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
1682    - tails of basic blocks (ensure that boundary is necessary)
1683    - scans body of the basic block for JUMP_INSN, CODE_LABEL
1684      and NOTE_INSN_BASIC_BLOCK
1685    - verify that no fall_thru edge crosses hot/cold partition boundaries
1686    - verify that there are no pending RTL branch predictions
1687
1688    In future it can be extended check a lot of other stuff as well
1689    (reachability of basic blocks, life information, etc. etc.).  */
1690
1691 static int
1692 rtl_verify_flow_info_1 (void)
1693 {
1694   rtx x;
1695   int err = 0;
1696   basic_block bb;
1697
1698   /* Check the general integrity of the basic blocks.  */
1699   FOR_EACH_BB_REVERSE (bb)
1700     {
1701       rtx insn;
1702
1703       if (!(bb->flags & BB_RTL))
1704         {
1705           error ("BB_RTL flag not set for block %d", bb->index);
1706           err = 1;
1707         }
1708
1709       FOR_BB_INSNS (bb, insn)
1710         if (BLOCK_FOR_INSN (insn) != bb)
1711           {
1712             error ("insn %d basic block pointer is %d, should be %d",
1713                    INSN_UID (insn),
1714                    BLOCK_FOR_INSN (insn) ? BLOCK_FOR_INSN (insn)->index : 0,
1715                    bb->index);
1716             err = 1;
1717           }
1718     }
1719
1720   /* Now check the basic blocks (boundaries etc.) */
1721   FOR_EACH_BB_REVERSE (bb)
1722     {
1723       int n_fallthru = 0, n_eh = 0, n_call = 0, n_abnormal = 0, n_branch = 0;
1724       edge e, fallthru = NULL;
1725       rtx note;
1726       edge_iterator ei;
1727
1728       if (JUMP_P (BB_END (bb))
1729           && (note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX))
1730           && EDGE_COUNT (bb->succs) >= 2
1731           && any_condjump_p (BB_END (bb)))
1732         {
1733           if (INTVAL (XEXP (note, 0)) != BRANCH_EDGE (bb)->probability
1734               && profile_status != PROFILE_ABSENT)
1735             {
1736               error ("verify_flow_info: REG_BR_PROB does not match cfg %wi %i",
1737                      INTVAL (XEXP (note, 0)), BRANCH_EDGE (bb)->probability);
1738               err = 1;
1739             }
1740         }
1741       FOR_EACH_EDGE (e, ei, bb->succs)
1742         {
1743           if (e->flags & EDGE_FALLTHRU)
1744             {
1745               n_fallthru++, fallthru = e;
1746               if ((e->flags & EDGE_CROSSING)
1747                   || (BB_PARTITION (e->src) != BB_PARTITION (e->dest)
1748                       && e->src != ENTRY_BLOCK_PTR
1749                       && e->dest != EXIT_BLOCK_PTR))
1750             {
1751                   error ("fallthru edge crosses section boundary (bb %i)",
1752                          e->src->index);
1753                   err = 1;
1754                 }
1755             }
1756
1757           if ((e->flags & ~(EDGE_DFS_BACK
1758                             | EDGE_CAN_FALLTHRU
1759                             | EDGE_IRREDUCIBLE_LOOP
1760                             | EDGE_LOOP_EXIT
1761                             | EDGE_CROSSING)) == 0)
1762             n_branch++;
1763
1764           if (e->flags & EDGE_ABNORMAL_CALL)
1765             n_call++;
1766
1767           if (e->flags & EDGE_EH)
1768             n_eh++;
1769           else if (e->flags & EDGE_ABNORMAL)
1770             n_abnormal++;
1771         }
1772
1773       if (n_eh && GET_CODE (PATTERN (BB_END (bb))) != RESX
1774           && !find_reg_note (BB_END (bb), REG_EH_REGION, NULL_RTX))
1775         {
1776           error ("missing REG_EH_REGION note in the end of bb %i", bb->index);
1777           err = 1;
1778         }
1779       if (n_branch
1780           && (!JUMP_P (BB_END (bb))
1781               || (n_branch > 1 && (any_uncondjump_p (BB_END (bb))
1782                                    || any_condjump_p (BB_END (bb))))))
1783         {
1784           error ("too many outgoing branch edges from bb %i", bb->index);
1785           err = 1;
1786         }
1787       if (n_fallthru && any_uncondjump_p (BB_END (bb)))
1788         {
1789           error ("fallthru edge after unconditional jump %i", bb->index);
1790           err = 1;
1791         }
1792       if (n_branch != 1 && any_uncondjump_p (BB_END (bb)))
1793         {
1794           error ("wrong amount of branch edges after unconditional jump %i", bb->index);
1795           err = 1;
1796         }
1797       if (n_branch != 1 && any_condjump_p (BB_END (bb))
1798           && JUMP_LABEL (BB_END (bb)) != BB_HEAD (fallthru->dest))
1799         {
1800           error ("wrong amount of branch edges after conditional jump %i",
1801                  bb->index);
1802           err = 1;
1803         }
1804       if (n_call && !CALL_P (BB_END (bb)))
1805         {
1806           error ("call edges for non-call insn in bb %i", bb->index);
1807           err = 1;
1808         }
1809       if (n_abnormal
1810           && (!CALL_P (BB_END (bb)) && n_call != n_abnormal)
1811           && (!JUMP_P (BB_END (bb))
1812               || any_condjump_p (BB_END (bb))
1813               || any_uncondjump_p (BB_END (bb))))
1814         {
1815           error ("abnormal edges for no purpose in bb %i", bb->index);
1816           err = 1;
1817         }
1818
1819       for (x = BB_HEAD (bb); x != NEXT_INSN (BB_END (bb)); x = NEXT_INSN (x))
1820         /* We may have a barrier inside a basic block before dead code
1821            elimination.  There is no BLOCK_FOR_INSN field in a barrier.  */
1822         if (!BARRIER_P (x) && BLOCK_FOR_INSN (x) != bb)
1823           {
1824             debug_rtx (x);
1825             if (! BLOCK_FOR_INSN (x))
1826               error
1827                 ("insn %d inside basic block %d but block_for_insn is NULL",
1828                  INSN_UID (x), bb->index);
1829             else
1830               error
1831                 ("insn %d inside basic block %d but block_for_insn is %i",
1832                  INSN_UID (x), bb->index, BLOCK_FOR_INSN (x)->index);
1833
1834             err = 1;
1835           }
1836
1837       /* OK pointers are correct.  Now check the header of basic
1838          block.  It ought to contain optional CODE_LABEL followed
1839          by NOTE_BASIC_BLOCK.  */
1840       x = BB_HEAD (bb);
1841       if (LABEL_P (x))
1842         {
1843           if (BB_END (bb) == x)
1844             {
1845               error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
1846                      bb->index);
1847               err = 1;
1848             }
1849
1850           x = NEXT_INSN (x);
1851         }
1852
1853       if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
1854         {
1855           error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
1856                  bb->index);
1857           err = 1;
1858         }
1859
1860       if (BB_END (bb) == x)
1861         /* Do checks for empty blocks here.  */
1862         ;
1863       else
1864         for (x = NEXT_INSN (x); x; x = NEXT_INSN (x))
1865           {
1866             if (NOTE_INSN_BASIC_BLOCK_P (x))
1867               {
1868                 error ("NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d",
1869                        INSN_UID (x), bb->index);
1870                 err = 1;
1871               }
1872
1873             if (x == BB_END (bb))
1874               break;
1875
1876             if (control_flow_insn_p (x))
1877               {
1878                 error ("in basic block %d:", bb->index);
1879                 fatal_insn ("flow control insn inside a basic block", x);
1880               }
1881           }
1882     }
1883
1884   /* Clean up.  */
1885   return err;
1886 }
1887
1888 /* Verify the CFG and RTL consistency common for both underlying RTL and
1889    cfglayout RTL.
1890
1891    Currently it does following checks:
1892    - all checks of rtl_verify_flow_info_1
1893    - test head/end pointers
1894    - check that all insns are in the basic blocks
1895      (except the switch handling code, barriers and notes)
1896    - check that all returns are followed by barriers
1897    - check that all fallthru edge points to the adjacent blocks.  */
1898
1899 static int
1900 rtl_verify_flow_info (void)
1901 {
1902   basic_block bb;
1903   int err = rtl_verify_flow_info_1 ();
1904   rtx x;
1905   rtx last_head = get_last_insn ();
1906   basic_block *bb_info;
1907   int num_bb_notes;
1908   const rtx rtx_first = get_insns ();
1909   basic_block last_bb_seen = ENTRY_BLOCK_PTR, curr_bb = NULL;
1910   const int max_uid = get_max_uid ();
1911
1912   bb_info = XCNEWVEC (basic_block, max_uid);
1913
1914   FOR_EACH_BB_REVERSE (bb)
1915     {
1916       edge e;
1917       edge_iterator ei;
1918       rtx head = BB_HEAD (bb);
1919       rtx end = BB_END (bb);
1920
1921       /* Verify the end of the basic block is in the INSN chain.  */
1922       for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
1923         if (x == end)
1924           break;
1925
1926       if (!x)
1927         {
1928           error ("end insn %d for block %d not found in the insn stream",
1929                  INSN_UID (end), bb->index);
1930           err = 1;
1931         }
1932
1933       /* Work backwards from the end to the head of the basic block
1934          to verify the head is in the RTL chain.  */
1935       for (; x != NULL_RTX; x = PREV_INSN (x))
1936         {
1937           /* While walking over the insn chain, verify insns appear
1938              in only one basic block.  */
1939           if (bb_info[INSN_UID (x)] != NULL)
1940             {
1941               error ("insn %d is in multiple basic blocks (%d and %d)",
1942                      INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
1943               err = 1;
1944             }
1945
1946           bb_info[INSN_UID (x)] = bb;
1947
1948           if (x == head)
1949             break;
1950         }
1951       if (!x)
1952         {
1953           error ("head insn %d for block %d not found in the insn stream",
1954                  INSN_UID (head), bb->index);
1955           err = 1;
1956         }
1957
1958       last_head = x;
1959
1960       FOR_EACH_EDGE (e, ei, bb->succs)
1961         if (e->flags & EDGE_FALLTHRU)
1962           break;
1963       if (!e)
1964         {
1965           rtx insn;
1966
1967           /* Ensure existence of barrier in BB with no fallthru edges.  */
1968           for (insn = BB_END (bb); !insn || !BARRIER_P (insn);
1969                insn = NEXT_INSN (insn))
1970             if (!insn
1971                 || NOTE_INSN_BASIC_BLOCK_P (insn))
1972                 {
1973                   error ("missing barrier after block %i", bb->index);
1974                   err = 1;
1975                   break;
1976                 }
1977         }
1978       else if (e->src != ENTRY_BLOCK_PTR
1979                && e->dest != EXIT_BLOCK_PTR)
1980         {
1981           rtx insn;
1982
1983           if (e->src->next_bb != e->dest)
1984             {
1985               error
1986                 ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
1987                  e->src->index, e->dest->index);
1988               err = 1;
1989             }
1990           else
1991             for (insn = NEXT_INSN (BB_END (e->src)); insn != BB_HEAD (e->dest);
1992                  insn = NEXT_INSN (insn))
1993               if (BARRIER_P (insn) || INSN_P (insn))
1994                 {
1995                   error ("verify_flow_info: Incorrect fallthru %i->%i",
1996                          e->src->index, e->dest->index);
1997                   fatal_insn ("wrong insn in the fallthru edge", insn);
1998                   err = 1;
1999                 }
2000         }
2001     }
2002
2003   free (bb_info);
2004
2005   num_bb_notes = 0;
2006   last_bb_seen = ENTRY_BLOCK_PTR;
2007
2008   for (x = rtx_first; x; x = NEXT_INSN (x))
2009     {
2010       if (NOTE_INSN_BASIC_BLOCK_P (x))
2011         {
2012           bb = NOTE_BASIC_BLOCK (x);
2013
2014           num_bb_notes++;
2015           if (bb != last_bb_seen->next_bb)
2016             internal_error ("basic blocks not laid down consecutively");
2017
2018           curr_bb = last_bb_seen = bb;
2019         }
2020
2021       if (!curr_bb)
2022         {
2023           switch (GET_CODE (x))
2024             {
2025             case BARRIER:
2026             case NOTE:
2027               break;
2028
2029             case CODE_LABEL:
2030               /* An addr_vec is placed outside any basic block.  */
2031               if (NEXT_INSN (x)
2032                   && JUMP_P (NEXT_INSN (x))
2033                   && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
2034                       || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
2035                 x = NEXT_INSN (x);
2036
2037               /* But in any case, non-deletable labels can appear anywhere.  */
2038               break;
2039
2040             default:
2041               fatal_insn ("insn outside basic block", x);
2042             }
2043         }
2044
2045       if (JUMP_P (x)
2046           && returnjump_p (x) && ! condjump_p (x)
2047           && ! (next_nonnote_insn (x) && BARRIER_P (next_nonnote_insn (x))))
2048             fatal_insn ("return not followed by barrier", x);
2049       if (curr_bb && x == BB_END (curr_bb))
2050         curr_bb = NULL;
2051     }
2052
2053   if (num_bb_notes != n_basic_blocks - NUM_FIXED_BLOCKS)
2054     internal_error
2055       ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2056        num_bb_notes, n_basic_blocks);
2057
2058    return err;
2059 }
2060 \f
2061 /* Assume that the preceding pass has possibly eliminated jump instructions
2062    or converted the unconditional jumps.  Eliminate the edges from CFG.
2063    Return true if any edges are eliminated.  */
2064
2065 bool
2066 purge_dead_edges (basic_block bb)
2067 {
2068   edge e;
2069   rtx insn = BB_END (bb), note;
2070   bool purged = false;
2071   bool found;
2072   edge_iterator ei;
2073
2074   /* If this instruction cannot trap, remove REG_EH_REGION notes.  */
2075   if (NONJUMP_INSN_P (insn)
2076       && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
2077     {
2078       rtx eqnote;
2079
2080       if (! may_trap_p (PATTERN (insn))
2081           || ((eqnote = find_reg_equal_equiv_note (insn))
2082               && ! may_trap_p (XEXP (eqnote, 0))))
2083         remove_note (insn, note);
2084     }
2085
2086   /* Cleanup abnormal edges caused by exceptions or non-local gotos.  */
2087   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2088     {
2089       /* There are three types of edges we need to handle correctly here: EH
2090          edges, abnormal call EH edges, and abnormal call non-EH edges.  The
2091          latter can appear when nonlocal gotos are used.  */
2092       if (e->flags & EDGE_EH)
2093         {
2094           if (can_throw_internal (BB_END (bb))
2095               /* If this is a call edge, verify that this is a call insn.  */
2096               && (! (e->flags & EDGE_ABNORMAL_CALL)
2097                   || CALL_P (BB_END (bb))))
2098             {
2099               ei_next (&ei);
2100               continue;
2101             }
2102         }
2103       else if (e->flags & EDGE_ABNORMAL_CALL)
2104         {
2105           if (CALL_P (BB_END (bb))
2106               && (! (note = find_reg_note (insn, REG_EH_REGION, NULL))
2107                   || INTVAL (XEXP (note, 0)) >= 0))
2108             {
2109               ei_next (&ei);
2110               continue;
2111             }
2112         }
2113       else
2114         {
2115           ei_next (&ei);
2116           continue;
2117         }
2118
2119       remove_edge (e);
2120       bb->flags |= BB_DIRTY;
2121       purged = true;
2122     }
2123
2124   if (JUMP_P (insn))
2125     {
2126       rtx note;
2127       edge b,f;
2128       edge_iterator ei;
2129
2130       /* We do care only about conditional jumps and simplejumps.  */
2131       if (!any_condjump_p (insn)
2132           && !returnjump_p (insn)
2133           && !simplejump_p (insn))
2134         return purged;
2135
2136       /* Branch probability/prediction notes are defined only for
2137          condjumps.  We've possibly turned condjump into simplejump.  */
2138       if (simplejump_p (insn))
2139         {
2140           note = find_reg_note (insn, REG_BR_PROB, NULL);
2141           if (note)
2142             remove_note (insn, note);
2143           while ((note = find_reg_note (insn, REG_BR_PRED, NULL)))
2144             remove_note (insn, note);
2145         }
2146
2147       for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2148         {
2149           /* Avoid abnormal flags to leak from computed jumps turned
2150              into simplejumps.  */
2151
2152           e->flags &= ~EDGE_ABNORMAL;
2153
2154           /* See if this edge is one we should keep.  */
2155           if ((e->flags & EDGE_FALLTHRU) && any_condjump_p (insn))
2156             /* A conditional jump can fall through into the next
2157                block, so we should keep the edge.  */
2158             {
2159               ei_next (&ei);
2160               continue;
2161             }
2162           else if (e->dest != EXIT_BLOCK_PTR
2163                    && BB_HEAD (e->dest) == JUMP_LABEL (insn))
2164             /* If the destination block is the target of the jump,
2165                keep the edge.  */
2166             {
2167               ei_next (&ei);
2168               continue;
2169             }
2170           else if (e->dest == EXIT_BLOCK_PTR && returnjump_p (insn))
2171             /* If the destination block is the exit block, and this
2172                instruction is a return, then keep the edge.  */
2173             {
2174               ei_next (&ei);
2175               continue;
2176             }
2177           else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2178             /* Keep the edges that correspond to exceptions thrown by
2179                this instruction and rematerialize the EDGE_ABNORMAL
2180                flag we just cleared above.  */
2181             {
2182               e->flags |= EDGE_ABNORMAL;
2183               ei_next (&ei);
2184               continue;
2185             }
2186
2187           /* We do not need this edge.  */
2188           bb->flags |= BB_DIRTY;
2189           purged = true;
2190           remove_edge (e);
2191         }
2192
2193       if (EDGE_COUNT (bb->succs) == 0 || !purged)
2194         return purged;
2195
2196       if (dump_file)
2197         fprintf (dump_file, "Purged edges from bb %i\n", bb->index);
2198
2199       if (!optimize)
2200         return purged;
2201
2202       /* Redistribute probabilities.  */
2203       if (single_succ_p (bb))
2204         {
2205           single_succ_edge (bb)->probability = REG_BR_PROB_BASE;
2206           single_succ_edge (bb)->count = bb->count;
2207         }
2208       else
2209         {
2210           note = find_reg_note (insn, REG_BR_PROB, NULL);
2211           if (!note)
2212             return purged;
2213
2214           b = BRANCH_EDGE (bb);
2215           f = FALLTHRU_EDGE (bb);
2216           b->probability = INTVAL (XEXP (note, 0));
2217           f->probability = REG_BR_PROB_BASE - b->probability;
2218           b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2219           f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2220         }
2221
2222       return purged;
2223     }
2224   else if (CALL_P (insn) && SIBLING_CALL_P (insn))
2225     {
2226       /* First, there should not be any EH or ABCALL edges resulting
2227          from non-local gotos and the like.  If there were, we shouldn't
2228          have created the sibcall in the first place.  Second, there
2229          should of course never have been a fallthru edge.  */
2230       gcc_assert (single_succ_p (bb));
2231       gcc_assert (single_succ_edge (bb)->flags
2232                   == (EDGE_SIBCALL | EDGE_ABNORMAL));
2233
2234       return 0;
2235     }
2236
2237   /* If we don't see a jump insn, we don't know exactly why the block would
2238      have been broken at this point.  Look for a simple, non-fallthru edge,
2239      as these are only created by conditional branches.  If we find such an
2240      edge we know that there used to be a jump here and can then safely
2241      remove all non-fallthru edges.  */
2242   found = false;
2243   FOR_EACH_EDGE (e, ei, bb->succs)
2244     if (! (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU)))
2245       {
2246         found = true;
2247         break;
2248       }
2249
2250   if (!found)
2251     return purged;
2252
2253   /* Remove all but the fake and fallthru edges.  The fake edge may be
2254      the only successor for this block in the case of noreturn
2255      calls.  */
2256   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2257     {
2258       if (!(e->flags & (EDGE_FALLTHRU | EDGE_FAKE)))
2259         {
2260           bb->flags |= BB_DIRTY;
2261           remove_edge (e);
2262           purged = true;
2263         }
2264       else
2265         ei_next (&ei);
2266     }
2267
2268   gcc_assert (single_succ_p (bb));
2269
2270   single_succ_edge (bb)->probability = REG_BR_PROB_BASE;
2271   single_succ_edge (bb)->count = bb->count;
2272
2273   if (dump_file)
2274     fprintf (dump_file, "Purged non-fallthru edges from bb %i\n",
2275              bb->index);
2276   return purged;
2277 }
2278
2279 /* Search all basic blocks for potentially dead edges and purge them.  Return
2280    true if some edge has been eliminated.  */
2281
2282 bool
2283 purge_all_dead_edges (void)
2284 {
2285   int purged = false;
2286   basic_block bb;
2287
2288   FOR_EACH_BB (bb)
2289     {
2290       bool purged_here = purge_dead_edges (bb);
2291
2292       purged |= purged_here;
2293     }
2294
2295   return purged;
2296 }
2297
2298 /* Same as split_block but update cfg_layout structures.  */
2299
2300 static basic_block
2301 cfg_layout_split_block (basic_block bb, void *insnp)
2302 {
2303   rtx insn = insnp;
2304   basic_block new_bb = rtl_split_block (bb, insn);
2305
2306   new_bb->il.rtl->footer = bb->il.rtl->footer;
2307   bb->il.rtl->footer = NULL;
2308
2309   return new_bb;
2310 }
2311
2312
2313 /* Redirect Edge to DEST.  */
2314 static edge
2315 cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
2316 {
2317   basic_block src = e->src;
2318   edge ret;
2319
2320   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
2321     return NULL;
2322
2323   if (e->dest == dest)
2324     return e;
2325
2326   if (e->src != ENTRY_BLOCK_PTR
2327       && (ret = try_redirect_by_replacing_jump (e, dest, true)))
2328     {
2329       src->flags |= BB_DIRTY;
2330       return ret;
2331     }
2332
2333   if (e->src == ENTRY_BLOCK_PTR
2334       && (e->flags & EDGE_FALLTHRU) && !(e->flags & EDGE_COMPLEX))
2335     {
2336       if (dump_file)
2337         fprintf (dump_file, "Redirecting entry edge from bb %i to %i\n",
2338                  e->src->index, dest->index);
2339
2340       e->src->flags |= BB_DIRTY;
2341       redirect_edge_succ (e, dest);
2342       return e;
2343     }
2344
2345   /* Redirect_edge_and_branch may decide to turn branch into fallthru edge
2346      in the case the basic block appears to be in sequence.  Avoid this
2347      transformation.  */
2348
2349   if (e->flags & EDGE_FALLTHRU)
2350     {
2351       /* Redirect any branch edges unified with the fallthru one.  */
2352       if (JUMP_P (BB_END (src))
2353           && label_is_jump_target_p (BB_HEAD (e->dest),
2354                                      BB_END (src)))
2355         {
2356           edge redirected;
2357
2358           if (dump_file)
2359             fprintf (dump_file, "Fallthru edge unified with branch "
2360                      "%i->%i redirected to %i\n",
2361                      e->src->index, e->dest->index, dest->index);
2362           e->flags &= ~EDGE_FALLTHRU;
2363           redirected = redirect_branch_edge (e, dest);
2364           gcc_assert (redirected);
2365           e->flags |= EDGE_FALLTHRU;
2366           e->src->flags |= BB_DIRTY;
2367           return e;
2368         }
2369       /* In case we are redirecting fallthru edge to the branch edge
2370          of conditional jump, remove it.  */
2371       if (EDGE_COUNT (src->succs) == 2)
2372         {
2373           /* Find the edge that is different from E.  */
2374           edge s = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e);
2375
2376           if (s->dest == dest
2377               && any_condjump_p (BB_END (src))
2378               && onlyjump_p (BB_END (src)))
2379             delete_insn (BB_END (src));
2380         }
2381       ret = redirect_edge_succ_nodup (e, dest);
2382       if (dump_file)
2383         fprintf (dump_file, "Fallthru edge %i->%i redirected to %i\n",
2384                  e->src->index, e->dest->index, dest->index);
2385     }
2386   else
2387     ret = redirect_branch_edge (e, dest);
2388
2389   /* We don't want simplejumps in the insn stream during cfglayout.  */
2390   gcc_assert (!simplejump_p (BB_END (src)));
2391
2392   src->flags |= BB_DIRTY;
2393   return ret;
2394 }
2395
2396 /* Simple wrapper as we always can redirect fallthru edges.  */
2397 static basic_block
2398 cfg_layout_redirect_edge_and_branch_force (edge e, basic_block dest)
2399 {
2400   edge redirected = cfg_layout_redirect_edge_and_branch (e, dest);
2401
2402   gcc_assert (redirected);
2403   return NULL;
2404 }
2405
2406 /* Same as delete_basic_block but update cfg_layout structures.  */
2407
2408 static void
2409 cfg_layout_delete_block (basic_block bb)
2410 {
2411   rtx insn, next, prev = PREV_INSN (BB_HEAD (bb)), *to, remaints;
2412
2413   if (bb->il.rtl->header)
2414     {
2415       next = BB_HEAD (bb);
2416       if (prev)
2417         NEXT_INSN (prev) = bb->il.rtl->header;
2418       else
2419         set_first_insn (bb->il.rtl->header);
2420       PREV_INSN (bb->il.rtl->header) = prev;
2421       insn = bb->il.rtl->header;
2422       while (NEXT_INSN (insn))
2423         insn = NEXT_INSN (insn);
2424       NEXT_INSN (insn) = next;
2425       PREV_INSN (next) = insn;
2426     }
2427   next = NEXT_INSN (BB_END (bb));
2428   if (bb->il.rtl->footer)
2429     {
2430       insn = bb->il.rtl->footer;
2431       while (insn)
2432         {
2433           if (BARRIER_P (insn))
2434             {
2435               if (PREV_INSN (insn))
2436                 NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
2437               else
2438                 bb->il.rtl->footer = NEXT_INSN (insn);
2439               if (NEXT_INSN (insn))
2440                 PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
2441             }
2442           if (LABEL_P (insn))
2443             break;
2444           insn = NEXT_INSN (insn);
2445         }
2446       if (bb->il.rtl->footer)
2447         {
2448           insn = BB_END (bb);
2449           NEXT_INSN (insn) = bb->il.rtl->footer;
2450           PREV_INSN (bb->il.rtl->footer) = insn;
2451           while (NEXT_INSN (insn))
2452             insn = NEXT_INSN (insn);
2453           NEXT_INSN (insn) = next;
2454           if (next)
2455             PREV_INSN (next) = insn;
2456           else
2457             set_last_insn (insn);
2458         }
2459     }
2460   if (bb->next_bb != EXIT_BLOCK_PTR)
2461     to = &bb->next_bb->il.rtl->header;
2462   else
2463     to = &cfg_layout_function_footer;
2464
2465   rtl_delete_block (bb);
2466
2467   if (prev)
2468     prev = NEXT_INSN (prev);
2469   else
2470     prev = get_insns ();
2471   if (next)
2472     next = PREV_INSN (next);
2473   else
2474     next = get_last_insn ();
2475
2476   if (next && NEXT_INSN (next) != prev)
2477     {
2478       remaints = unlink_insn_chain (prev, next);
2479       insn = remaints;
2480       while (NEXT_INSN (insn))
2481         insn = NEXT_INSN (insn);
2482       NEXT_INSN (insn) = *to;
2483       if (*to)
2484         PREV_INSN (*to) = insn;
2485       *to = remaints;
2486     }
2487 }
2488
2489 /* Return true when blocks A and B can be safely merged.  */
2490 static bool
2491 cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
2492 {
2493   /* If we are partitioning hot/cold basic blocks, we don't want to
2494      mess up unconditional or indirect jumps that cross between hot
2495      and cold sections.
2496
2497      Basic block partitioning may result in some jumps that appear to
2498      be optimizable (or blocks that appear to be mergeable), but which really
2499      must be left untouched (they are required to make it safely across
2500      partition boundaries).  See  the comments at the top of
2501      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
2502
2503   if (BB_PARTITION (a) != BB_PARTITION (b))
2504     return false;
2505
2506   /* There must be exactly one edge in between the blocks.  */
2507   return (single_succ_p (a)
2508           && single_succ (a) == b
2509           && single_pred_p (b) == 1
2510           && a != b
2511           /* Must be simple edge.  */
2512           && !(single_succ_edge (a)->flags & EDGE_COMPLEX)
2513           && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
2514           /* If the jump insn has side effects, we can't kill the edge.
2515              When not optimizing, try_redirect_by_replacing_jump will
2516              not allow us to redirect an edge by replacing a table jump.  */
2517           && (!JUMP_P (BB_END (a))
2518               || ((!optimize || reload_completed)
2519                   ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
2520 }
2521
2522 /* Merge block A and B.  The blocks must be mergeable.  */
2523
2524 static void
2525 cfg_layout_merge_blocks (basic_block a, basic_block b)
2526 {
2527 #ifdef ENABLE_CHECKING
2528   gcc_assert (cfg_layout_can_merge_blocks_p (a, b));
2529 #endif
2530
2531   /* If there was a CODE_LABEL beginning B, delete it.  */
2532   if (LABEL_P (BB_HEAD (b)))
2533     {
2534       /* This might have been an EH label that no longer has incoming
2535          EH edges.  Update data structures to match.  */
2536       maybe_remove_eh_handler (BB_HEAD (b));
2537
2538       delete_insn (BB_HEAD (b));
2539     }
2540
2541   /* We should have fallthru edge in a, or we can do dummy redirection to get
2542      it cleaned up.  */
2543   if (JUMP_P (BB_END (a)))
2544     try_redirect_by_replacing_jump (EDGE_SUCC (a, 0), b, true);
2545   gcc_assert (!JUMP_P (BB_END (a)));
2546
2547   /* Possible line number notes should appear in between.  */
2548   if (b->il.rtl->header)
2549     {
2550       rtx first = BB_END (a), last;
2551
2552       last = emit_insn_after_noloc (b->il.rtl->header, BB_END (a));
2553       delete_insn_chain (NEXT_INSN (first), last);
2554       b->il.rtl->header = NULL;
2555     }
2556
2557   /* In the case basic blocks are not adjacent, move them around.  */
2558   if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
2559     {
2560       rtx first = unlink_insn_chain (BB_HEAD (b), BB_END (b));
2561
2562       emit_insn_after_noloc (first, BB_END (a));
2563       /* Skip possible DELETED_LABEL insn.  */
2564       if (!NOTE_INSN_BASIC_BLOCK_P (first))
2565         first = NEXT_INSN (first);
2566       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (first));
2567       BB_HEAD (b) = NULL;
2568       delete_insn (first);
2569     }
2570   /* Otherwise just re-associate the instructions.  */
2571   else
2572     {
2573       rtx insn;
2574
2575       for (insn = BB_HEAD (b);
2576            insn != NEXT_INSN (BB_END (b));
2577            insn = NEXT_INSN (insn))
2578         set_block_for_insn (insn, a);
2579       insn = BB_HEAD (b);
2580       /* Skip possible DELETED_LABEL insn.  */
2581       if (!NOTE_INSN_BASIC_BLOCK_P (insn))
2582         insn = NEXT_INSN (insn);
2583       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
2584       BB_HEAD (b) = NULL;
2585       BB_END (a) = BB_END (b);
2586       delete_insn (insn);
2587     }
2588
2589   /* Possible tablejumps and barriers should appear after the block.  */
2590   if (b->il.rtl->footer)
2591     {
2592       if (!a->il.rtl->footer)
2593         a->il.rtl->footer = b->il.rtl->footer;
2594       else
2595         {
2596           rtx last = a->il.rtl->footer;
2597
2598           while (NEXT_INSN (last))
2599             last = NEXT_INSN (last);
2600           NEXT_INSN (last) = b->il.rtl->footer;
2601           PREV_INSN (b->il.rtl->footer) = last;
2602         }
2603       b->il.rtl->footer = NULL;
2604     }
2605   a->il.rtl->global_live_at_end = b->il.rtl->global_live_at_end;
2606
2607   if (dump_file)
2608     fprintf (dump_file, "Merged blocks %d and %d.\n",
2609              a->index, b->index);
2610 }
2611
2612 /* Split edge E.  */
2613
2614 static basic_block
2615 cfg_layout_split_edge (edge e)
2616 {
2617   basic_block new_bb =
2618     create_basic_block (e->src != ENTRY_BLOCK_PTR
2619                         ? NEXT_INSN (BB_END (e->src)) : get_insns (),
2620                         NULL_RTX, e->src);
2621
2622   /* ??? This info is likely going to be out of date very soon, but we must
2623      create it to avoid getting an ICE later.  */
2624   if (e->dest->il.rtl->global_live_at_start)
2625     {
2626       new_bb->il.rtl->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
2627       new_bb->il.rtl->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
2628       COPY_REG_SET (new_bb->il.rtl->global_live_at_start,
2629                     e->dest->il.rtl->global_live_at_start);
2630       COPY_REG_SET (new_bb->il.rtl->global_live_at_end,
2631                     e->dest->il.rtl->global_live_at_start);
2632     }
2633
2634   make_edge (new_bb, e->dest, EDGE_FALLTHRU);
2635   redirect_edge_and_branch_force (e, new_bb);
2636
2637   return new_bb;
2638 }
2639
2640 /* Do postprocessing after making a forwarder block joined by edge FALLTHRU.  */
2641
2642 static void
2643 rtl_make_forwarder_block (edge fallthru ATTRIBUTE_UNUSED)
2644 {
2645 }
2646
2647 /* Return 1 if BB ends with a call, possibly followed by some
2648    instructions that must stay with the call, 0 otherwise.  */
2649
2650 static bool
2651 rtl_block_ends_with_call_p (basic_block bb)
2652 {
2653   rtx insn = BB_END (bb);
2654
2655   while (!CALL_P (insn)
2656          && insn != BB_HEAD (bb)
2657          && keep_with_call_p (insn))
2658     insn = PREV_INSN (insn);
2659   return (CALL_P (insn));
2660 }
2661
2662 /* Return 1 if BB ends with a conditional branch, 0 otherwise.  */
2663
2664 static bool
2665 rtl_block_ends_with_condjump_p (basic_block bb)
2666 {
2667   return any_condjump_p (BB_END (bb));
2668 }
2669
2670 /* Return true if we need to add fake edge to exit.
2671    Helper function for rtl_flow_call_edges_add.  */
2672
2673 static bool
2674 need_fake_edge_p (rtx insn)
2675 {
2676   if (!INSN_P (insn))
2677     return false;
2678
2679   if ((CALL_P (insn)
2680        && !SIBLING_CALL_P (insn)
2681        && !find_reg_note (insn, REG_NORETURN, NULL)
2682        && !CONST_OR_PURE_CALL_P (insn)))
2683     return true;
2684
2685   return ((GET_CODE (PATTERN (insn)) == ASM_OPERANDS
2686            && MEM_VOLATILE_P (PATTERN (insn)))
2687           || (GET_CODE (PATTERN (insn)) == PARALLEL
2688               && asm_noperands (insn) != -1
2689               && MEM_VOLATILE_P (XVECEXP (PATTERN (insn), 0, 0)))
2690           || GET_CODE (PATTERN (insn)) == ASM_INPUT);
2691 }
2692
2693 /* Add fake edges to the function exit for any non constant and non noreturn
2694    calls, volatile inline assembly in the bitmap of blocks specified by
2695    BLOCKS or to the whole CFG if BLOCKS is zero.  Return the number of blocks
2696    that were split.
2697
2698    The goal is to expose cases in which entering a basic block does not imply
2699    that all subsequent instructions must be executed.  */
2700
2701 static int
2702 rtl_flow_call_edges_add (sbitmap blocks)
2703 {
2704   int i;
2705   int blocks_split = 0;
2706   int last_bb = last_basic_block;
2707   bool check_last_block = false;
2708
2709   if (n_basic_blocks == NUM_FIXED_BLOCKS)
2710     return 0;
2711
2712   if (! blocks)
2713     check_last_block = true;
2714   else
2715     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
2716
2717   /* In the last basic block, before epilogue generation, there will be
2718      a fallthru edge to EXIT.  Special care is required if the last insn
2719      of the last basic block is a call because make_edge folds duplicate
2720      edges, which would result in the fallthru edge also being marked
2721      fake, which would result in the fallthru edge being removed by
2722      remove_fake_edges, which would result in an invalid CFG.
2723
2724      Moreover, we can't elide the outgoing fake edge, since the block
2725      profiler needs to take this into account in order to solve the minimal
2726      spanning tree in the case that the call doesn't return.
2727
2728      Handle this by adding a dummy instruction in a new last basic block.  */
2729   if (check_last_block)
2730     {
2731       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
2732       rtx insn = BB_END (bb);
2733
2734       /* Back up past insns that must be kept in the same block as a call.  */
2735       while (insn != BB_HEAD (bb)
2736              && keep_with_call_p (insn))
2737         insn = PREV_INSN (insn);
2738
2739       if (need_fake_edge_p (insn))
2740         {
2741           edge e;
2742
2743           e = find_edge (bb, EXIT_BLOCK_PTR);
2744           if (e)
2745             {
2746               insert_insn_on_edge (gen_rtx_USE (VOIDmode, const0_rtx), e);
2747               commit_edge_insertions ();
2748             }
2749         }
2750     }
2751
2752   /* Now add fake edges to the function exit for any non constant
2753      calls since there is no way that we can determine if they will
2754      return or not...  */
2755
2756   for (i = NUM_FIXED_BLOCKS; i < last_bb; i++)
2757     {
2758       basic_block bb = BASIC_BLOCK (i);
2759       rtx insn;
2760       rtx prev_insn;
2761
2762       if (!bb)
2763         continue;
2764
2765       if (blocks && !TEST_BIT (blocks, i))
2766         continue;
2767
2768       for (insn = BB_END (bb); ; insn = prev_insn)
2769         {
2770           prev_insn = PREV_INSN (insn);
2771           if (need_fake_edge_p (insn))
2772             {
2773               edge e;
2774               rtx split_at_insn = insn;
2775
2776               /* Don't split the block between a call and an insn that should
2777                  remain in the same block as the call.  */
2778               if (CALL_P (insn))
2779                 while (split_at_insn != BB_END (bb)
2780                        && keep_with_call_p (NEXT_INSN (split_at_insn)))
2781                   split_at_insn = NEXT_INSN (split_at_insn);
2782
2783               /* The handling above of the final block before the epilogue
2784                  should be enough to verify that there is no edge to the exit
2785                  block in CFG already.  Calling make_edge in such case would
2786                  cause us to mark that edge as fake and remove it later.  */
2787
2788 #ifdef ENABLE_CHECKING
2789               if (split_at_insn == BB_END (bb))
2790                 {
2791                   e = find_edge (bb, EXIT_BLOCK_PTR);
2792                   gcc_assert (e == NULL);
2793                 }
2794 #endif
2795
2796               /* Note that the following may create a new basic block
2797                  and renumber the existing basic blocks.  */
2798               if (split_at_insn != BB_END (bb))
2799                 {
2800                   e = split_block (bb, split_at_insn);
2801                   if (e)
2802                     blocks_split++;
2803                 }
2804
2805               make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
2806             }
2807
2808           if (insn == BB_HEAD (bb))
2809             break;
2810         }
2811     }
2812
2813   if (blocks_split)
2814     verify_flow_info ();
2815
2816   return blocks_split;
2817 }
2818
2819 /* Add COMP_RTX as a condition at end of COND_BB.  FIRST_HEAD is
2820    the conditional branch target, SECOND_HEAD should be the fall-thru
2821    there is no need to handle this here the loop versioning code handles
2822    this.  the reason for SECON_HEAD is that it is needed for condition
2823    in trees, and this should be of the same type since it is a hook.  */
2824 static void
2825 rtl_lv_add_condition_to_bb (basic_block first_head ,
2826                             basic_block second_head ATTRIBUTE_UNUSED,
2827                             basic_block cond_bb, void *comp_rtx)
2828 {
2829   rtx label, seq, jump;
2830   rtx op0 = XEXP ((rtx)comp_rtx, 0);
2831   rtx op1 = XEXP ((rtx)comp_rtx, 1);
2832   enum rtx_code comp = GET_CODE ((rtx)comp_rtx);
2833   enum machine_mode mode;
2834
2835
2836   label = block_label (first_head);
2837   mode = GET_MODE (op0);
2838   if (mode == VOIDmode)
2839     mode = GET_MODE (op1);
2840
2841   start_sequence ();
2842   op0 = force_operand (op0, NULL_RTX);
2843   op1 = force_operand (op1, NULL_RTX);
2844   do_compare_rtx_and_jump (op0, op1, comp, 0,
2845                            mode, NULL_RTX, NULL_RTX, label);
2846   jump = get_last_insn ();
2847   JUMP_LABEL (jump) = label;
2848   LABEL_NUSES (label)++;
2849   seq = get_insns ();
2850   end_sequence ();
2851
2852   /* Add the new cond , in the new head.  */
2853   emit_insn_after(seq, BB_END(cond_bb));
2854 }
2855
2856
2857 /* Given a block B with unconditional branch at its end, get the
2858    store the return the branch edge and the fall-thru edge in
2859    BRANCH_EDGE and FALLTHRU_EDGE respectively.  */
2860 static void
2861 rtl_extract_cond_bb_edges (basic_block b, edge *branch_edge,
2862                            edge *fallthru_edge)
2863 {
2864   edge e = EDGE_SUCC (b, 0);
2865
2866   if (e->flags & EDGE_FALLTHRU)
2867     {
2868       *fallthru_edge = e;
2869       *branch_edge = EDGE_SUCC (b, 1);
2870     }
2871   else
2872     {
2873       *branch_edge = e;
2874       *fallthru_edge = EDGE_SUCC (b, 1);
2875     }
2876 }
2877
2878 void
2879 init_rtl_bb_info (basic_block bb)
2880 {
2881   gcc_assert (!bb->il.rtl);
2882   bb->il.rtl = ggc_alloc_cleared (sizeof (struct rtl_bb_info));
2883 }
2884
2885
2886 /* Add EXPR to the end of basic block BB.  */
2887
2888 rtx
2889 insert_insn_end_bb_new (rtx pat, basic_block bb)
2890 {
2891   rtx insn = BB_END (bb);
2892   rtx new_insn;
2893   rtx pat_end = pat;
2894
2895   while (NEXT_INSN (pat_end) != NULL_RTX)
2896     pat_end = NEXT_INSN (pat_end);
2897
2898   /* If the last insn is a jump, insert EXPR in front [taking care to
2899      handle cc0, etc. properly].  Similarly we need to care trapping
2900      instructions in presence of non-call exceptions.  */
2901
2902   if (JUMP_P (insn)
2903       || (NONJUMP_INSN_P (insn)
2904           && (!single_succ_p (bb)
2905               || single_succ_edge (bb)->flags & EDGE_ABNORMAL)))
2906     {
2907 #ifdef HAVE_cc0
2908       rtx note;
2909 #endif
2910       /* If this is a jump table, then we can't insert stuff here.  Since
2911          we know the previous real insn must be the tablejump, we insert
2912          the new instruction just before the tablejump.  */
2913       if (GET_CODE (PATTERN (insn)) == ADDR_VEC
2914           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
2915         insn = prev_real_insn (insn);
2916
2917 #ifdef HAVE_cc0
2918       /* FIXME: 'twould be nice to call prev_cc0_setter here but it aborts
2919          if cc0 isn't set.  */
2920       note = find_reg_note (insn, REG_CC_SETTER, NULL_RTX);
2921       if (note)
2922         insn = XEXP (note, 0);
2923       else
2924         {
2925           rtx maybe_cc0_setter = prev_nonnote_insn (insn);
2926           if (maybe_cc0_setter
2927               && INSN_P (maybe_cc0_setter)
2928               && sets_cc0_p (PATTERN (maybe_cc0_setter)))
2929             insn = maybe_cc0_setter;
2930         }
2931 #endif
2932       /* FIXME: What if something in cc0/jump uses value set in new
2933          insn?  */
2934       new_insn = emit_insn_before_noloc (pat, insn);
2935     }
2936
2937   /* Likewise if the last insn is a call, as will happen in the presence
2938      of exception handling.  */
2939   else if (CALL_P (insn)
2940            && (!single_succ_p (bb)
2941                || single_succ_edge (bb)->flags & EDGE_ABNORMAL))
2942     {
2943       /* Keeping in mind SMALL_REGISTER_CLASSES and parameters in registers,
2944          we search backward and place the instructions before the first
2945          parameter is loaded.  Do this for everyone for consistency and a
2946          presumption that we'll get better code elsewhere as well.  */
2947
2948       /* Since different machines initialize their parameter registers
2949          in different orders, assume nothing.  Collect the set of all
2950          parameter registers.  */
2951       insn = find_first_parameter_load (insn, BB_HEAD (bb));
2952
2953       /* If we found all the parameter loads, then we want to insert
2954          before the first parameter load.
2955
2956          If we did not find all the parameter loads, then we might have
2957          stopped on the head of the block, which could be a CODE_LABEL.
2958          If we inserted before the CODE_LABEL, then we would be putting
2959          the insn in the wrong basic block.  In that case, put the insn
2960          after the CODE_LABEL.  Also, respect NOTE_INSN_BASIC_BLOCK.  */
2961       while (LABEL_P (insn)
2962              || NOTE_INSN_BASIC_BLOCK_P (insn))
2963         insn = NEXT_INSN (insn);
2964
2965       new_insn = emit_insn_before_noloc (pat, insn);
2966     }
2967   else
2968     new_insn = emit_insn_after_noloc (pat, insn);
2969
2970   return new_insn;
2971 }
2972
2973 /* Returns true if it is possible to remove edge E by redirecting
2974    it to the destination of the other edge from E->src.  */
2975
2976 static bool
2977 rtl_can_remove_branch_p (edge e)
2978 {
2979   basic_block src = e->src;
2980   basic_block target = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest;
2981   rtx insn = BB_END (src), set;
2982
2983   /* The conditions are taken from try_redirect_by_replacing_jump.  */
2984   if (target == EXIT_BLOCK_PTR)
2985     return false;
2986
2987   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
2988     return false;
2989
2990   if (find_reg_note (insn, REG_CROSSING_JUMP, NULL_RTX)
2991       || BB_PARTITION (src) != BB_PARTITION (target))
2992     return false;
2993
2994   if (!onlyjump_p (insn)
2995       || tablejump_p (insn, NULL, NULL))
2996     return false;
2997
2998   set = single_set (insn);
2999   if (!set || side_effects_p (set))
3000     return false;
3001
3002   return true;
3003 }
3004
3005 /* Implementation of CFG manipulation for linearized RTL.  */
3006 struct cfg_hooks rtl_cfg_hooks = {
3007   "rtl",
3008   rtl_verify_flow_info,
3009   rtl_dump_bb,
3010   rtl_create_basic_block,
3011   rtl_redirect_edge_and_branch,
3012   rtl_redirect_edge_and_branch_force,
3013   rtl_can_remove_branch_p,
3014   rtl_delete_block,
3015   rtl_split_block,
3016   rtl_move_block_after,
3017   rtl_can_merge_blocks,  /* can_merge_blocks_p */
3018   rtl_merge_blocks,
3019   rtl_predict_edge,
3020   rtl_predicted_by_p,
3021   NULL, /* can_duplicate_block_p */
3022   NULL, /* duplicate_block */
3023   rtl_split_edge,
3024   rtl_make_forwarder_block,
3025   rtl_tidy_fallthru_edge,
3026   rtl_block_ends_with_call_p,
3027   rtl_block_ends_with_condjump_p,
3028   rtl_flow_call_edges_add,
3029   NULL, /* execute_on_growing_pred */
3030   NULL, /* execute_on_shrinking_pred */
3031   NULL, /* duplicate loop for trees */
3032   NULL, /* lv_add_condition_to_bb */
3033   NULL, /* lv_adjust_loop_header_phi*/
3034   NULL, /* extract_cond_bb_edges */
3035   NULL          /* flush_pending_stmts */
3036 };
3037
3038 /* Implementation of CFG manipulation for cfg layout RTL, where
3039    basic block connected via fallthru edges does not have to be adjacent.
3040    This representation will hopefully become the default one in future
3041    version of the compiler.  */
3042
3043 /* We do not want to declare these functions in a header file, since they
3044    should only be used through the cfghooks interface, and we do not want to
3045    move them here since it would require also moving quite a lot of related
3046    code.  */
3047 extern bool cfg_layout_can_duplicate_bb_p (basic_block);
3048 extern basic_block cfg_layout_duplicate_bb (basic_block);
3049
3050 struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
3051   "cfglayout mode",
3052   rtl_verify_flow_info_1,
3053   rtl_dump_bb,
3054   cfg_layout_create_basic_block,
3055   cfg_layout_redirect_edge_and_branch,
3056   cfg_layout_redirect_edge_and_branch_force,
3057   rtl_can_remove_branch_p,
3058   cfg_layout_delete_block,
3059   cfg_layout_split_block,
3060   rtl_move_block_after,
3061   cfg_layout_can_merge_blocks_p,
3062   cfg_layout_merge_blocks,
3063   rtl_predict_edge,
3064   rtl_predicted_by_p,
3065   cfg_layout_can_duplicate_bb_p,
3066   cfg_layout_duplicate_bb,
3067   cfg_layout_split_edge,
3068   rtl_make_forwarder_block,
3069   NULL,
3070   rtl_block_ends_with_call_p,
3071   rtl_block_ends_with_condjump_p,
3072   rtl_flow_call_edges_add,
3073   NULL, /* execute_on_growing_pred */
3074   NULL, /* execute_on_shrinking_pred */
3075   duplicate_loop_to_header_edge, /* duplicate loop for trees */
3076   rtl_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
3077   NULL, /* lv_adjust_loop_header_phi*/
3078   rtl_extract_cond_bb_edges, /* extract_cond_bb_edges */
3079   NULL          /* flush_pending_stmts */
3080 };