OSDN Git Service

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