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