OSDN Git Service

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