OSDN Git Service

PR debug/46307
[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 (insn = BB_HEAD (src); insn != NEXT_INSN (BB_END (src));
1066          insn = NEXT_INSN (insn))
1067       if (JUMP_P (insn) && !patch_jump_insn (insn, old_label, target))
1068         return NULL;
1069
1070   if (dump_file)
1071     fprintf (dump_file, "Edge %i->%i redirected to %i\n",
1072              e->src->index, e->dest->index, target->index);
1073
1074   if (e->dest != target)
1075     e = redirect_edge_succ_nodup (e, target);
1076
1077   return e;
1078 }
1079
1080 /* Attempt to change code to redirect edge E to TARGET.  Don't do that on
1081    expense of adding new instructions or reordering basic blocks.
1082
1083    Function can be also called with edge destination equivalent to the TARGET.
1084    Then it should try the simplifications and do nothing if none is possible.
1085
1086    Return edge representing the branch if transformation succeeded.  Return NULL
1087    on failure.
1088    We still return NULL in case E already destinated TARGET and we didn't
1089    managed to simplify instruction stream.  */
1090
1091 static edge
1092 rtl_redirect_edge_and_branch (edge e, basic_block target)
1093 {
1094   edge ret;
1095   basic_block src = e->src;
1096
1097   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
1098     return NULL;
1099
1100   if (e->dest == target)
1101     return e;
1102
1103   if ((ret = try_redirect_by_replacing_jump (e, target, false)) != NULL)
1104     {
1105       df_set_bb_dirty (src);
1106       return ret;
1107     }
1108
1109   ret = redirect_branch_edge (e, target);
1110   if (!ret)
1111     return NULL;
1112
1113   df_set_bb_dirty (src);
1114   return ret;
1115 }
1116
1117 /* Like force_nonfallthru below, but additionally performs redirection
1118    Used by redirect_edge_and_branch_force.  */
1119
1120 static basic_block
1121 force_nonfallthru_and_redirect (edge e, basic_block target)
1122 {
1123   basic_block jump_block, new_bb = NULL, src = e->src;
1124   rtx note;
1125   edge new_edge;
1126   int abnormal_edge_flags = 0;
1127   int loc;
1128
1129   /* In the case the last instruction is conditional jump to the next
1130      instruction, first redirect the jump itself and then continue
1131      by creating a basic block afterwards to redirect fallthru edge.  */
1132   if (e->src != ENTRY_BLOCK_PTR && e->dest != EXIT_BLOCK_PTR
1133       && any_condjump_p (BB_END (e->src))
1134       && JUMP_LABEL (BB_END (e->src)) == BB_HEAD (e->dest))
1135     {
1136       rtx note;
1137       edge b = unchecked_make_edge (e->src, target, 0);
1138       bool redirected;
1139
1140       redirected = redirect_jump (BB_END (e->src), block_label (target), 0);
1141       gcc_assert (redirected);
1142
1143       note = find_reg_note (BB_END (e->src), REG_BR_PROB, NULL_RTX);
1144       if (note)
1145         {
1146           int prob = INTVAL (XEXP (note, 0));
1147
1148           b->probability = prob;
1149           b->count = e->count * prob / REG_BR_PROB_BASE;
1150           e->probability -= e->probability;
1151           e->count -= b->count;
1152           if (e->probability < 0)
1153             e->probability = 0;
1154           if (e->count < 0)
1155             e->count = 0;
1156         }
1157     }
1158
1159   if (e->flags & EDGE_ABNORMAL)
1160     {
1161       /* Irritating special case - fallthru edge to the same block as abnormal
1162          edge.
1163          We can't redirect abnormal edge, but we still can split the fallthru
1164          one and create separate abnormal edge to original destination.
1165          This allows bb-reorder to make such edge non-fallthru.  */
1166       gcc_assert (e->dest == target);
1167       abnormal_edge_flags = e->flags & ~(EDGE_FALLTHRU | EDGE_CAN_FALLTHRU);
1168       e->flags &= EDGE_FALLTHRU | EDGE_CAN_FALLTHRU;
1169     }
1170   else
1171     {
1172       gcc_assert (e->flags & EDGE_FALLTHRU);
1173       if (e->src == ENTRY_BLOCK_PTR)
1174         {
1175           /* We can't redirect the entry block.  Create an empty block
1176              at the start of the function which we use to add the new
1177              jump.  */
1178           edge tmp;
1179           edge_iterator ei;
1180           bool found = false;
1181
1182           basic_block bb = create_basic_block (BB_HEAD (e->dest), NULL, ENTRY_BLOCK_PTR);
1183
1184           /* Change the existing edge's source to be the new block, and add
1185              a new edge from the entry block to the new block.  */
1186           e->src = bb;
1187           for (ei = ei_start (ENTRY_BLOCK_PTR->succs); (tmp = ei_safe_edge (ei)); )
1188             {
1189               if (tmp == e)
1190                 {
1191                   VEC_unordered_remove (edge, ENTRY_BLOCK_PTR->succs, ei.index);
1192                   found = true;
1193                   break;
1194                 }
1195               else
1196                 ei_next (&ei);
1197             }
1198
1199           gcc_assert (found);
1200
1201           VEC_safe_push (edge, gc, bb->succs, e);
1202           make_single_succ_edge (ENTRY_BLOCK_PTR, bb, EDGE_FALLTHRU);
1203         }
1204     }
1205
1206   if (EDGE_COUNT (e->src->succs) >= 2 || abnormal_edge_flags)
1207     {
1208       /* Create the new structures.  */
1209
1210       /* If the old block ended with a tablejump, skip its table
1211          by searching forward from there.  Otherwise start searching
1212          forward from the last instruction of the old block.  */
1213       if (!tablejump_p (BB_END (e->src), NULL, &note))
1214         note = BB_END (e->src);
1215       note = NEXT_INSN (note);
1216
1217       jump_block = create_basic_block (note, NULL, e->src);
1218       jump_block->count = e->count;
1219       jump_block->frequency = EDGE_FREQUENCY (e);
1220       jump_block->loop_depth = target->loop_depth;
1221
1222       /* Make sure new block ends up in correct hot/cold section.  */
1223
1224       BB_COPY_PARTITION (jump_block, e->src);
1225       if (flag_reorder_blocks_and_partition
1226           && targetm.have_named_sections
1227           && JUMP_P (BB_END (jump_block))
1228           && !any_condjump_p (BB_END (jump_block))
1229           && (EDGE_SUCC (jump_block, 0)->flags & EDGE_CROSSING))
1230         add_reg_note (BB_END (jump_block), REG_CROSSING_JUMP, NULL_RTX);
1231
1232       /* Wire edge in.  */
1233       new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
1234       new_edge->probability = e->probability;
1235       new_edge->count = e->count;
1236
1237       /* Redirect old edge.  */
1238       redirect_edge_pred (e, jump_block);
1239       e->probability = REG_BR_PROB_BASE;
1240
1241       new_bb = jump_block;
1242     }
1243   else
1244     jump_block = e->src;
1245
1246   if (e->goto_locus && e->goto_block == NULL)
1247     loc = e->goto_locus;
1248   else
1249     loc = 0;
1250   e->flags &= ~EDGE_FALLTHRU;
1251   if (target == EXIT_BLOCK_PTR)
1252     {
1253 #ifdef HAVE_return
1254         emit_jump_insn_after_setloc (gen_return (), BB_END (jump_block), loc);
1255 #else
1256         gcc_unreachable ();
1257 #endif
1258     }
1259   else
1260     {
1261       rtx label = block_label (target);
1262       emit_jump_insn_after_setloc (gen_jump (label), BB_END (jump_block), loc);
1263       JUMP_LABEL (BB_END (jump_block)) = label;
1264       LABEL_NUSES (label)++;
1265     }
1266
1267   emit_barrier_after (BB_END (jump_block));
1268   redirect_edge_succ_nodup (e, target);
1269
1270   if (abnormal_edge_flags)
1271     make_edge (src, target, abnormal_edge_flags);
1272
1273   df_mark_solutions_dirty ();
1274   return new_bb;
1275 }
1276
1277 /* Edge E is assumed to be fallthru edge.  Emit needed jump instruction
1278    (and possibly create new basic block) to make edge non-fallthru.
1279    Return newly created BB or NULL if none.  */
1280
1281 basic_block
1282 force_nonfallthru (edge e)
1283 {
1284   return force_nonfallthru_and_redirect (e, e->dest);
1285 }
1286
1287 /* Redirect edge even at the expense of creating new jump insn or
1288    basic block.  Return new basic block if created, NULL otherwise.
1289    Conversion must be possible.  */
1290
1291 static basic_block
1292 rtl_redirect_edge_and_branch_force (edge e, basic_block target)
1293 {
1294   if (redirect_edge_and_branch (e, target)
1295       || e->dest == target)
1296     return NULL;
1297
1298   /* In case the edge redirection failed, try to force it to be non-fallthru
1299      and redirect newly created simplejump.  */
1300   df_set_bb_dirty (e->src);
1301   return force_nonfallthru_and_redirect (e, target);
1302 }
1303
1304 /* The given edge should potentially be a fallthru edge.  If that is in
1305    fact true, delete the jump and barriers that are in the way.  */
1306
1307 static void
1308 rtl_tidy_fallthru_edge (edge e)
1309 {
1310   rtx q;
1311   basic_block b = e->src, c = b->next_bb;
1312
1313   /* ??? In a late-running flow pass, other folks may have deleted basic
1314      blocks by nopping out blocks, leaving multiple BARRIERs between here
1315      and the target label. They ought to be chastised and fixed.
1316
1317      We can also wind up with a sequence of undeletable labels between
1318      one block and the next.
1319
1320      So search through a sequence of barriers, labels, and notes for
1321      the head of block C and assert that we really do fall through.  */
1322
1323   for (q = NEXT_INSN (BB_END (b)); q != BB_HEAD (c); q = NEXT_INSN (q))
1324     if (INSN_P (q))
1325       return;
1326
1327   /* Remove what will soon cease being the jump insn from the source block.
1328      If block B consisted only of this single jump, turn it into a deleted
1329      note.  */
1330   q = BB_END (b);
1331   if (JUMP_P (q)
1332       && onlyjump_p (q)
1333       && (any_uncondjump_p (q)
1334           || single_succ_p (b)))
1335     {
1336 #ifdef HAVE_cc0
1337       /* If this was a conditional jump, we need to also delete
1338          the insn that set cc0.  */
1339       if (any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1340         q = PREV_INSN (q);
1341 #endif
1342
1343       q = PREV_INSN (q);
1344     }
1345
1346   /* Selectively unlink the sequence.  */
1347   if (q != PREV_INSN (BB_HEAD (c)))
1348     delete_insn_chain (NEXT_INSN (q), PREV_INSN (BB_HEAD (c)), false);
1349
1350   e->flags |= EDGE_FALLTHRU;
1351 }
1352 \f
1353 /* Should move basic block BB after basic block AFTER.  NIY.  */
1354
1355 static bool
1356 rtl_move_block_after (basic_block bb ATTRIBUTE_UNUSED,
1357                       basic_block after ATTRIBUTE_UNUSED)
1358 {
1359   return false;
1360 }
1361
1362 /* Split a (typically critical) edge.  Return the new block.
1363    The edge must not be abnormal.
1364
1365    ??? The code generally expects to be called on critical edges.
1366    The case of a block ending in an unconditional jump to a
1367    block with multiple predecessors is not handled optimally.  */
1368
1369 static basic_block
1370 rtl_split_edge (edge edge_in)
1371 {
1372   basic_block bb;
1373   rtx before;
1374
1375   /* Abnormal edges cannot be split.  */
1376   gcc_assert (!(edge_in->flags & EDGE_ABNORMAL));
1377
1378   /* We are going to place the new block in front of edge destination.
1379      Avoid existence of fallthru predecessors.  */
1380   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1381     {
1382       edge e = find_fallthru_edge (edge_in->dest->preds);
1383
1384       if (e)
1385         force_nonfallthru (e);
1386     }
1387
1388   /* Create the basic block note.  */
1389   if (edge_in->dest != EXIT_BLOCK_PTR)
1390     before = BB_HEAD (edge_in->dest);
1391   else
1392     before = NULL_RTX;
1393
1394   /* If this is a fall through edge to the exit block, the blocks might be
1395      not adjacent, and the right place is the after the source.  */
1396   if (edge_in->flags & EDGE_FALLTHRU && edge_in->dest == EXIT_BLOCK_PTR)
1397     {
1398       before = NEXT_INSN (BB_END (edge_in->src));
1399       bb = create_basic_block (before, NULL, edge_in->src);
1400       BB_COPY_PARTITION (bb, edge_in->src);
1401     }
1402   else
1403     {
1404       bb = create_basic_block (before, NULL, edge_in->dest->prev_bb);
1405       /* ??? Why not edge_in->dest->prev_bb here?  */
1406       BB_COPY_PARTITION (bb, edge_in->dest);
1407     }
1408
1409   make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
1410
1411   /* For non-fallthru edges, we must adjust the predecessor's
1412      jump instruction to target our new block.  */
1413   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1414     {
1415       edge redirected = redirect_edge_and_branch (edge_in, bb);
1416       gcc_assert (redirected);
1417     }
1418   else
1419     {
1420       if (edge_in->src != ENTRY_BLOCK_PTR)
1421         {
1422           /* For asm goto even splitting of fallthru edge might
1423              need insn patching, as other labels might point to the
1424              old label.  */
1425           rtx last = BB_END (edge_in->src);
1426           if (last
1427               && JUMP_P (last)
1428               && edge_in->dest != EXIT_BLOCK_PTR
1429               && extract_asm_operands (PATTERN (last)) != NULL_RTX
1430               && patch_jump_insn (last, before, bb))
1431             df_set_bb_dirty (edge_in->src);
1432         }
1433       redirect_edge_succ (edge_in, bb);
1434     }
1435
1436   return bb;
1437 }
1438
1439 /* Queue instructions for insertion on an edge between two basic blocks.
1440    The new instructions and basic blocks (if any) will not appear in the
1441    CFG until commit_edge_insertions is called.  */
1442
1443 void
1444 insert_insn_on_edge (rtx pattern, edge e)
1445 {
1446   /* We cannot insert instructions on an abnormal critical edge.
1447      It will be easier to find the culprit if we die now.  */
1448   gcc_assert (!((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e)));
1449
1450   if (e->insns.r == NULL_RTX)
1451     start_sequence ();
1452   else
1453     push_to_sequence (e->insns.r);
1454
1455   emit_insn (pattern);
1456
1457   e->insns.r = get_insns ();
1458   end_sequence ();
1459 }
1460
1461 /* Update the CFG for the instructions queued on edge E.  */
1462
1463 void
1464 commit_one_edge_insertion (edge e)
1465 {
1466   rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1467   basic_block bb = NULL;
1468
1469   /* Pull the insns off the edge now since the edge might go away.  */
1470   insns = e->insns.r;
1471   e->insns.r = NULL_RTX;
1472
1473   if (!before && !after)
1474     {
1475       /* Figure out where to put these things.  If the destination has
1476          one predecessor, insert there.  Except for the exit block.  */
1477       if (single_pred_p (e->dest) && e->dest != EXIT_BLOCK_PTR)
1478         {
1479           bb = e->dest;
1480
1481           /* Get the location correct wrt a code label, and "nice" wrt
1482              a basic block note, and before everything else.  */
1483           tmp = BB_HEAD (bb);
1484           if (LABEL_P (tmp))
1485             tmp = NEXT_INSN (tmp);
1486           if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1487             tmp = NEXT_INSN (tmp);
1488           if (tmp == BB_HEAD (bb))
1489             before = tmp;
1490           else if (tmp)
1491             after = PREV_INSN (tmp);
1492           else
1493             after = get_last_insn ();
1494         }
1495
1496       /* If the source has one successor and the edge is not abnormal,
1497          insert there.  Except for the entry block.  */
1498       else if ((e->flags & EDGE_ABNORMAL) == 0
1499                && single_succ_p (e->src)
1500                && e->src != ENTRY_BLOCK_PTR)
1501         {
1502           bb = e->src;
1503
1504           /* It is possible to have a non-simple jump here.  Consider a target
1505              where some forms of unconditional jumps clobber a register.  This
1506              happens on the fr30 for example.
1507
1508              We know this block has a single successor, so we can just emit
1509              the queued insns before the jump.  */
1510           if (JUMP_P (BB_END (bb)))
1511             before = BB_END (bb);
1512           else
1513             {
1514               /* We'd better be fallthru, or we've lost track of
1515                  what's what.  */
1516               gcc_assert (e->flags & EDGE_FALLTHRU);
1517
1518               after = BB_END (bb);
1519             }
1520         }
1521       /* Otherwise we must split the edge.  */
1522       else
1523         {
1524           bb = split_edge (e);
1525           after = BB_END (bb);
1526
1527           if (flag_reorder_blocks_and_partition
1528               && targetm.have_named_sections
1529               && e->src != ENTRY_BLOCK_PTR
1530               && BB_PARTITION (e->src) == BB_COLD_PARTITION
1531               && !(e->flags & EDGE_CROSSING)
1532               && JUMP_P (after)
1533               && !any_condjump_p (after)
1534               && (single_succ_edge (bb)->flags & EDGE_CROSSING))
1535             add_reg_note (after, REG_CROSSING_JUMP, NULL_RTX);
1536         }
1537     }
1538
1539   /* Now that we've found the spot, do the insertion.  */
1540
1541   if (before)
1542     {
1543       emit_insn_before_noloc (insns, before, bb);
1544       last = prev_nonnote_insn (before);
1545     }
1546   else
1547     last = emit_insn_after_noloc (insns, after, bb);
1548
1549   if (returnjump_p (last))
1550     {
1551       /* ??? Remove all outgoing edges from BB and add one for EXIT.
1552          This is not currently a problem because this only happens
1553          for the (single) epilogue, which already has a fallthru edge
1554          to EXIT.  */
1555
1556       e = single_succ_edge (bb);
1557       gcc_assert (e->dest == EXIT_BLOCK_PTR
1558                   && single_succ_p (bb) && (e->flags & EDGE_FALLTHRU));
1559
1560       e->flags &= ~EDGE_FALLTHRU;
1561       emit_barrier_after (last);
1562
1563       if (before)
1564         delete_insn (before);
1565     }
1566   else
1567     gcc_assert (!JUMP_P (last));
1568
1569   /* Mark the basic block for find_many_sub_basic_blocks.  */
1570   if (current_ir_type () != IR_RTL_CFGLAYOUT)
1571     bb->aux = &bb->aux;
1572 }
1573
1574 /* Update the CFG for all queued instructions.  */
1575
1576 void
1577 commit_edge_insertions (void)
1578 {
1579   basic_block bb;
1580   sbitmap blocks;
1581   bool changed = false;
1582
1583 #ifdef ENABLE_CHECKING
1584   verify_flow_info ();
1585 #endif
1586
1587   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
1588     {
1589       edge e;
1590       edge_iterator ei;
1591
1592       FOR_EACH_EDGE (e, ei, bb->succs)
1593         if (e->insns.r)
1594           {
1595             changed = true;
1596             commit_one_edge_insertion (e);
1597           }
1598     }
1599
1600   if (!changed)
1601     return;
1602
1603   /* In the old rtl CFG API, it was OK to insert control flow on an
1604      edge, apparently?  In cfglayout mode, this will *not* work, and
1605      the caller is responsible for making sure that control flow is
1606      valid at all times.  */
1607   if (current_ir_type () == IR_RTL_CFGLAYOUT)
1608     return;
1609
1610   blocks = sbitmap_alloc (last_basic_block);
1611   sbitmap_zero (blocks);
1612   FOR_EACH_BB (bb)
1613     if (bb->aux)
1614       {
1615         SET_BIT (blocks, bb->index);
1616         /* Check for forgotten bb->aux values before commit_edge_insertions
1617            call.  */
1618         gcc_assert (bb->aux == &bb->aux);
1619         bb->aux = NULL;
1620       }
1621   find_many_sub_basic_blocks (blocks);
1622   sbitmap_free (blocks);
1623 }
1624 \f
1625
1626 /* Print out RTL-specific basic block information (live information
1627    at start and end).  */
1628
1629 static void
1630 rtl_dump_bb (basic_block bb, FILE *outf, int indent, int flags ATTRIBUTE_UNUSED)
1631 {
1632   rtx insn;
1633   rtx last;
1634   char *s_indent;
1635
1636   s_indent = (char *) alloca ((size_t) indent + 1);
1637   memset (s_indent, ' ', (size_t) indent);
1638   s_indent[indent] = '\0';
1639
1640   if (df)
1641     {
1642       df_dump_top (bb, outf);
1643       putc ('\n', outf);
1644     }
1645
1646   for (insn = BB_HEAD (bb), last = NEXT_INSN (BB_END (bb)); insn != last;
1647        insn = NEXT_INSN (insn))
1648     print_rtl_single (outf, insn);
1649
1650   if (df)
1651     {
1652       df_dump_bottom (bb, outf);
1653       putc ('\n', outf);
1654     }
1655
1656 }
1657 \f
1658 /* Like print_rtl, but also print out live information for the start of each
1659    basic block.  */
1660
1661 void
1662 print_rtl_with_bb (FILE *outf, const_rtx rtx_first)
1663 {
1664   const_rtx tmp_rtx;
1665   if (rtx_first == 0)
1666     fprintf (outf, "(nil)\n");
1667   else
1668     {
1669       enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
1670       int max_uid = get_max_uid ();
1671       basic_block *start = XCNEWVEC (basic_block, max_uid);
1672       basic_block *end = XCNEWVEC (basic_block, max_uid);
1673       enum bb_state *in_bb_p = XCNEWVEC (enum bb_state, max_uid);
1674
1675       basic_block bb;
1676
1677       if (df)
1678         df_dump_start (outf);
1679
1680       FOR_EACH_BB_REVERSE (bb)
1681         {
1682           rtx x;
1683
1684           start[INSN_UID (BB_HEAD (bb))] = bb;
1685           end[INSN_UID (BB_END (bb))] = bb;
1686           for (x = BB_HEAD (bb); x != NULL_RTX; x = NEXT_INSN (x))
1687             {
1688               enum bb_state state = IN_MULTIPLE_BB;
1689
1690               if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1691                 state = IN_ONE_BB;
1692               in_bb_p[INSN_UID (x)] = state;
1693
1694               if (x == BB_END (bb))
1695                 break;
1696             }
1697         }
1698
1699       for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1700         {
1701           int did_output;
1702           if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
1703             {
1704               edge e;
1705               edge_iterator ei;
1706
1707               fprintf (outf, ";; Start of basic block (");
1708               FOR_EACH_EDGE (e, ei, bb->preds)
1709                 fprintf (outf, " %d", e->src->index);
1710               fprintf (outf, ") -> %d\n", bb->index);
1711
1712               if (df)
1713                 {
1714                   df_dump_top (bb, outf);
1715                   putc ('\n', outf);
1716                 }
1717               FOR_EACH_EDGE (e, ei, bb->preds)
1718                 {
1719                   fputs (";; Pred edge ", outf);
1720                   dump_edge_info (outf, e, 0);
1721                   fputc ('\n', outf);
1722                 }
1723             }
1724
1725           if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1726               && !NOTE_P (tmp_rtx)
1727               && !BARRIER_P (tmp_rtx))
1728             fprintf (outf, ";; Insn is not within a basic block\n");
1729           else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1730             fprintf (outf, ";; Insn is in multiple basic blocks\n");
1731
1732           did_output = print_rtl_single (outf, tmp_rtx);
1733
1734           if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
1735             {
1736               edge e;
1737               edge_iterator ei;
1738
1739               fprintf (outf, ";; End of basic block %d -> (", bb->index);
1740               FOR_EACH_EDGE (e, ei, bb->succs)
1741                 fprintf (outf, " %d", e->dest->index);
1742               fprintf (outf, ")\n");
1743
1744               if (df)
1745                 {
1746                   df_dump_bottom (bb, outf);
1747                   putc ('\n', outf);
1748                 }
1749               putc ('\n', outf);
1750               FOR_EACH_EDGE (e, ei, bb->succs)
1751                 {
1752                   fputs (";; Succ edge ", outf);
1753                   dump_edge_info (outf, e, 1);
1754                   fputc ('\n', outf);
1755                 }
1756             }
1757           if (did_output)
1758             putc ('\n', outf);
1759         }
1760
1761       free (start);
1762       free (end);
1763       free (in_bb_p);
1764     }
1765
1766   if (crtl->epilogue_delay_list != 0)
1767     {
1768       fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1769       for (tmp_rtx = crtl->epilogue_delay_list; tmp_rtx != 0;
1770            tmp_rtx = XEXP (tmp_rtx, 1))
1771         print_rtl_single (outf, XEXP (tmp_rtx, 0));
1772     }
1773 }
1774 \f
1775 void
1776 update_br_prob_note (basic_block bb)
1777 {
1778   rtx note;
1779   if (!JUMP_P (BB_END (bb)))
1780     return;
1781   note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX);
1782   if (!note || INTVAL (XEXP (note, 0)) == BRANCH_EDGE (bb)->probability)
1783     return;
1784   XEXP (note, 0) = GEN_INT (BRANCH_EDGE (bb)->probability);
1785 }
1786
1787 /* Get the last insn associated with block BB (that includes barriers and
1788    tablejumps after BB).  */
1789 rtx
1790 get_last_bb_insn (basic_block bb)
1791 {
1792   rtx tmp;
1793   rtx end = BB_END (bb);
1794
1795   /* Include any jump table following the basic block.  */
1796   if (tablejump_p (end, NULL, &tmp))
1797     end = tmp;
1798
1799   /* Include any barriers that may follow the basic block.  */
1800   tmp = next_nonnote_insn_bb (end);
1801   while (tmp && BARRIER_P (tmp))
1802     {
1803       end = tmp;
1804       tmp = next_nonnote_insn_bb (end);
1805     }
1806
1807   return end;
1808 }
1809 \f
1810 /* Verify the CFG and RTL consistency common for both underlying RTL and
1811    cfglayout RTL.
1812
1813    Currently it does following checks:
1814
1815    - overlapping of basic blocks
1816    - insns with wrong BLOCK_FOR_INSN pointers
1817    - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
1818    - tails of basic blocks (ensure that boundary is necessary)
1819    - scans body of the basic block for JUMP_INSN, CODE_LABEL
1820      and NOTE_INSN_BASIC_BLOCK
1821    - verify that no fall_thru edge crosses hot/cold partition boundaries
1822    - verify that there are no pending RTL branch predictions
1823
1824    In future it can be extended check a lot of other stuff as well
1825    (reachability of basic blocks, life information, etc. etc.).  */
1826
1827 static int
1828 rtl_verify_flow_info_1 (void)
1829 {
1830   rtx x;
1831   int err = 0;
1832   basic_block bb;
1833
1834   /* Check the general integrity of the basic blocks.  */
1835   FOR_EACH_BB_REVERSE (bb)
1836     {
1837       rtx insn;
1838
1839       if (!(bb->flags & BB_RTL))
1840         {
1841           error ("BB_RTL flag not set for block %d", bb->index);
1842           err = 1;
1843         }
1844
1845       FOR_BB_INSNS (bb, insn)
1846         if (BLOCK_FOR_INSN (insn) != bb)
1847           {
1848             error ("insn %d basic block pointer is %d, should be %d",
1849                    INSN_UID (insn),
1850                    BLOCK_FOR_INSN (insn) ? BLOCK_FOR_INSN (insn)->index : 0,
1851                    bb->index);
1852             err = 1;
1853           }
1854
1855       for (insn = bb->il.rtl->header; insn; insn = NEXT_INSN (insn))
1856         if (!BARRIER_P (insn)
1857             && BLOCK_FOR_INSN (insn) != NULL)
1858           {
1859             error ("insn %d in header of bb %d has non-NULL basic block",
1860                    INSN_UID (insn), bb->index);
1861             err = 1;
1862           }
1863       for (insn = bb->il.rtl->footer; insn; insn = NEXT_INSN (insn))
1864         if (!BARRIER_P (insn)
1865             && BLOCK_FOR_INSN (insn) != NULL)
1866           {
1867             error ("insn %d in footer of bb %d has non-NULL basic block",
1868                    INSN_UID (insn), bb->index);
1869             err = 1;
1870           }
1871     }
1872
1873   /* Now check the basic blocks (boundaries etc.) */
1874   FOR_EACH_BB_REVERSE (bb)
1875     {
1876       int n_fallthru = 0, n_eh = 0, n_call = 0, n_abnormal = 0, n_branch = 0;
1877       edge e, fallthru = NULL;
1878       rtx note;
1879       edge_iterator ei;
1880
1881       if (JUMP_P (BB_END (bb))
1882           && (note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX))
1883           && EDGE_COUNT (bb->succs) >= 2
1884           && any_condjump_p (BB_END (bb)))
1885         {
1886           if (INTVAL (XEXP (note, 0)) != BRANCH_EDGE (bb)->probability
1887               && profile_status != PROFILE_ABSENT)
1888             {
1889               error ("verify_flow_info: REG_BR_PROB does not match cfg %wi %i",
1890                      INTVAL (XEXP (note, 0)), BRANCH_EDGE (bb)->probability);
1891               err = 1;
1892             }
1893         }
1894       FOR_EACH_EDGE (e, ei, bb->succs)
1895         {
1896           if (e->flags & EDGE_FALLTHRU)
1897             {
1898               n_fallthru++, fallthru = e;
1899               if ((e->flags & EDGE_CROSSING)
1900                   || (BB_PARTITION (e->src) != BB_PARTITION (e->dest)
1901                       && e->src != ENTRY_BLOCK_PTR
1902                       && e->dest != EXIT_BLOCK_PTR))
1903             {
1904                   error ("fallthru edge crosses section boundary (bb %i)",
1905                          e->src->index);
1906                   err = 1;
1907                 }
1908             }
1909
1910           if ((e->flags & ~(EDGE_DFS_BACK
1911                             | EDGE_CAN_FALLTHRU
1912                             | EDGE_IRREDUCIBLE_LOOP
1913                             | EDGE_LOOP_EXIT
1914                             | EDGE_CROSSING)) == 0)
1915             n_branch++;
1916
1917           if (e->flags & EDGE_ABNORMAL_CALL)
1918             n_call++;
1919
1920           if (e->flags & EDGE_EH)
1921             n_eh++;
1922           else if (e->flags & EDGE_ABNORMAL)
1923             n_abnormal++;
1924         }
1925
1926       if (n_eh && !find_reg_note (BB_END (bb), REG_EH_REGION, NULL_RTX))
1927         {
1928           error ("missing REG_EH_REGION note in the end of bb %i", bb->index);
1929           err = 1;
1930         }
1931       if (n_eh > 1)
1932         {
1933           error ("too many eh edges %i", bb->index);
1934           err = 1;
1935         }
1936       if (n_branch
1937           && (!JUMP_P (BB_END (bb))
1938               || (n_branch > 1 && (any_uncondjump_p (BB_END (bb))
1939                                    || any_condjump_p (BB_END (bb))))))
1940         {
1941           error ("too many outgoing branch edges from bb %i", bb->index);
1942           err = 1;
1943         }
1944       if (n_fallthru && any_uncondjump_p (BB_END (bb)))
1945         {
1946           error ("fallthru edge after unconditional jump %i", bb->index);
1947           err = 1;
1948         }
1949       if (n_branch != 1 && any_uncondjump_p (BB_END (bb)))
1950         {
1951           error ("wrong number of branch edges after unconditional jump %i",
1952                  bb->index);
1953           err = 1;
1954         }
1955       if (n_branch != 1 && any_condjump_p (BB_END (bb))
1956           && JUMP_LABEL (BB_END (bb)) != BB_HEAD (fallthru->dest))
1957         {
1958           error ("wrong amount of branch edges after conditional jump %i",
1959                  bb->index);
1960           err = 1;
1961         }
1962       if (n_call && !CALL_P (BB_END (bb)))
1963         {
1964           error ("call edges for non-call insn in bb %i", bb->index);
1965           err = 1;
1966         }
1967       if (n_abnormal
1968           && (!CALL_P (BB_END (bb)) && n_call != n_abnormal)
1969           && (!JUMP_P (BB_END (bb))
1970               || any_condjump_p (BB_END (bb))
1971               || any_uncondjump_p (BB_END (bb))))
1972         {
1973           error ("abnormal edges for no purpose in bb %i", bb->index);
1974           err = 1;
1975         }
1976
1977       for (x = BB_HEAD (bb); x != NEXT_INSN (BB_END (bb)); x = NEXT_INSN (x))
1978         /* We may have a barrier inside a basic block before dead code
1979            elimination.  There is no BLOCK_FOR_INSN field in a barrier.  */
1980         if (!BARRIER_P (x) && BLOCK_FOR_INSN (x) != bb)
1981           {
1982             debug_rtx (x);
1983             if (! BLOCK_FOR_INSN (x))
1984               error
1985                 ("insn %d inside basic block %d but block_for_insn is NULL",
1986                  INSN_UID (x), bb->index);
1987             else
1988               error
1989                 ("insn %d inside basic block %d but block_for_insn is %i",
1990                  INSN_UID (x), bb->index, BLOCK_FOR_INSN (x)->index);
1991
1992             err = 1;
1993           }
1994
1995       /* OK pointers are correct.  Now check the header of basic
1996          block.  It ought to contain optional CODE_LABEL followed
1997          by NOTE_BASIC_BLOCK.  */
1998       x = BB_HEAD (bb);
1999       if (LABEL_P (x))
2000         {
2001           if (BB_END (bb) == x)
2002             {
2003               error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2004                      bb->index);
2005               err = 1;
2006             }
2007
2008           x = NEXT_INSN (x);
2009         }
2010
2011       if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
2012         {
2013           error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2014                  bb->index);
2015           err = 1;
2016         }
2017
2018       if (BB_END (bb) == x)
2019         /* Do checks for empty blocks here.  */
2020         ;
2021       else
2022         for (x = NEXT_INSN (x); x; x = NEXT_INSN (x))
2023           {
2024             if (NOTE_INSN_BASIC_BLOCK_P (x))
2025               {
2026                 error ("NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d",
2027                        INSN_UID (x), bb->index);
2028                 err = 1;
2029               }
2030
2031             if (x == BB_END (bb))
2032               break;
2033
2034             if (control_flow_insn_p (x))
2035               {
2036                 error ("in basic block %d:", bb->index);
2037                 fatal_insn ("flow control insn inside a basic block", x);
2038               }
2039           }
2040     }
2041
2042   /* Clean up.  */
2043   return err;
2044 }
2045
2046 /* Verify the CFG and RTL consistency common for both underlying RTL and
2047    cfglayout RTL.
2048
2049    Currently it does following checks:
2050    - all checks of rtl_verify_flow_info_1
2051    - test head/end pointers
2052    - check that all insns are in the basic blocks
2053      (except the switch handling code, barriers and notes)
2054    - check that all returns are followed by barriers
2055    - check that all fallthru edge points to the adjacent blocks.  */
2056
2057 static int
2058 rtl_verify_flow_info (void)
2059 {
2060   basic_block bb;
2061   int err = rtl_verify_flow_info_1 ();
2062   rtx x;
2063   rtx last_head = get_last_insn ();
2064   basic_block *bb_info;
2065   int num_bb_notes;
2066   const rtx rtx_first = get_insns ();
2067   basic_block last_bb_seen = ENTRY_BLOCK_PTR, curr_bb = NULL;
2068   const int max_uid = get_max_uid ();
2069
2070   bb_info = XCNEWVEC (basic_block, max_uid);
2071
2072   FOR_EACH_BB_REVERSE (bb)
2073     {
2074       edge e;
2075       rtx head = BB_HEAD (bb);
2076       rtx end = BB_END (bb);
2077
2078       for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
2079         {
2080           /* Verify the end of the basic block is in the INSN chain.  */
2081           if (x == end)
2082             break;
2083
2084           /* And that the code outside of basic blocks has NULL bb field.  */
2085         if (!BARRIER_P (x)
2086             && BLOCK_FOR_INSN (x) != NULL)
2087           {
2088             error ("insn %d outside of basic blocks has non-NULL bb field",
2089                    INSN_UID (x));
2090             err = 1;
2091           }
2092         }
2093
2094       if (!x)
2095         {
2096           error ("end insn %d for block %d not found in the insn stream",
2097                  INSN_UID (end), bb->index);
2098           err = 1;
2099         }
2100
2101       /* Work backwards from the end to the head of the basic block
2102          to verify the head is in the RTL chain.  */
2103       for (; x != NULL_RTX; x = PREV_INSN (x))
2104         {
2105           /* While walking over the insn chain, verify insns appear
2106              in only one basic block.  */
2107           if (bb_info[INSN_UID (x)] != NULL)
2108             {
2109               error ("insn %d is in multiple basic blocks (%d and %d)",
2110                      INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
2111               err = 1;
2112             }
2113
2114           bb_info[INSN_UID (x)] = bb;
2115
2116           if (x == head)
2117             break;
2118         }
2119       if (!x)
2120         {
2121           error ("head insn %d for block %d not found in the insn stream",
2122                  INSN_UID (head), bb->index);
2123           err = 1;
2124         }
2125
2126       last_head = PREV_INSN (x);
2127
2128       e = find_fallthru_edge (bb->succs);
2129       if (!e)
2130         {
2131           rtx insn;
2132
2133           /* Ensure existence of barrier in BB with no fallthru edges.  */
2134           for (insn = NEXT_INSN (BB_END (bb)); ; insn = NEXT_INSN (insn))
2135             {
2136               if (!insn || NOTE_INSN_BASIC_BLOCK_P (insn))
2137                 {
2138                   error ("missing barrier after block %i", bb->index);
2139                   err = 1;
2140                   break;
2141                 }
2142               if (BARRIER_P (insn))
2143                 break;
2144             }
2145         }
2146       else if (e->src != ENTRY_BLOCK_PTR
2147                && e->dest != EXIT_BLOCK_PTR)
2148         {
2149           rtx insn;
2150
2151           if (e->src->next_bb != e->dest)
2152             {
2153               error
2154                 ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
2155                  e->src->index, e->dest->index);
2156               err = 1;
2157             }
2158           else
2159             for (insn = NEXT_INSN (BB_END (e->src)); insn != BB_HEAD (e->dest);
2160                  insn = NEXT_INSN (insn))
2161               if (BARRIER_P (insn) || INSN_P (insn))
2162                 {
2163                   error ("verify_flow_info: Incorrect fallthru %i->%i",
2164                          e->src->index, e->dest->index);
2165                   fatal_insn ("wrong insn in the fallthru edge", insn);
2166                   err = 1;
2167                 }
2168         }
2169     }
2170
2171   for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
2172     {
2173       /* Check that the code before the first basic block has NULL
2174          bb field.  */
2175       if (!BARRIER_P (x)
2176           && BLOCK_FOR_INSN (x) != NULL)
2177         {
2178           error ("insn %d outside of basic blocks has non-NULL bb field",
2179                  INSN_UID (x));
2180           err = 1;
2181         }
2182     }
2183   free (bb_info);
2184
2185   num_bb_notes = 0;
2186   last_bb_seen = ENTRY_BLOCK_PTR;
2187
2188   for (x = rtx_first; x; x = NEXT_INSN (x))
2189     {
2190       if (NOTE_INSN_BASIC_BLOCK_P (x))
2191         {
2192           bb = NOTE_BASIC_BLOCK (x);
2193
2194           num_bb_notes++;
2195           if (bb != last_bb_seen->next_bb)
2196             internal_error ("basic blocks not laid down consecutively");
2197
2198           curr_bb = last_bb_seen = bb;
2199         }
2200
2201       if (!curr_bb)
2202         {
2203           switch (GET_CODE (x))
2204             {
2205             case BARRIER:
2206             case NOTE:
2207               break;
2208
2209             case CODE_LABEL:
2210               /* An addr_vec is placed outside any basic block.  */
2211               if (NEXT_INSN (x)
2212                   && JUMP_TABLE_DATA_P (NEXT_INSN (x)))
2213                 x = NEXT_INSN (x);
2214
2215               /* But in any case, non-deletable labels can appear anywhere.  */
2216               break;
2217
2218             default:
2219               fatal_insn ("insn outside basic block", x);
2220             }
2221         }
2222
2223       if (JUMP_P (x)
2224           && returnjump_p (x) && ! condjump_p (x)
2225           && ! (next_nonnote_insn (x) && BARRIER_P (next_nonnote_insn (x))))
2226             fatal_insn ("return not followed by barrier", x);
2227       if (curr_bb && x == BB_END (curr_bb))
2228         curr_bb = NULL;
2229     }
2230
2231   if (num_bb_notes != n_basic_blocks - NUM_FIXED_BLOCKS)
2232     internal_error
2233       ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2234        num_bb_notes, n_basic_blocks);
2235
2236    return err;
2237 }
2238 \f
2239 /* Assume that the preceding pass has possibly eliminated jump instructions
2240    or converted the unconditional jumps.  Eliminate the edges from CFG.
2241    Return true if any edges are eliminated.  */
2242
2243 bool
2244 purge_dead_edges (basic_block bb)
2245 {
2246   edge e;
2247   rtx insn = BB_END (bb), note;
2248   bool purged = false;
2249   bool found;
2250   edge_iterator ei;
2251
2252   if (DEBUG_INSN_P (insn) && insn != BB_HEAD (bb))
2253     do
2254       insn = PREV_INSN (insn);
2255     while ((DEBUG_INSN_P (insn) || NOTE_P (insn)) && insn != BB_HEAD (bb));
2256
2257   /* If this instruction cannot trap, remove REG_EH_REGION notes.  */
2258   if (NONJUMP_INSN_P (insn)
2259       && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
2260     {
2261       rtx eqnote;
2262
2263       if (! may_trap_p (PATTERN (insn))
2264           || ((eqnote = find_reg_equal_equiv_note (insn))
2265               && ! may_trap_p (XEXP (eqnote, 0))))
2266         remove_note (insn, note);
2267     }
2268
2269   /* Cleanup abnormal edges caused by exceptions or non-local gotos.  */
2270   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2271     {
2272       bool remove = false;
2273
2274       /* There are three types of edges we need to handle correctly here: EH
2275          edges, abnormal call EH edges, and abnormal call non-EH edges.  The
2276          latter can appear when nonlocal gotos are used.  */
2277       if (e->flags & EDGE_ABNORMAL_CALL)
2278         {
2279           if (!CALL_P (insn))
2280             remove = true;
2281           else if (can_nonlocal_goto (insn))
2282             ;
2283           else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2284             ;
2285           else
2286             remove = true;
2287         }
2288       else if (e->flags & EDGE_EH)
2289         remove = !can_throw_internal (insn);
2290
2291       if (remove)
2292         {
2293           remove_edge (e);
2294           df_set_bb_dirty (bb);
2295           purged = true;
2296         }
2297       else
2298         ei_next (&ei);
2299     }
2300
2301   if (JUMP_P (insn))
2302     {
2303       rtx note;
2304       edge b,f;
2305       edge_iterator ei;
2306
2307       /* We do care only about conditional jumps and simplejumps.  */
2308       if (!any_condjump_p (insn)
2309           && !returnjump_p (insn)
2310           && !simplejump_p (insn))
2311         return purged;
2312
2313       /* Branch probability/prediction notes are defined only for
2314          condjumps.  We've possibly turned condjump into simplejump.  */
2315       if (simplejump_p (insn))
2316         {
2317           note = find_reg_note (insn, REG_BR_PROB, NULL);
2318           if (note)
2319             remove_note (insn, note);
2320           while ((note = find_reg_note (insn, REG_BR_PRED, NULL)))
2321             remove_note (insn, note);
2322         }
2323
2324       for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2325         {
2326           /* Avoid abnormal flags to leak from computed jumps turned
2327              into simplejumps.  */
2328
2329           e->flags &= ~EDGE_ABNORMAL;
2330
2331           /* See if this edge is one we should keep.  */
2332           if ((e->flags & EDGE_FALLTHRU) && any_condjump_p (insn))
2333             /* A conditional jump can fall through into the next
2334                block, so we should keep the edge.  */
2335             {
2336               ei_next (&ei);
2337               continue;
2338             }
2339           else if (e->dest != EXIT_BLOCK_PTR
2340                    && BB_HEAD (e->dest) == JUMP_LABEL (insn))
2341             /* If the destination block is the target of the jump,
2342                keep the edge.  */
2343             {
2344               ei_next (&ei);
2345               continue;
2346             }
2347           else if (e->dest == EXIT_BLOCK_PTR && returnjump_p (insn))
2348             /* If the destination block is the exit block, and this
2349                instruction is a return, then keep the edge.  */
2350             {
2351               ei_next (&ei);
2352               continue;
2353             }
2354           else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2355             /* Keep the edges that correspond to exceptions thrown by
2356                this instruction and rematerialize the EDGE_ABNORMAL
2357                flag we just cleared above.  */
2358             {
2359               e->flags |= EDGE_ABNORMAL;
2360               ei_next (&ei);
2361               continue;
2362             }
2363
2364           /* We do not need this edge.  */
2365           df_set_bb_dirty (bb);
2366           purged = true;
2367           remove_edge (e);
2368         }
2369
2370       if (EDGE_COUNT (bb->succs) == 0 || !purged)
2371         return purged;
2372
2373       if (dump_file)
2374         fprintf (dump_file, "Purged edges from bb %i\n", bb->index);
2375
2376       if (!optimize)
2377         return purged;
2378
2379       /* Redistribute probabilities.  */
2380       if (single_succ_p (bb))
2381         {
2382           single_succ_edge (bb)->probability = REG_BR_PROB_BASE;
2383           single_succ_edge (bb)->count = bb->count;
2384         }
2385       else
2386         {
2387           note = find_reg_note (insn, REG_BR_PROB, NULL);
2388           if (!note)
2389             return purged;
2390
2391           b = BRANCH_EDGE (bb);
2392           f = FALLTHRU_EDGE (bb);
2393           b->probability = INTVAL (XEXP (note, 0));
2394           f->probability = REG_BR_PROB_BASE - b->probability;
2395           b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2396           f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2397         }
2398
2399       return purged;
2400     }
2401   else if (CALL_P (insn) && SIBLING_CALL_P (insn))
2402     {
2403       /* First, there should not be any EH or ABCALL edges resulting
2404          from non-local gotos and the like.  If there were, we shouldn't
2405          have created the sibcall in the first place.  Second, there
2406          should of course never have been a fallthru edge.  */
2407       gcc_assert (single_succ_p (bb));
2408       gcc_assert (single_succ_edge (bb)->flags
2409                   == (EDGE_SIBCALL | EDGE_ABNORMAL));
2410
2411       return 0;
2412     }
2413
2414   /* If we don't see a jump insn, we don't know exactly why the block would
2415      have been broken at this point.  Look for a simple, non-fallthru edge,
2416      as these are only created by conditional branches.  If we find such an
2417      edge we know that there used to be a jump here and can then safely
2418      remove all non-fallthru edges.  */
2419   found = false;
2420   FOR_EACH_EDGE (e, ei, bb->succs)
2421     if (! (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU)))
2422       {
2423         found = true;
2424         break;
2425       }
2426
2427   if (!found)
2428     return purged;
2429
2430   /* Remove all but the fake and fallthru edges.  The fake edge may be
2431      the only successor for this block in the case of noreturn
2432      calls.  */
2433   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2434     {
2435       if (!(e->flags & (EDGE_FALLTHRU | EDGE_FAKE)))
2436         {
2437           df_set_bb_dirty (bb);
2438           remove_edge (e);
2439           purged = true;
2440         }
2441       else
2442         ei_next (&ei);
2443     }
2444
2445   gcc_assert (single_succ_p (bb));
2446
2447   single_succ_edge (bb)->probability = REG_BR_PROB_BASE;
2448   single_succ_edge (bb)->count = bb->count;
2449
2450   if (dump_file)
2451     fprintf (dump_file, "Purged non-fallthru edges from bb %i\n",
2452              bb->index);
2453   return purged;
2454 }
2455
2456 /* Search all basic blocks for potentially dead edges and purge them.  Return
2457    true if some edge has been eliminated.  */
2458
2459 bool
2460 purge_all_dead_edges (void)
2461 {
2462   int purged = false;
2463   basic_block bb;
2464
2465   FOR_EACH_BB (bb)
2466     {
2467       bool purged_here = purge_dead_edges (bb);
2468
2469       purged |= purged_here;
2470     }
2471
2472   return purged;
2473 }
2474
2475 /* Same as split_block but update cfg_layout structures.  */
2476
2477 static basic_block
2478 cfg_layout_split_block (basic_block bb, void *insnp)
2479 {
2480   rtx insn = (rtx) insnp;
2481   basic_block new_bb = rtl_split_block (bb, insn);
2482
2483   new_bb->il.rtl->footer = bb->il.rtl->footer;
2484   bb->il.rtl->footer = NULL;
2485
2486   return new_bb;
2487 }
2488
2489 /* Redirect Edge to DEST.  */
2490 static edge
2491 cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
2492 {
2493   basic_block src = e->src;
2494   edge ret;
2495
2496   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
2497     return NULL;
2498
2499   if (e->dest == dest)
2500     return e;
2501
2502   if (e->src != ENTRY_BLOCK_PTR
2503       && (ret = try_redirect_by_replacing_jump (e, dest, true)))
2504     {
2505       df_set_bb_dirty (src);
2506       return ret;
2507     }
2508
2509   if (e->src == ENTRY_BLOCK_PTR
2510       && (e->flags & EDGE_FALLTHRU) && !(e->flags & EDGE_COMPLEX))
2511     {
2512       if (dump_file)
2513         fprintf (dump_file, "Redirecting entry edge from bb %i to %i\n",
2514                  e->src->index, dest->index);
2515
2516       df_set_bb_dirty (e->src);
2517       redirect_edge_succ (e, dest);
2518       return e;
2519     }
2520
2521   /* Redirect_edge_and_branch may decide to turn branch into fallthru edge
2522      in the case the basic block appears to be in sequence.  Avoid this
2523      transformation.  */
2524
2525   if (e->flags & EDGE_FALLTHRU)
2526     {
2527       /* Redirect any branch edges unified with the fallthru one.  */
2528       if (JUMP_P (BB_END (src))
2529           && label_is_jump_target_p (BB_HEAD (e->dest),
2530                                      BB_END (src)))
2531         {
2532           edge redirected;
2533
2534           if (dump_file)
2535             fprintf (dump_file, "Fallthru edge unified with branch "
2536                      "%i->%i redirected to %i\n",
2537                      e->src->index, e->dest->index, dest->index);
2538           e->flags &= ~EDGE_FALLTHRU;
2539           redirected = redirect_branch_edge (e, dest);
2540           gcc_assert (redirected);
2541           e->flags |= EDGE_FALLTHRU;
2542           df_set_bb_dirty (e->src);
2543           return e;
2544         }
2545       /* In case we are redirecting fallthru edge to the branch edge
2546          of conditional jump, remove it.  */
2547       if (EDGE_COUNT (src->succs) == 2)
2548         {
2549           /* Find the edge that is different from E.  */
2550           edge s = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e);
2551
2552           if (s->dest == dest
2553               && any_condjump_p (BB_END (src))
2554               && onlyjump_p (BB_END (src)))
2555             delete_insn (BB_END (src));
2556         }
2557       ret = redirect_edge_succ_nodup (e, dest);
2558       if (dump_file)
2559         fprintf (dump_file, "Fallthru edge %i->%i redirected to %i\n",
2560                  e->src->index, e->dest->index, dest->index);
2561     }
2562   else
2563     ret = redirect_branch_edge (e, dest);
2564
2565   /* We don't want simplejumps in the insn stream during cfglayout.  */
2566   gcc_assert (!simplejump_p (BB_END (src)));
2567
2568   df_set_bb_dirty (src);
2569   return ret;
2570 }
2571
2572 /* Simple wrapper as we always can redirect fallthru edges.  */
2573 static basic_block
2574 cfg_layout_redirect_edge_and_branch_force (edge e, basic_block dest)
2575 {
2576   edge redirected = cfg_layout_redirect_edge_and_branch (e, dest);
2577
2578   gcc_assert (redirected);
2579   return NULL;
2580 }
2581
2582 /* Same as delete_basic_block but update cfg_layout structures.  */
2583
2584 static void
2585 cfg_layout_delete_block (basic_block bb)
2586 {
2587   rtx insn, next, prev = PREV_INSN (BB_HEAD (bb)), *to, remaints;
2588
2589   if (bb->il.rtl->header)
2590     {
2591       next = BB_HEAD (bb);
2592       if (prev)
2593         NEXT_INSN (prev) = bb->il.rtl->header;
2594       else
2595         set_first_insn (bb->il.rtl->header);
2596       PREV_INSN (bb->il.rtl->header) = prev;
2597       insn = bb->il.rtl->header;
2598       while (NEXT_INSN (insn))
2599         insn = NEXT_INSN (insn);
2600       NEXT_INSN (insn) = next;
2601       PREV_INSN (next) = insn;
2602     }
2603   next = NEXT_INSN (BB_END (bb));
2604   if (bb->il.rtl->footer)
2605     {
2606       insn = bb->il.rtl->footer;
2607       while (insn)
2608         {
2609           if (BARRIER_P (insn))
2610             {
2611               if (PREV_INSN (insn))
2612                 NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
2613               else
2614                 bb->il.rtl->footer = NEXT_INSN (insn);
2615               if (NEXT_INSN (insn))
2616                 PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
2617             }
2618           if (LABEL_P (insn))
2619             break;
2620           insn = NEXT_INSN (insn);
2621         }
2622       if (bb->il.rtl->footer)
2623         {
2624           insn = BB_END (bb);
2625           NEXT_INSN (insn) = bb->il.rtl->footer;
2626           PREV_INSN (bb->il.rtl->footer) = insn;
2627           while (NEXT_INSN (insn))
2628             insn = NEXT_INSN (insn);
2629           NEXT_INSN (insn) = next;
2630           if (next)
2631             PREV_INSN (next) = insn;
2632           else
2633             set_last_insn (insn);
2634         }
2635     }
2636   if (bb->next_bb != EXIT_BLOCK_PTR)
2637     to = &bb->next_bb->il.rtl->header;
2638   else
2639     to = &cfg_layout_function_footer;
2640
2641   rtl_delete_block (bb);
2642
2643   if (prev)
2644     prev = NEXT_INSN (prev);
2645   else
2646     prev = get_insns ();
2647   if (next)
2648     next = PREV_INSN (next);
2649   else
2650     next = get_last_insn ();
2651
2652   if (next && NEXT_INSN (next) != prev)
2653     {
2654       remaints = unlink_insn_chain (prev, next);
2655       insn = remaints;
2656       while (NEXT_INSN (insn))
2657         insn = NEXT_INSN (insn);
2658       NEXT_INSN (insn) = *to;
2659       if (*to)
2660         PREV_INSN (*to) = insn;
2661       *to = remaints;
2662     }
2663 }
2664
2665 /* Return true when blocks A and B can be safely merged.  */
2666
2667 static bool
2668 cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
2669 {
2670   /* If we are partitioning hot/cold basic blocks, we don't want to
2671      mess up unconditional or indirect jumps that cross between hot
2672      and cold sections.
2673
2674      Basic block partitioning may result in some jumps that appear to
2675      be optimizable (or blocks that appear to be mergeable), but which really
2676      must be left untouched (they are required to make it safely across
2677      partition boundaries).  See  the comments at the top of
2678      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
2679
2680   if (BB_PARTITION (a) != BB_PARTITION (b))
2681     return false;
2682
2683   /* There must be exactly one edge in between the blocks.  */
2684   return (single_succ_p (a)
2685           && single_succ (a) == b
2686           && single_pred_p (b) == 1
2687           && a != b
2688           /* Must be simple edge.  */
2689           && !(single_succ_edge (a)->flags & EDGE_COMPLEX)
2690           && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
2691           /* If the jump insn has side effects, we can't kill the edge.
2692              When not optimizing, try_redirect_by_replacing_jump will
2693              not allow us to redirect an edge by replacing a table jump.  */
2694           && (!JUMP_P (BB_END (a))
2695               || ((!optimize || reload_completed)
2696                   ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
2697 }
2698
2699 /* Merge block A and B.  The blocks must be mergeable.  */
2700
2701 static void
2702 cfg_layout_merge_blocks (basic_block a, basic_block b)
2703 {
2704   bool forwarder_p = (b->flags & BB_FORWARDER_BLOCK) != 0;
2705
2706   gcc_checking_assert (cfg_layout_can_merge_blocks_p (a, b));
2707
2708   if (dump_file)
2709     fprintf (dump_file, "Merging block %d into block %d...\n", b->index,
2710                          a->index);
2711
2712   /* If there was a CODE_LABEL beginning B, delete it.  */
2713   if (LABEL_P (BB_HEAD (b)))
2714     {
2715       delete_insn (BB_HEAD (b));
2716     }
2717
2718   /* We should have fallthru edge in a, or we can do dummy redirection to get
2719      it cleaned up.  */
2720   if (JUMP_P (BB_END (a)))
2721     try_redirect_by_replacing_jump (EDGE_SUCC (a, 0), b, true);
2722   gcc_assert (!JUMP_P (BB_END (a)));
2723
2724   /* When not optimizing and the edge is the only place in RTL which holds
2725      some unique locus, emit a nop with that locus in between.  */
2726   if (!optimize && EDGE_SUCC (a, 0)->goto_locus)
2727     {
2728       rtx insn = BB_END (a), end = PREV_INSN (BB_HEAD (a));
2729       int goto_locus = EDGE_SUCC (a, 0)->goto_locus;
2730
2731       while (insn != end && (!INSN_P (insn) || INSN_LOCATOR (insn) == 0))
2732         insn = PREV_INSN (insn);
2733       if (insn != end && locator_eq (INSN_LOCATOR (insn), goto_locus))
2734         goto_locus = 0;
2735       else
2736         {
2737           insn = BB_HEAD (b);
2738           end = NEXT_INSN (BB_END (b));
2739           while (insn != end && !INSN_P (insn))
2740             insn = NEXT_INSN (insn);
2741           if (insn != end && INSN_LOCATOR (insn) != 0
2742               && locator_eq (INSN_LOCATOR (insn), goto_locus))
2743             goto_locus = 0;
2744         }
2745       if (goto_locus)
2746         {
2747           BB_END (a) = emit_insn_after_noloc (gen_nop (), BB_END (a), a);
2748           INSN_LOCATOR (BB_END (a)) = goto_locus;
2749         }
2750     }
2751
2752   /* Possible line number notes should appear in between.  */
2753   if (b->il.rtl->header)
2754     {
2755       rtx first = BB_END (a), last;
2756
2757       last = emit_insn_after_noloc (b->il.rtl->header, BB_END (a), a);
2758       delete_insn_chain (NEXT_INSN (first), last, false);
2759       b->il.rtl->header = NULL;
2760     }
2761
2762   /* In the case basic blocks are not adjacent, move them around.  */
2763   if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
2764     {
2765       rtx first = unlink_insn_chain (BB_HEAD (b), BB_END (b));
2766
2767       emit_insn_after_noloc (first, BB_END (a), a);
2768       /* Skip possible DELETED_LABEL insn.  */
2769       if (!NOTE_INSN_BASIC_BLOCK_P (first))
2770         first = NEXT_INSN (first);
2771       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (first));
2772       BB_HEAD (b) = NULL;
2773
2774       /* emit_insn_after_noloc doesn't call df_insn_change_bb.
2775          We need to explicitly call. */
2776       update_bb_for_insn_chain (NEXT_INSN (first),
2777                                 BB_END (b),
2778                                 a);
2779
2780       delete_insn (first);
2781     }
2782   /* Otherwise just re-associate the instructions.  */
2783   else
2784     {
2785       rtx insn;
2786
2787       update_bb_for_insn_chain (BB_HEAD (b), BB_END (b), a);
2788
2789       insn = BB_HEAD (b);
2790       /* Skip possible DELETED_LABEL insn.  */
2791       if (!NOTE_INSN_BASIC_BLOCK_P (insn))
2792         insn = NEXT_INSN (insn);
2793       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
2794       BB_HEAD (b) = NULL;
2795       BB_END (a) = BB_END (b);
2796       delete_insn (insn);
2797     }
2798
2799   df_bb_delete (b->index);
2800
2801   /* Possible tablejumps and barriers should appear after the block.  */
2802   if (b->il.rtl->footer)
2803     {
2804       if (!a->il.rtl->footer)
2805         a->il.rtl->footer = b->il.rtl->footer;
2806       else
2807         {
2808           rtx last = a->il.rtl->footer;
2809
2810           while (NEXT_INSN (last))
2811             last = NEXT_INSN (last);
2812           NEXT_INSN (last) = b->il.rtl->footer;
2813           PREV_INSN (b->il.rtl->footer) = last;
2814         }
2815       b->il.rtl->footer = NULL;
2816     }
2817
2818   /* If B was a forwarder block, propagate the locus on the edge.  */
2819   if (forwarder_p && !EDGE_SUCC (b, 0)->goto_locus)
2820     EDGE_SUCC (b, 0)->goto_locus = EDGE_SUCC (a, 0)->goto_locus;
2821
2822   if (dump_file)
2823     fprintf (dump_file, "Merged blocks %d and %d.\n", a->index, b->index);
2824 }
2825
2826 /* Split edge E.  */
2827
2828 static basic_block
2829 cfg_layout_split_edge (edge e)
2830 {
2831   basic_block new_bb =
2832     create_basic_block (e->src != ENTRY_BLOCK_PTR
2833                         ? NEXT_INSN (BB_END (e->src)) : get_insns (),
2834                         NULL_RTX, e->src);
2835
2836   if (e->dest == EXIT_BLOCK_PTR)
2837     BB_COPY_PARTITION (new_bb, e->src);
2838   else
2839     BB_COPY_PARTITION (new_bb, e->dest);
2840   make_edge (new_bb, e->dest, EDGE_FALLTHRU);
2841   redirect_edge_and_branch_force (e, new_bb);
2842
2843   return new_bb;
2844 }
2845
2846 /* Do postprocessing after making a forwarder block joined by edge FALLTHRU.  */
2847
2848 static void
2849 rtl_make_forwarder_block (edge fallthru ATTRIBUTE_UNUSED)
2850 {
2851 }
2852
2853 /* Return 1 if BB ends with a call, possibly followed by some
2854    instructions that must stay with the call, 0 otherwise.  */
2855
2856 static bool
2857 rtl_block_ends_with_call_p (basic_block bb)
2858 {
2859   rtx insn = BB_END (bb);
2860
2861   while (!CALL_P (insn)
2862          && insn != BB_HEAD (bb)
2863          && (keep_with_call_p (insn)
2864              || NOTE_P (insn)
2865              || DEBUG_INSN_P (insn)))
2866     insn = PREV_INSN (insn);
2867   return (CALL_P (insn));
2868 }
2869
2870 /* Return 1 if BB ends with a conditional branch, 0 otherwise.  */
2871
2872 static bool
2873 rtl_block_ends_with_condjump_p (const_basic_block bb)
2874 {
2875   return any_condjump_p (BB_END (bb));
2876 }
2877
2878 /* Return true if we need to add fake edge to exit.
2879    Helper function for rtl_flow_call_edges_add.  */
2880
2881 static bool
2882 need_fake_edge_p (const_rtx insn)
2883 {
2884   if (!INSN_P (insn))
2885     return false;
2886
2887   if ((CALL_P (insn)
2888        && !SIBLING_CALL_P (insn)
2889        && !find_reg_note (insn, REG_NORETURN, NULL)
2890        && !(RTL_CONST_OR_PURE_CALL_P (insn))))
2891     return true;
2892
2893   return ((GET_CODE (PATTERN (insn)) == ASM_OPERANDS
2894            && MEM_VOLATILE_P (PATTERN (insn)))
2895           || (GET_CODE (PATTERN (insn)) == PARALLEL
2896               && asm_noperands (insn) != -1
2897               && MEM_VOLATILE_P (XVECEXP (PATTERN (insn), 0, 0)))
2898           || GET_CODE (PATTERN (insn)) == ASM_INPUT);
2899 }
2900
2901 /* Add fake edges to the function exit for any non constant and non noreturn
2902    calls, volatile inline assembly in the bitmap of blocks specified by
2903    BLOCKS or to the whole CFG if BLOCKS is zero.  Return the number of blocks
2904    that were split.
2905
2906    The goal is to expose cases in which entering a basic block does not imply
2907    that all subsequent instructions must be executed.  */
2908
2909 static int
2910 rtl_flow_call_edges_add (sbitmap blocks)
2911 {
2912   int i;
2913   int blocks_split = 0;
2914   int last_bb = last_basic_block;
2915   bool check_last_block = false;
2916
2917   if (n_basic_blocks == NUM_FIXED_BLOCKS)
2918     return 0;
2919
2920   if (! blocks)
2921     check_last_block = true;
2922   else
2923     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
2924
2925   /* In the last basic block, before epilogue generation, there will be
2926      a fallthru edge to EXIT.  Special care is required if the last insn
2927      of the last basic block is a call because make_edge folds duplicate
2928      edges, which would result in the fallthru edge also being marked
2929      fake, which would result in the fallthru edge being removed by
2930      remove_fake_edges, which would result in an invalid CFG.
2931
2932      Moreover, we can't elide the outgoing fake edge, since the block
2933      profiler needs to take this into account in order to solve the minimal
2934      spanning tree in the case that the call doesn't return.
2935
2936      Handle this by adding a dummy instruction in a new last basic block.  */
2937   if (check_last_block)
2938     {
2939       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
2940       rtx insn = BB_END (bb);
2941
2942       /* Back up past insns that must be kept in the same block as a call.  */
2943       while (insn != BB_HEAD (bb)
2944              && keep_with_call_p (insn))
2945         insn = PREV_INSN (insn);
2946
2947       if (need_fake_edge_p (insn))
2948         {
2949           edge e;
2950
2951           e = find_edge (bb, EXIT_BLOCK_PTR);
2952           if (e)
2953             {
2954               insert_insn_on_edge (gen_use (const0_rtx), e);
2955               commit_edge_insertions ();
2956             }
2957         }
2958     }
2959
2960   /* Now add fake edges to the function exit for any non constant
2961      calls since there is no way that we can determine if they will
2962      return or not...  */
2963
2964   for (i = NUM_FIXED_BLOCKS; i < last_bb; i++)
2965     {
2966       basic_block bb = BASIC_BLOCK (i);
2967       rtx insn;
2968       rtx prev_insn;
2969
2970       if (!bb)
2971         continue;
2972
2973       if (blocks && !TEST_BIT (blocks, i))
2974         continue;
2975
2976       for (insn = BB_END (bb); ; insn = prev_insn)
2977         {
2978           prev_insn = PREV_INSN (insn);
2979           if (need_fake_edge_p (insn))
2980             {
2981               edge e;
2982               rtx split_at_insn = insn;
2983
2984               /* Don't split the block between a call and an insn that should
2985                  remain in the same block as the call.  */
2986               if (CALL_P (insn))
2987                 while (split_at_insn != BB_END (bb)
2988                        && keep_with_call_p (NEXT_INSN (split_at_insn)))
2989                   split_at_insn = NEXT_INSN (split_at_insn);
2990
2991               /* The handling above of the final block before the epilogue
2992                  should be enough to verify that there is no edge to the exit
2993                  block in CFG already.  Calling make_edge in such case would
2994                  cause us to mark that edge as fake and remove it later.  */
2995
2996 #ifdef ENABLE_CHECKING
2997               if (split_at_insn == BB_END (bb))
2998                 {
2999                   e = find_edge (bb, EXIT_BLOCK_PTR);
3000                   gcc_assert (e == NULL);
3001                 }
3002 #endif
3003
3004               /* Note that the following may create a new basic block
3005                  and renumber the existing basic blocks.  */
3006               if (split_at_insn != BB_END (bb))
3007                 {
3008                   e = split_block (bb, split_at_insn);
3009                   if (e)
3010                     blocks_split++;
3011                 }
3012
3013               make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
3014             }
3015
3016           if (insn == BB_HEAD (bb))
3017             break;
3018         }
3019     }
3020
3021   if (blocks_split)
3022     verify_flow_info ();
3023
3024   return blocks_split;
3025 }
3026
3027 /* Add COMP_RTX as a condition at end of COND_BB.  FIRST_HEAD is
3028    the conditional branch target, SECOND_HEAD should be the fall-thru
3029    there is no need to handle this here the loop versioning code handles
3030    this.  the reason for SECON_HEAD is that it is needed for condition
3031    in trees, and this should be of the same type since it is a hook.  */
3032 static void
3033 rtl_lv_add_condition_to_bb (basic_block first_head ,
3034                             basic_block second_head ATTRIBUTE_UNUSED,
3035                             basic_block cond_bb, void *comp_rtx)
3036 {
3037   rtx label, seq, jump;
3038   rtx op0 = XEXP ((rtx)comp_rtx, 0);
3039   rtx op1 = XEXP ((rtx)comp_rtx, 1);
3040   enum rtx_code comp = GET_CODE ((rtx)comp_rtx);
3041   enum machine_mode mode;
3042
3043
3044   label = block_label (first_head);
3045   mode = GET_MODE (op0);
3046   if (mode == VOIDmode)
3047     mode = GET_MODE (op1);
3048
3049   start_sequence ();
3050   op0 = force_operand (op0, NULL_RTX);
3051   op1 = force_operand (op1, NULL_RTX);
3052   do_compare_rtx_and_jump (op0, op1, comp, 0,
3053                            mode, NULL_RTX, NULL_RTX, label, -1);
3054   jump = get_last_insn ();
3055   JUMP_LABEL (jump) = label;
3056   LABEL_NUSES (label)++;
3057   seq = get_insns ();
3058   end_sequence ();
3059
3060   /* Add the new cond , in the new head.  */
3061   emit_insn_after(seq, BB_END(cond_bb));
3062 }
3063
3064
3065 /* Given a block B with unconditional branch at its end, get the
3066    store the return the branch edge and the fall-thru edge in
3067    BRANCH_EDGE and FALLTHRU_EDGE respectively.  */
3068 static void
3069 rtl_extract_cond_bb_edges (basic_block b, edge *branch_edge,
3070                            edge *fallthru_edge)
3071 {
3072   edge e = EDGE_SUCC (b, 0);
3073
3074   if (e->flags & EDGE_FALLTHRU)
3075     {
3076       *fallthru_edge = e;
3077       *branch_edge = EDGE_SUCC (b, 1);
3078     }
3079   else
3080     {
3081       *branch_edge = e;
3082       *fallthru_edge = EDGE_SUCC (b, 1);
3083     }
3084 }
3085
3086 void
3087 init_rtl_bb_info (basic_block bb)
3088 {
3089   gcc_assert (!bb->il.rtl);
3090   bb->il.rtl = ggc_alloc_cleared_rtl_bb_info ();
3091 }
3092
3093 /* Returns true if it is possible to remove edge E by redirecting
3094    it to the destination of the other edge from E->src.  */
3095
3096 static bool
3097 rtl_can_remove_branch_p (const_edge e)
3098 {
3099   const_basic_block src = e->src;
3100   const_basic_block target = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e)->dest;
3101   const_rtx insn = BB_END (src), set;
3102
3103   /* The conditions are taken from try_redirect_by_replacing_jump.  */
3104   if (target == EXIT_BLOCK_PTR)
3105     return false;
3106
3107   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
3108     return false;
3109
3110   if (find_reg_note (insn, REG_CROSSING_JUMP, NULL_RTX)
3111       || BB_PARTITION (src) != BB_PARTITION (target))
3112     return false;
3113
3114   if (!onlyjump_p (insn)
3115       || tablejump_p (insn, NULL, NULL))
3116     return false;
3117
3118   set = single_set (insn);
3119   if (!set || side_effects_p (set))
3120     return false;
3121
3122   return true;
3123 }
3124
3125 /* Implementation of CFG manipulation for linearized RTL.  */
3126 struct cfg_hooks rtl_cfg_hooks = {
3127   "rtl",
3128   rtl_verify_flow_info,
3129   rtl_dump_bb,
3130   rtl_create_basic_block,
3131   rtl_redirect_edge_and_branch,
3132   rtl_redirect_edge_and_branch_force,
3133   rtl_can_remove_branch_p,
3134   rtl_delete_block,
3135   rtl_split_block,
3136   rtl_move_block_after,
3137   rtl_can_merge_blocks,  /* can_merge_blocks_p */
3138   rtl_merge_blocks,
3139   rtl_predict_edge,
3140   rtl_predicted_by_p,
3141   NULL, /* can_duplicate_block_p */
3142   NULL, /* duplicate_block */
3143   rtl_split_edge,
3144   rtl_make_forwarder_block,
3145   rtl_tidy_fallthru_edge,
3146   rtl_block_ends_with_call_p,
3147   rtl_block_ends_with_condjump_p,
3148   rtl_flow_call_edges_add,
3149   NULL, /* execute_on_growing_pred */
3150   NULL, /* execute_on_shrinking_pred */
3151   NULL, /* duplicate loop for trees */
3152   NULL, /* lv_add_condition_to_bb */
3153   NULL, /* lv_adjust_loop_header_phi*/
3154   NULL, /* extract_cond_bb_edges */
3155   NULL          /* flush_pending_stmts */
3156 };
3157
3158 /* Implementation of CFG manipulation for cfg layout RTL, where
3159    basic block connected via fallthru edges does not have to be adjacent.
3160    This representation will hopefully become the default one in future
3161    version of the compiler.  */
3162
3163 /* We do not want to declare these functions in a header file, since they
3164    should only be used through the cfghooks interface, and we do not want to
3165    move them here since it would require also moving quite a lot of related
3166    code.  They are in cfglayout.c.  */
3167 extern bool cfg_layout_can_duplicate_bb_p (const_basic_block);
3168 extern basic_block cfg_layout_duplicate_bb (basic_block);
3169
3170 struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
3171   "cfglayout mode",
3172   rtl_verify_flow_info_1,
3173   rtl_dump_bb,
3174   cfg_layout_create_basic_block,
3175   cfg_layout_redirect_edge_and_branch,
3176   cfg_layout_redirect_edge_and_branch_force,
3177   rtl_can_remove_branch_p,
3178   cfg_layout_delete_block,
3179   cfg_layout_split_block,
3180   rtl_move_block_after,
3181   cfg_layout_can_merge_blocks_p,
3182   cfg_layout_merge_blocks,
3183   rtl_predict_edge,
3184   rtl_predicted_by_p,
3185   cfg_layout_can_duplicate_bb_p,
3186   cfg_layout_duplicate_bb,
3187   cfg_layout_split_edge,
3188   rtl_make_forwarder_block,
3189   NULL,
3190   rtl_block_ends_with_call_p,
3191   rtl_block_ends_with_condjump_p,
3192   rtl_flow_call_edges_add,
3193   NULL, /* execute_on_growing_pred */
3194   NULL, /* execute_on_shrinking_pred */
3195   duplicate_loop_to_header_edge, /* duplicate loop for trees */
3196   rtl_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
3197   NULL, /* lv_adjust_loop_header_phi*/
3198   rtl_extract_cond_bb_edges, /* extract_cond_bb_edges */
3199   NULL          /* flush_pending_stmts */
3200 };