OSDN Git Service

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