OSDN Git Service

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