OSDN Git Service

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