OSDN Git Service

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