OSDN Git Service

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