OSDN Git Service

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