OSDN Git Service

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