OSDN Git Service

2005-06-15 Andrew Pinski <pinskia@physics.uc.edu>
[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       if (bb->predictions)
2140         {
2141           error ("bb prediction set for block %i, but it is not used in RTL land", bb->index);
2142           err = 1;
2143         }
2144
2145       FOR_EACH_EDGE (e, ei, bb->succs)
2146         if (e->flags & EDGE_FALLTHRU)
2147           break;
2148       if (!e)
2149         {
2150           rtx insn;
2151
2152           /* Ensure existence of barrier in BB with no fallthru edges.  */
2153           for (insn = BB_END (bb); !insn || !BARRIER_P (insn);
2154                insn = NEXT_INSN (insn))
2155             if (!insn
2156                 || (NOTE_P (insn)
2157                     && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK))
2158                 {
2159                   error ("missing barrier after block %i", bb->index);
2160                   err = 1;
2161                   break;
2162                 }
2163         }
2164       else if (e->src != ENTRY_BLOCK_PTR
2165                && e->dest != EXIT_BLOCK_PTR)
2166         {
2167           rtx insn;
2168
2169           if (e->src->next_bb != e->dest)
2170             {
2171               error
2172                 ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
2173                  e->src->index, e->dest->index);
2174               err = 1;
2175             }
2176           else
2177             for (insn = NEXT_INSN (BB_END (e->src)); insn != BB_HEAD (e->dest);
2178                  insn = NEXT_INSN (insn))
2179               if (BARRIER_P (insn) || INSN_P (insn))
2180                 {
2181                   error ("verify_flow_info: Incorrect fallthru %i->%i",
2182                          e->src->index, e->dest->index);
2183                   fatal_insn ("wrong insn in the fallthru edge", insn);
2184                   err = 1;
2185                 }
2186         }
2187     }
2188
2189   num_bb_notes = 0;
2190   last_bb_seen = ENTRY_BLOCK_PTR;
2191
2192   for (x = rtx_first; x; x = NEXT_INSN (x))
2193     {
2194       if (NOTE_INSN_BASIC_BLOCK_P (x))
2195         {
2196           bb = NOTE_BASIC_BLOCK (x);
2197
2198           num_bb_notes++;
2199           if (bb != last_bb_seen->next_bb)
2200             internal_error ("basic blocks not laid down consecutively");
2201
2202           curr_bb = last_bb_seen = bb;
2203         }
2204
2205       if (!curr_bb)
2206         {
2207           switch (GET_CODE (x))
2208             {
2209             case BARRIER:
2210             case NOTE:
2211               break;
2212
2213             case CODE_LABEL:
2214               /* An addr_vec is placed outside any basic block.  */
2215               if (NEXT_INSN (x)
2216                   && JUMP_P (NEXT_INSN (x))
2217                   && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
2218                       || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
2219                 x = NEXT_INSN (x);
2220
2221               /* But in any case, non-deletable labels can appear anywhere.  */
2222               break;
2223
2224             default:
2225               fatal_insn ("insn outside basic block", x);
2226             }
2227         }
2228
2229       if (JUMP_P (x)
2230           && returnjump_p (x) && ! condjump_p (x)
2231           && ! (NEXT_INSN (x) && BARRIER_P (NEXT_INSN (x))))
2232             fatal_insn ("return not followed by barrier", x);
2233       if (curr_bb && x == BB_END (curr_bb))
2234         curr_bb = NULL;
2235     }
2236
2237   if (num_bb_notes != n_basic_blocks)
2238     internal_error
2239       ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2240        num_bb_notes, n_basic_blocks);
2241
2242    return err;
2243 }
2244 \f
2245 /* Assume that the preceding pass has possibly eliminated jump instructions
2246    or converted the unconditional jumps.  Eliminate the edges from CFG.
2247    Return true if any edges are eliminated.  */
2248
2249 bool
2250 purge_dead_edges (basic_block bb)
2251 {
2252   edge e;
2253   rtx insn = BB_END (bb), note;
2254   bool purged = false;
2255   bool found;
2256   edge_iterator ei;
2257
2258   /* If this instruction cannot trap, remove REG_EH_REGION notes.  */
2259   if (NONJUMP_INSN_P (insn)
2260       && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
2261     {
2262       rtx eqnote;
2263
2264       if (! may_trap_p (PATTERN (insn))
2265           || ((eqnote = find_reg_equal_equiv_note (insn))
2266               && ! may_trap_p (XEXP (eqnote, 0))))
2267         remove_note (insn, note);
2268     }
2269
2270   /* Cleanup abnormal edges caused by exceptions or non-local gotos.  */
2271   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2272     {
2273       if (e->flags & EDGE_EH)
2274         {
2275           if (can_throw_internal (BB_END (bb)))
2276             {
2277               ei_next (&ei);
2278               continue;
2279             }
2280         }
2281       else if (e->flags & EDGE_ABNORMAL_CALL)
2282         {
2283           if (CALL_P (BB_END (bb))
2284               && (! (note = find_reg_note (insn, REG_EH_REGION, NULL))
2285                   || INTVAL (XEXP (note, 0)) >= 0))
2286             {
2287               ei_next (&ei);
2288               continue;
2289             }
2290         }
2291       else
2292         {
2293           ei_next (&ei);
2294           continue;
2295         }
2296
2297       remove_edge (e);
2298       bb->flags |= BB_DIRTY;
2299       purged = true;
2300     }
2301
2302   if (JUMP_P (insn))
2303     {
2304       rtx note;
2305       edge b,f;
2306       edge_iterator ei;
2307
2308       /* We do care only about conditional jumps and simplejumps.  */
2309       if (!any_condjump_p (insn)
2310           && !returnjump_p (insn)
2311           && !simplejump_p (insn))
2312         return purged;
2313
2314       /* Branch probability/prediction notes are defined only for
2315          condjumps.  We've possibly turned condjump into simplejump.  */
2316       if (simplejump_p (insn))
2317         {
2318           note = find_reg_note (insn, REG_BR_PROB, NULL);
2319           if (note)
2320             remove_note (insn, note);
2321           while ((note = find_reg_note (insn, REG_BR_PRED, NULL)))
2322             remove_note (insn, note);
2323         }
2324
2325       for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2326         {
2327           /* Avoid abnormal flags to leak from computed jumps turned
2328              into simplejumps.  */
2329
2330           e->flags &= ~EDGE_ABNORMAL;
2331
2332           /* See if this edge is one we should keep.  */
2333           if ((e->flags & EDGE_FALLTHRU) && any_condjump_p (insn))
2334             /* A conditional jump can fall through into the next
2335                block, so we should keep the edge.  */
2336             {
2337               ei_next (&ei);
2338               continue;
2339             }
2340           else if (e->dest != EXIT_BLOCK_PTR
2341                    && BB_HEAD (e->dest) == JUMP_LABEL (insn))
2342             /* If the destination block is the target of the jump,
2343                keep the edge.  */
2344             {
2345               ei_next (&ei);
2346               continue;
2347             }
2348           else if (e->dest == EXIT_BLOCK_PTR && returnjump_p (insn))
2349             /* If the destination block is the exit block, and this
2350                instruction is a return, then keep the edge.  */
2351             {
2352               ei_next (&ei);
2353               continue;
2354             }
2355           else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2356             /* Keep the edges that correspond to exceptions thrown by
2357                this instruction and rematerialize the EDGE_ABNORMAL
2358                flag we just cleared above.  */
2359             {
2360               e->flags |= EDGE_ABNORMAL;
2361               ei_next (&ei);
2362               continue;
2363             }
2364
2365           /* We do not need this edge.  */
2366           bb->flags |= BB_DIRTY;
2367           purged = true;
2368           remove_edge (e);
2369         }
2370
2371       if (EDGE_COUNT (bb->succs) == 0 || !purged)
2372         return purged;
2373
2374       if (dump_file)
2375         fprintf (dump_file, "Purged edges from bb %i\n", bb->index);
2376
2377       if (!optimize)
2378         return purged;
2379
2380       /* Redistribute probabilities.  */
2381       if (single_succ_p (bb))
2382         {
2383           single_succ_edge (bb)->probability = REG_BR_PROB_BASE;
2384           single_succ_edge (bb)->count = bb->count;
2385         }
2386       else
2387         {
2388           note = find_reg_note (insn, REG_BR_PROB, NULL);
2389           if (!note)
2390             return purged;
2391
2392           b = BRANCH_EDGE (bb);
2393           f = FALLTHRU_EDGE (bb);
2394           b->probability = INTVAL (XEXP (note, 0));
2395           f->probability = REG_BR_PROB_BASE - b->probability;
2396           b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2397           f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2398         }
2399
2400       return purged;
2401     }
2402   else if (CALL_P (insn) && SIBLING_CALL_P (insn))
2403     {
2404       /* First, there should not be any EH or ABCALL edges resulting
2405          from non-local gotos and the like.  If there were, we shouldn't
2406          have created the sibcall in the first place.  Second, there
2407          should of course never have been a fallthru edge.  */
2408       gcc_assert (single_succ_p (bb));
2409       gcc_assert (single_succ_edge (bb)->flags
2410                   == (EDGE_SIBCALL | EDGE_ABNORMAL));
2411
2412       return 0;
2413     }
2414
2415   /* If we don't see a jump insn, we don't know exactly why the block would
2416      have been broken at this point.  Look for a simple, non-fallthru edge,
2417      as these are only created by conditional branches.  If we find such an
2418      edge we know that there used to be a jump here and can then safely
2419      remove all non-fallthru edges.  */
2420   found = false;
2421   FOR_EACH_EDGE (e, ei, bb->succs)
2422     if (! (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU)))
2423       {
2424         found = true;
2425         break;
2426       }
2427
2428   if (!found)
2429     return purged;
2430
2431   /* Remove all but the fake and fallthru edges.  The fake edge may be
2432      the only successor for this block in the case of noreturn
2433      calls.  */
2434   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2435     {
2436       if (!(e->flags & (EDGE_FALLTHRU | EDGE_FAKE)))
2437         {
2438           bb->flags |= BB_DIRTY;
2439           remove_edge (e);
2440           purged = true;
2441         }
2442       else
2443         ei_next (&ei);
2444     }
2445
2446   gcc_assert (single_succ_p (bb));
2447
2448   single_succ_edge (bb)->probability = REG_BR_PROB_BASE;
2449   single_succ_edge (bb)->count = bb->count;
2450
2451   if (dump_file)
2452     fprintf (dump_file, "Purged non-fallthru edges from bb %i\n",
2453              bb->index);
2454   return purged;
2455 }
2456
2457 /* Search all basic blocks for potentially dead edges and purge them.  Return
2458    true if some edge has been eliminated.  */
2459
2460 bool
2461 purge_all_dead_edges (void)
2462 {
2463   int purged = false;
2464   basic_block bb;
2465
2466   FOR_EACH_BB (bb)
2467     {
2468       bool purged_here = purge_dead_edges (bb);
2469
2470       purged |= purged_here;
2471     }
2472
2473   return purged;
2474 }
2475
2476 /* Same as split_block but update cfg_layout structures.  */
2477
2478 static basic_block
2479 cfg_layout_split_block (basic_block bb, void *insnp)
2480 {
2481   rtx insn = insnp;
2482   basic_block new_bb = rtl_split_block (bb, insn);
2483
2484   new_bb->rbi->footer = bb->rbi->footer;
2485   bb->rbi->footer = NULL;
2486
2487   return new_bb;
2488 }
2489
2490
2491 /* Redirect Edge to DEST.  */
2492 static edge
2493 cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
2494 {
2495   basic_block src = e->src;
2496   edge ret;
2497
2498   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
2499     return NULL;
2500
2501   if (e->dest == dest)
2502     return e;
2503
2504   if (e->src != ENTRY_BLOCK_PTR
2505       && (ret = try_redirect_by_replacing_jump (e, dest, true)))
2506     {
2507       src->flags |= BB_DIRTY;
2508       return ret;
2509     }
2510
2511   if (e->src == ENTRY_BLOCK_PTR
2512       && (e->flags & EDGE_FALLTHRU) && !(e->flags & EDGE_COMPLEX))
2513     {
2514       if (dump_file)
2515         fprintf (dump_file, "Redirecting entry edge from bb %i to %i\n",
2516                  e->src->index, dest->index);
2517
2518       e->src->flags |= BB_DIRTY;
2519       redirect_edge_succ (e, dest);
2520       return e;
2521     }
2522
2523   /* Redirect_edge_and_branch may decide to turn branch into fallthru edge
2524      in the case the basic block appears to be in sequence.  Avoid this
2525      transformation.  */
2526
2527   if (e->flags & EDGE_FALLTHRU)
2528     {
2529       /* Redirect any branch edges unified with the fallthru one.  */
2530       if (JUMP_P (BB_END (src))
2531           && label_is_jump_target_p (BB_HEAD (e->dest),
2532                                      BB_END (src)))
2533         {
2534           edge redirected;
2535           
2536           if (dump_file)
2537             fprintf (dump_file, "Fallthru edge unified with branch "
2538                      "%i->%i redirected to %i\n",
2539                      e->src->index, e->dest->index, dest->index);
2540           e->flags &= ~EDGE_FALLTHRU;
2541           redirected = redirect_branch_edge (e, dest);
2542           gcc_assert (redirected);
2543           e->flags |= EDGE_FALLTHRU;
2544           e->src->flags |= BB_DIRTY;
2545           return e;
2546         }
2547       /* In case we are redirecting fallthru edge to the branch edge
2548          of conditional jump, remove it.  */
2549       if (EDGE_COUNT (src->succs) == 2)
2550         {
2551           /* Find the edge that is different from E.  */
2552           edge s = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e);
2553
2554           if (s->dest == dest
2555               && any_condjump_p (BB_END (src))
2556               && onlyjump_p (BB_END (src)))
2557             delete_insn (BB_END (src));
2558         }
2559       ret = redirect_edge_succ_nodup (e, dest);
2560       if (dump_file)
2561         fprintf (dump_file, "Fallthru edge %i->%i redirected to %i\n",
2562                  e->src->index, e->dest->index, dest->index);
2563     }
2564   else
2565     ret = redirect_branch_edge (e, dest);
2566
2567   /* We don't want simplejumps in the insn stream during cfglayout.  */
2568   gcc_assert (!simplejump_p (BB_END (src)));
2569
2570   src->flags |= BB_DIRTY;
2571   return ret;
2572 }
2573
2574 /* Simple wrapper as we always can redirect fallthru edges.  */
2575 static basic_block
2576 cfg_layout_redirect_edge_and_branch_force (edge e, basic_block dest)
2577 {
2578   edge redirected = cfg_layout_redirect_edge_and_branch (e, dest);
2579
2580   gcc_assert (redirected);
2581   return NULL;
2582 }
2583
2584 /* Same as delete_basic_block but update cfg_layout structures.  */
2585
2586 static void
2587 cfg_layout_delete_block (basic_block bb)
2588 {
2589   rtx insn, next, prev = PREV_INSN (BB_HEAD (bb)), *to, remaints;
2590
2591   if (bb->rbi->header)
2592     {
2593       next = BB_HEAD (bb);
2594       if (prev)
2595         NEXT_INSN (prev) = bb->rbi->header;
2596       else
2597         set_first_insn (bb->rbi->header);
2598       PREV_INSN (bb->rbi->header) = prev;
2599       insn = bb->rbi->header;
2600       while (NEXT_INSN (insn))
2601         insn = NEXT_INSN (insn);
2602       NEXT_INSN (insn) = next;
2603       PREV_INSN (next) = insn;
2604     }
2605   next = NEXT_INSN (BB_END (bb));
2606   if (bb->rbi->footer)
2607     {
2608       insn = bb->rbi->footer;
2609       while (insn)
2610         {
2611           if (BARRIER_P (insn))
2612             {
2613               if (PREV_INSN (insn))
2614                 NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
2615               else
2616                 bb->rbi->footer = NEXT_INSN (insn);
2617               if (NEXT_INSN (insn))
2618                 PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
2619             }
2620           if (LABEL_P (insn))
2621             break;
2622           insn = NEXT_INSN (insn);
2623         }
2624       if (bb->rbi->footer)
2625         {
2626           insn = BB_END (bb);
2627           NEXT_INSN (insn) = bb->rbi->footer;
2628           PREV_INSN (bb->rbi->footer) = insn;
2629           while (NEXT_INSN (insn))
2630             insn = NEXT_INSN (insn);
2631           NEXT_INSN (insn) = next;
2632           if (next)
2633             PREV_INSN (next) = insn;
2634           else
2635             set_last_insn (insn);
2636         }
2637     }
2638   if (bb->next_bb != EXIT_BLOCK_PTR)
2639     to = &bb->next_bb->rbi->header;
2640   else
2641     to = &cfg_layout_function_footer;
2642
2643   bb->rbi = NULL;
2644
2645   rtl_delete_block (bb);
2646
2647   if (prev)
2648     prev = NEXT_INSN (prev);
2649   else
2650     prev = get_insns ();
2651   if (next)
2652     next = PREV_INSN (next);
2653   else
2654     next = get_last_insn ();
2655
2656   if (next && NEXT_INSN (next) != prev)
2657     {
2658       remaints = unlink_insn_chain (prev, next);
2659       insn = remaints;
2660       while (NEXT_INSN (insn))
2661         insn = NEXT_INSN (insn);
2662       NEXT_INSN (insn) = *to;
2663       if (*to)
2664         PREV_INSN (*to) = insn;
2665       *to = remaints;
2666     }
2667 }
2668
2669 /* Return true when blocks A and B can be safely merged.  */
2670 static bool
2671 cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
2672 {
2673   /* If we are partitioning hot/cold basic blocks, we don't want to
2674      mess up unconditional or indirect jumps that cross between hot
2675      and cold sections.
2676
2677      Basic block partitioning may result in some jumps that appear to
2678      be optimizable (or blocks that appear to be mergeable), but which really 
2679      must be left untouched (they are required to make it safely across 
2680      partition boundaries).  See  the comments at the top of 
2681      bb-reorder.c:partition_hot_cold_basic_blocks for complete details.  */
2682
2683   if (BB_PARTITION (a) != BB_PARTITION (b))
2684     return false;
2685
2686   /* There must be exactly one edge in between the blocks.  */
2687   return (single_succ_p (a)
2688           && single_succ (a) == b
2689           && single_pred_p (b) == 1
2690           && a != b
2691           /* Must be simple edge.  */
2692           && !(single_succ_edge (a)->flags & EDGE_COMPLEX)
2693           && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
2694           /* If the jump insn has side effects,
2695              we can't kill the edge.  */
2696           && (!JUMP_P (BB_END (a))
2697               || (reload_completed
2698                   ? simplejump_p (BB_END (a)) : onlyjump_p (BB_END (a)))));
2699 }
2700
2701 /* Merge block A and B.  The blocks must be mergeable.  */
2702
2703 static void
2704 cfg_layout_merge_blocks (basic_block a, basic_block b)
2705 {
2706 #ifdef ENABLE_CHECKING
2707   gcc_assert (cfg_layout_can_merge_blocks_p (a, b));
2708 #endif
2709
2710   /* If there was a CODE_LABEL beginning B, delete it.  */
2711   if (LABEL_P (BB_HEAD (b)))
2712     delete_insn (BB_HEAD (b));
2713
2714   /* We should have fallthru edge in a, or we can do dummy redirection to get
2715      it cleaned up.  */
2716   if (JUMP_P (BB_END (a)))
2717     try_redirect_by_replacing_jump (EDGE_SUCC (a, 0), b, true);
2718   gcc_assert (!JUMP_P (BB_END (a)));
2719
2720   /* Possible line number notes should appear in between.  */
2721   if (b->rbi->header)
2722     {
2723       rtx first = BB_END (a), last;
2724
2725       last = emit_insn_after_noloc (b->rbi->header, BB_END (a));
2726       delete_insn_chain (NEXT_INSN (first), last);
2727       b->rbi->header = NULL;
2728     }
2729
2730   /* In the case basic blocks are not adjacent, move them around.  */
2731   if (NEXT_INSN (BB_END (a)) != BB_HEAD (b))
2732     {
2733       rtx first = unlink_insn_chain (BB_HEAD (b), BB_END (b));
2734
2735       emit_insn_after_noloc (first, BB_END (a));
2736       /* Skip possible DELETED_LABEL insn.  */
2737       if (!NOTE_INSN_BASIC_BLOCK_P (first))
2738         first = NEXT_INSN (first);
2739       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (first));
2740       BB_HEAD (b) = NULL;
2741       delete_insn (first);
2742     }
2743   /* Otherwise just re-associate the instructions.  */
2744   else
2745     {
2746       rtx insn;
2747
2748       for (insn = BB_HEAD (b);
2749            insn != NEXT_INSN (BB_END (b));
2750            insn = NEXT_INSN (insn))
2751         set_block_for_insn (insn, a);
2752       insn = BB_HEAD (b);
2753       /* Skip possible DELETED_LABEL insn.  */
2754       if (!NOTE_INSN_BASIC_BLOCK_P (insn))
2755         insn = NEXT_INSN (insn);
2756       gcc_assert (NOTE_INSN_BASIC_BLOCK_P (insn));
2757       BB_HEAD (b) = NULL;
2758       BB_END (a) = BB_END (b);
2759       delete_insn (insn);
2760     }
2761
2762   /* Possible tablejumps and barriers should appear after the block.  */
2763   if (b->rbi->footer)
2764     {
2765       if (!a->rbi->footer)
2766         a->rbi->footer = b->rbi->footer;
2767       else
2768         {
2769           rtx last = a->rbi->footer;
2770
2771           while (NEXT_INSN (last))
2772             last = NEXT_INSN (last);
2773           NEXT_INSN (last) = b->rbi->footer;
2774           PREV_INSN (b->rbi->footer) = last;
2775         }
2776       b->rbi->footer = NULL;
2777     }
2778
2779   if (dump_file)
2780     fprintf (dump_file, "Merged blocks %d and %d.\n",
2781              a->index, b->index);
2782 }
2783
2784 /* Split edge E.  */
2785
2786 static basic_block
2787 cfg_layout_split_edge (edge e)
2788 {
2789   basic_block new_bb =
2790     create_basic_block (e->src != ENTRY_BLOCK_PTR
2791                         ? NEXT_INSN (BB_END (e->src)) : get_insns (),
2792                         NULL_RTX, e->src);
2793
2794   /* ??? This info is likely going to be out of date very soon, but we must
2795      create it to avoid getting an ICE later.  */
2796   if (e->dest->global_live_at_start)
2797     {
2798       new_bb->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
2799       new_bb->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
2800       COPY_REG_SET (new_bb->global_live_at_start,
2801                     e->dest->global_live_at_start);
2802       COPY_REG_SET (new_bb->global_live_at_end,
2803                     e->dest->global_live_at_start);
2804     }
2805
2806   make_edge (new_bb, e->dest, EDGE_FALLTHRU);
2807   redirect_edge_and_branch_force (e, new_bb);
2808
2809   return new_bb;
2810 }
2811
2812 /* Do postprocessing after making a forwarder block joined by edge FALLTHRU.  */
2813
2814 static void
2815 rtl_make_forwarder_block (edge fallthru ATTRIBUTE_UNUSED)
2816 {
2817 }
2818
2819 /* Return 1 if BB ends with a call, possibly followed by some
2820    instructions that must stay with the call, 0 otherwise.  */
2821
2822 static bool
2823 rtl_block_ends_with_call_p (basic_block bb)
2824 {
2825   rtx insn = BB_END (bb);
2826
2827   while (!CALL_P (insn)
2828          && insn != BB_HEAD (bb)
2829          && keep_with_call_p (insn))
2830     insn = PREV_INSN (insn);
2831   return (CALL_P (insn));
2832 }
2833
2834 /* Return 1 if BB ends with a conditional branch, 0 otherwise.  */
2835
2836 static bool
2837 rtl_block_ends_with_condjump_p (basic_block bb)
2838 {
2839   return any_condjump_p (BB_END (bb));
2840 }
2841
2842 /* Return true if we need to add fake edge to exit.
2843    Helper function for rtl_flow_call_edges_add.  */
2844
2845 static bool
2846 need_fake_edge_p (rtx insn)
2847 {
2848   if (!INSN_P (insn))
2849     return false;
2850
2851   if ((CALL_P (insn)
2852        && !SIBLING_CALL_P (insn)
2853        && !find_reg_note (insn, REG_NORETURN, NULL)
2854        && !CONST_OR_PURE_CALL_P (insn)))
2855     return true;
2856
2857   return ((GET_CODE (PATTERN (insn)) == ASM_OPERANDS
2858            && MEM_VOLATILE_P (PATTERN (insn)))
2859           || (GET_CODE (PATTERN (insn)) == PARALLEL
2860               && asm_noperands (insn) != -1
2861               && MEM_VOLATILE_P (XVECEXP (PATTERN (insn), 0, 0)))
2862           || GET_CODE (PATTERN (insn)) == ASM_INPUT);
2863 }
2864
2865 /* Add fake edges to the function exit for any non constant and non noreturn
2866    calls, volatile inline assembly in the bitmap of blocks specified by
2867    BLOCKS or to the whole CFG if BLOCKS is zero.  Return the number of blocks
2868    that were split.
2869
2870    The goal is to expose cases in which entering a basic block does not imply
2871    that all subsequent instructions must be executed.  */
2872
2873 static int
2874 rtl_flow_call_edges_add (sbitmap blocks)
2875 {
2876   int i;
2877   int blocks_split = 0;
2878   int last_bb = last_basic_block;
2879   bool check_last_block = false;
2880
2881   if (n_basic_blocks == 0)
2882     return 0;
2883
2884   if (! blocks)
2885     check_last_block = true;
2886   else
2887     check_last_block = TEST_BIT (blocks, EXIT_BLOCK_PTR->prev_bb->index);
2888
2889   /* In the last basic block, before epilogue generation, there will be
2890      a fallthru edge to EXIT.  Special care is required if the last insn
2891      of the last basic block is a call because make_edge folds duplicate
2892      edges, which would result in the fallthru edge also being marked
2893      fake, which would result in the fallthru edge being removed by
2894      remove_fake_edges, which would result in an invalid CFG.
2895
2896      Moreover, we can't elide the outgoing fake edge, since the block
2897      profiler needs to take this into account in order to solve the minimal
2898      spanning tree in the case that the call doesn't return.
2899
2900      Handle this by adding a dummy instruction in a new last basic block.  */
2901   if (check_last_block)
2902     {
2903       basic_block bb = EXIT_BLOCK_PTR->prev_bb;
2904       rtx insn = BB_END (bb);
2905
2906       /* Back up past insns that must be kept in the same block as a call.  */
2907       while (insn != BB_HEAD (bb)
2908              && keep_with_call_p (insn))
2909         insn = PREV_INSN (insn);
2910
2911       if (need_fake_edge_p (insn))
2912         {
2913           edge e;
2914
2915           e = find_edge (bb, EXIT_BLOCK_PTR);
2916           if (e)
2917             {
2918               insert_insn_on_edge (gen_rtx_USE (VOIDmode, const0_rtx), e);
2919               commit_edge_insertions ();
2920             }
2921         }
2922     }
2923
2924   /* Now add fake edges to the function exit for any non constant
2925      calls since there is no way that we can determine if they will
2926      return or not...  */
2927
2928   for (i = 0; i < last_bb; i++)
2929     {
2930       basic_block bb = BASIC_BLOCK (i);
2931       rtx insn;
2932       rtx prev_insn;
2933
2934       if (!bb)
2935         continue;
2936
2937       if (blocks && !TEST_BIT (blocks, i))
2938         continue;
2939
2940       for (insn = BB_END (bb); ; insn = prev_insn)
2941         {
2942           prev_insn = PREV_INSN (insn);
2943           if (need_fake_edge_p (insn))
2944             {
2945               edge e;
2946               rtx split_at_insn = insn;
2947
2948               /* Don't split the block between a call and an insn that should
2949                  remain in the same block as the call.  */
2950               if (CALL_P (insn))
2951                 while (split_at_insn != BB_END (bb)
2952                        && keep_with_call_p (NEXT_INSN (split_at_insn)))
2953                   split_at_insn = NEXT_INSN (split_at_insn);
2954
2955               /* The handling above of the final block before the epilogue
2956                  should be enough to verify that there is no edge to the exit
2957                  block in CFG already.  Calling make_edge in such case would
2958                  cause us to mark that edge as fake and remove it later.  */
2959
2960 #ifdef ENABLE_CHECKING
2961               if (split_at_insn == BB_END (bb))
2962                 {
2963                   e = find_edge (bb, EXIT_BLOCK_PTR);
2964                   gcc_assert (e == NULL);
2965                 }
2966 #endif
2967
2968               /* Note that the following may create a new basic block
2969                  and renumber the existing basic blocks.  */
2970               if (split_at_insn != BB_END (bb))
2971                 {
2972                   e = split_block (bb, split_at_insn);
2973                   if (e)
2974                     blocks_split++;
2975                 }
2976
2977               make_edge (bb, EXIT_BLOCK_PTR, EDGE_FAKE);
2978             }
2979
2980           if (insn == BB_HEAD (bb))
2981             break;
2982         }
2983     }
2984
2985   if (blocks_split)
2986     verify_flow_info ();
2987
2988   return blocks_split;
2989 }
2990
2991 /* Add COMP_RTX as a condition at end of COND_BB.  FIRST_HEAD is
2992    the conditional branch target, SECOND_HEAD should be the fall-thru
2993    there is no need to handle this here the loop versioning code handles
2994    this.  the reason for SECON_HEAD is that it is needed for condition
2995    in trees, and this should be of the same type since it is a hook.  */
2996 static void
2997 rtl_lv_add_condition_to_bb (basic_block first_head ,
2998                             basic_block second_head ATTRIBUTE_UNUSED, 
2999                             basic_block cond_bb, void *comp_rtx)  
3000 {
3001   rtx label, seq, jump;
3002   rtx op0 = XEXP ((rtx)comp_rtx, 0);
3003   rtx op1 = XEXP ((rtx)comp_rtx, 1);
3004   enum rtx_code comp = GET_CODE ((rtx)comp_rtx);
3005   enum machine_mode mode;
3006
3007
3008   label = block_label (first_head);
3009   mode = GET_MODE (op0);
3010   if (mode == VOIDmode)
3011     mode = GET_MODE (op1);
3012
3013   start_sequence ();
3014   op0 = force_operand (op0, NULL_RTX);
3015   op1 = force_operand (op1, NULL_RTX);
3016   do_compare_rtx_and_jump (op0, op1, comp, 0,
3017                            mode, NULL_RTX, NULL_RTX, label);
3018   jump = get_last_insn ();
3019   JUMP_LABEL (jump) = label;
3020   LABEL_NUSES (label)++;
3021   seq = get_insns ();
3022   end_sequence ();
3023
3024   /* Add the new cond , in the new head.  */
3025   emit_insn_after(seq, BB_END(cond_bb));
3026 }
3027
3028
3029 /* Given a block B with unconditional branch at its end, get the
3030    store the return the branch edge and the fall-thru edge in
3031    BRANCH_EDGE and FALLTHRU_EDGE respectively.  */
3032 static void
3033 rtl_extract_cond_bb_edges (basic_block b, edge *branch_edge,
3034                            edge *fallthru_edge)
3035 {
3036   edge e = EDGE_SUCC (b, 0);
3037
3038   if (e->flags & EDGE_FALLTHRU)
3039     {
3040       *fallthru_edge = e;
3041       *branch_edge = EDGE_SUCC (b, 1);
3042     }
3043   else
3044     {
3045       *branch_edge = e;
3046       *fallthru_edge = EDGE_SUCC (b, 1);
3047     }
3048 }
3049
3050
3051 /* Implementation of CFG manipulation for linearized RTL.  */
3052 struct cfg_hooks rtl_cfg_hooks = {
3053   "rtl",
3054   rtl_verify_flow_info,
3055   rtl_dump_bb,
3056   rtl_create_basic_block,
3057   rtl_redirect_edge_and_branch,
3058   rtl_redirect_edge_and_branch_force,
3059   rtl_delete_block,
3060   rtl_split_block,
3061   rtl_move_block_after,
3062   rtl_can_merge_blocks,  /* can_merge_blocks_p */
3063   rtl_merge_blocks,
3064   rtl_predict_edge,
3065   rtl_predicted_by_p,
3066   NULL, /* can_duplicate_block_p */
3067   NULL, /* duplicate_block */
3068   rtl_split_edge,
3069   rtl_make_forwarder_block,
3070   rtl_tidy_fallthru_edge,
3071   rtl_block_ends_with_call_p,
3072   rtl_block_ends_with_condjump_p,
3073   rtl_flow_call_edges_add,
3074   NULL, /* execute_on_growing_pred */
3075   NULL, /* execute_on_shrinking_pred */
3076   NULL, /* duplicate loop for trees */
3077   NULL, /* lv_add_condition_to_bb */
3078   NULL, /* lv_adjust_loop_header_phi*/
3079   NULL, /* extract_cond_bb_edges */
3080   NULL          /* flush_pending_stmts */
3081 };
3082
3083 /* Implementation of CFG manipulation for cfg layout RTL, where
3084    basic block connected via fallthru edges does not have to be adjacent.
3085    This representation will hopefully become the default one in future
3086    version of the compiler.  */
3087
3088 /* We do not want to declare these functions in a header file, since they
3089    should only be used through the cfghooks interface, and we do not want to
3090    move them here since it would require also moving quite a lot of related
3091    code.  */
3092 extern bool cfg_layout_can_duplicate_bb_p (basic_block);
3093 extern basic_block cfg_layout_duplicate_bb (basic_block);
3094
3095 struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
3096   "cfglayout mode",
3097   rtl_verify_flow_info_1,
3098   rtl_dump_bb,
3099   cfg_layout_create_basic_block,
3100   cfg_layout_redirect_edge_and_branch,
3101   cfg_layout_redirect_edge_and_branch_force,
3102   cfg_layout_delete_block,
3103   cfg_layout_split_block,
3104   rtl_move_block_after,
3105   cfg_layout_can_merge_blocks_p,
3106   cfg_layout_merge_blocks,
3107   rtl_predict_edge,
3108   rtl_predicted_by_p,
3109   cfg_layout_can_duplicate_bb_p,
3110   cfg_layout_duplicate_bb,
3111   cfg_layout_split_edge,
3112   rtl_make_forwarder_block,
3113   NULL,
3114   rtl_block_ends_with_call_p,
3115   rtl_block_ends_with_condjump_p,
3116   rtl_flow_call_edges_add,
3117   NULL, /* execute_on_growing_pred */
3118   NULL, /* execute_on_shrinking_pred */
3119   duplicate_loop_to_header_edge, /* duplicate loop for trees */
3120   rtl_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
3121   NULL, /* lv_adjust_loop_header_phi*/
3122   rtl_extract_cond_bb_edges, /* extract_cond_bb_edges */
3123   NULL          /* flush_pending_stmts */  
3124 };
3125