OSDN Git Service

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