OSDN Git Service

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