OSDN Git Service

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