OSDN Git Service

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