OSDN Git Service

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