OSDN Git Service

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