OSDN Git Service

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