OSDN Git Service

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