OSDN Git Service

* c-decl.c: Fix comment formatting.
[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       /* If the old block ended with a tablejump, skip its table
1040          by searching forward from there.  Otherwise start searching
1041          forward from the last instruction of the old block.  */
1042       if (!tablejump_p (e->src->end, NULL, &note))
1043         note = e->src->end;
1044
1045       /* Position the new block correctly relative to loop notes.  */
1046       note = last_loop_beg_note (note);
1047       note = NEXT_INSN (note);
1048
1049       jump_block = create_basic_block (note, NULL, e->src);
1050       jump_block->count = e->count;
1051       jump_block->frequency = EDGE_FREQUENCY (e);
1052       jump_block->loop_depth = target->loop_depth;
1053
1054       if (target->global_live_at_start)
1055         {
1056           jump_block->global_live_at_start
1057             = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1058           jump_block->global_live_at_end
1059             = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1060           COPY_REG_SET (jump_block->global_live_at_start,
1061                         target->global_live_at_start);
1062           COPY_REG_SET (jump_block->global_live_at_end,
1063                         target->global_live_at_start);
1064         }
1065
1066       /* Wire edge in.  */
1067       new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
1068       new_edge->probability = e->probability;
1069       new_edge->count = e->count;
1070
1071       /* Redirect old edge.  */
1072       redirect_edge_pred (e, jump_block);
1073       e->probability = REG_BR_PROB_BASE;
1074
1075       new_bb = jump_block;
1076     }
1077   else
1078     jump_block = e->src;
1079
1080   e->flags &= ~EDGE_FALLTHRU;
1081   if (target == EXIT_BLOCK_PTR)
1082     {
1083       if (HAVE_return)
1084         emit_jump_insn_after (gen_return (), jump_block->end);
1085       else
1086         abort ();
1087     }
1088   else
1089     {
1090       rtx label = block_label (target);
1091       emit_jump_insn_after (gen_jump (label), jump_block->end);
1092       JUMP_LABEL (jump_block->end) = label;
1093       LABEL_NUSES (label)++;
1094     }
1095
1096   emit_barrier_after (jump_block->end);
1097   redirect_edge_succ_nodup (e, target);
1098
1099   if (abnormal_edge_flags)
1100     make_edge (src, target, abnormal_edge_flags);
1101
1102   return new_bb;
1103 }
1104
1105 /* Edge E is assumed to be fallthru edge.  Emit needed jump instruction
1106    (and possibly create new basic block) to make edge non-fallthru.
1107    Return newly created BB or NULL if none.  */
1108
1109 basic_block
1110 force_nonfallthru (edge e)
1111 {
1112   return force_nonfallthru_and_redirect (e, e->dest);
1113 }
1114
1115 /* Redirect edge even at the expense of creating new jump insn or
1116    basic block.  Return new basic block if created, NULL otherwise.
1117    Abort if conversion is impossible.  */
1118
1119 static basic_block
1120 rtl_redirect_edge_and_branch_force (edge e, basic_block target)
1121 {
1122   if (redirect_edge_and_branch (e, target)
1123       || e->dest == target)
1124     return NULL;
1125
1126   /* In case the edge redirection failed, try to force it to be non-fallthru
1127      and redirect newly created simplejump.  */
1128   return force_nonfallthru_and_redirect (e, target);
1129 }
1130
1131 /* The given edge should potentially be a fallthru edge.  If that is in
1132    fact true, delete the jump and barriers that are in the way.  */
1133
1134 void
1135 tidy_fallthru_edge (edge e, basic_block b, basic_block c)
1136 {
1137   rtx q;
1138
1139   /* ??? In a late-running flow pass, other folks may have deleted basic
1140      blocks by nopping out blocks, leaving multiple BARRIERs between here
1141      and the target label. They ought to be chastized and fixed.
1142
1143      We can also wind up with a sequence of undeletable labels between
1144      one block and the next.
1145
1146      So search through a sequence of barriers, labels, and notes for
1147      the head of block C and assert that we really do fall through.  */
1148
1149   for (q = NEXT_INSN (b->end); q != c->head; q = NEXT_INSN (q))
1150     if (INSN_P (q))
1151       return;
1152
1153   /* Remove what will soon cease being the jump insn from the source block.
1154      If block B consisted only of this single jump, turn it into a deleted
1155      note.  */
1156   q = b->end;
1157   if (GET_CODE (q) == JUMP_INSN
1158       && onlyjump_p (q)
1159       && (any_uncondjump_p (q)
1160           || (b->succ == e && e->succ_next == NULL)))
1161     {
1162 #ifdef HAVE_cc0
1163       /* If this was a conditional jump, we need to also delete
1164          the insn that set cc0.  */
1165       if (any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1166         q = PREV_INSN (q);
1167 #endif
1168
1169       q = PREV_INSN (q);
1170
1171       /* We don't want a block to end on a line-number note since that has
1172          the potential of changing the code between -g and not -g.  */
1173       while (GET_CODE (q) == NOTE && NOTE_LINE_NUMBER (q) >= 0)
1174         q = PREV_INSN (q);
1175     }
1176
1177   /* Selectively unlink the sequence.  */
1178   if (q != PREV_INSN (c->head))
1179     delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
1180
1181   e->flags |= EDGE_FALLTHRU;
1182 }
1183
1184 /* Fix up edges that now fall through, or rather should now fall through
1185    but previously required a jump around now deleted blocks.  Simplify
1186    the search by only examining blocks numerically adjacent, since this
1187    is how find_basic_blocks created them.  */
1188
1189 void
1190 tidy_fallthru_edges (void)
1191 {
1192   basic_block b, c;
1193
1194   if (ENTRY_BLOCK_PTR->next_bb == EXIT_BLOCK_PTR)
1195     return;
1196
1197   FOR_BB_BETWEEN (b, ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR->prev_bb, next_bb)
1198     {
1199       edge s;
1200
1201       c = b->next_bb;
1202
1203       /* We care about simple conditional or unconditional jumps with
1204          a single successor.
1205
1206          If we had a conditional branch to the next instruction when
1207          find_basic_blocks was called, then there will only be one
1208          out edge for the block which ended with the conditional
1209          branch (since we do not create duplicate edges).
1210
1211          Furthermore, the edge will be marked as a fallthru because we
1212          merge the flags for the duplicate edges.  So we do not want to
1213          check that the edge is not a FALLTHRU edge.  */
1214
1215       if ((s = b->succ) != NULL
1216           && ! (s->flags & EDGE_COMPLEX)
1217           && s->succ_next == NULL
1218           && s->dest == c
1219           /* If the jump insn has side effects, we can't tidy the edge.  */
1220           && (GET_CODE (b->end) != JUMP_INSN
1221               || onlyjump_p (b->end)))
1222         tidy_fallthru_edge (s, b, c);
1223     }
1224 }
1225 \f
1226 /* Helper function for split_edge.  Return true in case edge BB2 to BB1
1227    is back edge of syntactic loop.  */
1228
1229 static bool
1230 back_edge_of_syntactic_loop_p (basic_block bb1, basic_block bb2)
1231 {
1232   rtx insn;
1233   int count = 0;
1234   basic_block bb;
1235
1236   if (bb1 == bb2)
1237     return true;
1238
1239   /* ??? Could we guarantee that bb indices are monotone, so that we could
1240      just compare them?  */
1241   for (bb = bb1; bb && bb != bb2; bb = bb->next_bb)
1242     continue;
1243
1244   if (!bb)
1245     return false;
1246
1247   for (insn = bb1->end; insn != bb2->head && count >= 0;
1248        insn = NEXT_INSN (insn))
1249     if (GET_CODE (insn) == NOTE)
1250       {
1251         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1252           count++;
1253         else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
1254           count--;
1255       }
1256
1257   return count >= 0;
1258 }
1259
1260 /* Split a (typically critical) edge.  Return the new block.
1261    Abort on abnormal edges.
1262
1263    ??? The code generally expects to be called on critical edges.
1264    The case of a block ending in an unconditional jump to a
1265    block with multiple predecessors is not handled optimally.  */
1266
1267 static basic_block
1268 rtl_split_edge (edge edge_in)
1269 {
1270   basic_block bb;
1271   rtx before;
1272
1273   /* Abnormal edges cannot be split.  */
1274   if ((edge_in->flags & EDGE_ABNORMAL) != 0)
1275     abort ();
1276
1277   /* We are going to place the new block in front of edge destination.
1278      Avoid existence of fallthru predecessors.  */
1279   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1280     {
1281       edge e;
1282
1283       for (e = edge_in->dest->pred; e; e = e->pred_next)
1284         if (e->flags & EDGE_FALLTHRU)
1285           break;
1286
1287       if (e)
1288         force_nonfallthru (e);
1289     }
1290
1291   /* Create the basic block note.
1292
1293      Where we place the note can have a noticeable impact on the generated
1294      code.  Consider this cfg:
1295
1296                         E
1297                         |
1298                         0
1299                        / \
1300                    +->1-->2--->E
1301                    |  |
1302                    +--+
1303
1304       If we need to insert an insn on the edge from block 0 to block 1,
1305       we want to ensure the instructions we insert are outside of any
1306       loop notes that physically sit between block 0 and block 1.  Otherwise
1307       we confuse the loop optimizer into thinking the loop is a phony.  */
1308
1309   if (edge_in->dest != EXIT_BLOCK_PTR
1310       && PREV_INSN (edge_in->dest->head)
1311       && GET_CODE (PREV_INSN (edge_in->dest->head)) == NOTE
1312       && (NOTE_LINE_NUMBER (PREV_INSN (edge_in->dest->head))
1313           == NOTE_INSN_LOOP_BEG)
1314       && !back_edge_of_syntactic_loop_p (edge_in->dest, edge_in->src))
1315     before = PREV_INSN (edge_in->dest->head);
1316   else if (edge_in->dest != EXIT_BLOCK_PTR)
1317     before = edge_in->dest->head;
1318   else
1319     before = NULL_RTX;
1320
1321   bb = create_basic_block (before, NULL, edge_in->dest->prev_bb);
1322   bb->count = edge_in->count;
1323   bb->frequency = EDGE_FREQUENCY (edge_in);
1324
1325   /* ??? This info is likely going to be out of date very soon.  */
1326   if (edge_in->dest->global_live_at_start)
1327     {
1328       bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1329       bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1330       COPY_REG_SET (bb->global_live_at_start,
1331                     edge_in->dest->global_live_at_start);
1332       COPY_REG_SET (bb->global_live_at_end,
1333                     edge_in->dest->global_live_at_start);
1334     }
1335
1336   make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
1337
1338   /* For non-fallthru edges, we must adjust the predecessor's
1339      jump instruction to target our new block.  */
1340   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1341     {
1342       if (!redirect_edge_and_branch (edge_in, bb))
1343         abort ();
1344     }
1345   else
1346     redirect_edge_succ (edge_in, bb);
1347
1348   return bb;
1349 }
1350
1351 /* Queue instructions for insertion on an edge between two basic blocks.
1352    The new instructions and basic blocks (if any) will not appear in the
1353    CFG until commit_edge_insertions is called.  */
1354
1355 void
1356 insert_insn_on_edge (rtx pattern, edge e)
1357 {
1358   /* We cannot insert instructions on an abnormal critical edge.
1359      It will be easier to find the culprit if we die now.  */
1360   if ((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
1361     abort ();
1362
1363   if (e->insns == NULL_RTX)
1364     start_sequence ();
1365   else
1366     push_to_sequence (e->insns);
1367
1368   emit_insn (pattern);
1369
1370   e->insns = get_insns ();
1371   end_sequence ();
1372 }
1373
1374 /* Called from safe_insert_insn_on_edge through note_stores, marks live
1375    registers that are killed by the store.  */
1376 static void
1377 mark_killed_regs (rtx reg, rtx set ATTRIBUTE_UNUSED, void *data)
1378 {
1379   regset killed = data;
1380   int regno, i;
1381
1382   if (GET_CODE (reg) == SUBREG)
1383     reg = SUBREG_REG (reg);
1384   if (!REG_P (reg))
1385     return;
1386   regno = REGNO (reg);
1387   if (regno >= FIRST_PSEUDO_REGISTER)
1388     SET_REGNO_REG_SET (killed, regno);
1389   else
1390     {
1391       for (i = 0; i < (int) HARD_REGNO_NREGS (regno, GET_MODE (reg)); i++)
1392         SET_REGNO_REG_SET (killed, regno + i);
1393     }
1394 }
1395
1396 /* Similar to insert_insn_on_edge, tries to put INSN to edge E.  Additionally
1397    it checks whether this will not clobber the registers that are live on the
1398    edge (i.e. it requires liveness information to be up-to-date) and if there
1399    are some, then it tries to save and restore them.  Returns true if
1400    successful.  */
1401 bool
1402 safe_insert_insn_on_edge (rtx insn, edge e)
1403 {
1404   rtx x;
1405   regset_head killed_head;
1406   regset killed = INITIALIZE_REG_SET (killed_head);
1407   rtx save_regs = NULL_RTX;
1408   int regno, noccmode;
1409   enum machine_mode mode;
1410
1411 #ifdef AVOID_CCMODE_COPIES
1412   noccmode = true;
1413 #else
1414   noccmode = false;
1415 #endif
1416
1417   for (x = insn; x; x = NEXT_INSN (x))
1418     if (INSN_P (x))
1419       note_stores (PATTERN (x), mark_killed_regs, killed);
1420   bitmap_operation (killed, killed, e->dest->global_live_at_start,
1421                     BITMAP_AND);
1422
1423   EXECUTE_IF_SET_IN_REG_SET (killed, 0, regno,
1424     {
1425       mode = regno < FIRST_PSEUDO_REGISTER
1426               ? reg_raw_mode[regno]
1427               : GET_MODE (regno_reg_rtx[regno]);
1428       if (mode == VOIDmode)
1429         return false;
1430
1431       if (noccmode && mode == CCmode)
1432         return false;
1433         
1434       save_regs = alloc_EXPR_LIST (0,
1435                                    alloc_EXPR_LIST (0,
1436                                                     gen_reg_rtx (mode),
1437                                                     gen_raw_REG (mode, regno)),
1438                                    save_regs);
1439     });
1440
1441   if (save_regs)
1442     {
1443       rtx from, to;
1444
1445       start_sequence ();
1446       for (x = save_regs; x; x = XEXP (x, 1))
1447         {
1448           from = XEXP (XEXP (x, 0), 1);
1449           to = XEXP (XEXP (x, 0), 0);
1450           emit_move_insn (to, from);
1451         }
1452       emit_insn (insn);
1453       for (x = save_regs; x; x = XEXP (x, 1))
1454         {
1455           from = XEXP (XEXP (x, 0), 0);
1456           to = XEXP (XEXP (x, 0), 1);
1457           emit_move_insn (to, from);
1458         }
1459       insn = get_insns ();
1460       end_sequence ();
1461       free_EXPR_LIST_list (&save_regs);
1462     }
1463   insert_insn_on_edge (insn, e);
1464   
1465   FREE_REG_SET (killed);
1466   return true;
1467 }
1468
1469 /* Update the CFG for the instructions queued on edge E.  */
1470
1471 static void
1472 commit_one_edge_insertion (edge e, int watch_calls)
1473 {
1474   rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1475   basic_block bb = NULL;
1476
1477   /* Pull the insns off the edge now since the edge might go away.  */
1478   insns = e->insns;
1479   e->insns = NULL_RTX;
1480
1481   /* Special case -- avoid inserting code between call and storing
1482      its return value.  */
1483   if (watch_calls && (e->flags & EDGE_FALLTHRU) && !e->dest->pred->pred_next
1484       && e->src != ENTRY_BLOCK_PTR
1485       && GET_CODE (e->src->end) == CALL_INSN)
1486     {
1487       rtx next = next_nonnote_insn (e->src->end);
1488
1489       after = e->dest->head;
1490       /* The first insn after the call may be a stack pop, skip it.  */
1491       while (next
1492              && keep_with_call_p (next))
1493         {
1494           after = next;
1495           next = next_nonnote_insn (next);
1496         }
1497       bb = e->dest;
1498     }
1499   if (!before && !after)
1500     {
1501       /* Figure out where to put these things.  If the destination has
1502          one predecessor, insert there.  Except for the exit block.  */
1503       if (e->dest->pred->pred_next == NULL && e->dest != EXIT_BLOCK_PTR)
1504         {
1505           bb = e->dest;
1506
1507           /* Get the location correct wrt a code label, and "nice" wrt
1508              a basic block note, and before everything else.  */
1509           tmp = bb->head;
1510           if (GET_CODE (tmp) == CODE_LABEL)
1511             tmp = NEXT_INSN (tmp);
1512           if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1513             tmp = NEXT_INSN (tmp);
1514           if (tmp == bb->head)
1515             before = tmp;
1516           else if (tmp)
1517             after = PREV_INSN (tmp);
1518           else
1519             after = get_last_insn ();
1520         }
1521
1522       /* If the source has one successor and the edge is not abnormal,
1523          insert there.  Except for the entry block.  */
1524       else if ((e->flags & EDGE_ABNORMAL) == 0
1525                && e->src->succ->succ_next == NULL
1526                && e->src != ENTRY_BLOCK_PTR)
1527         {
1528           bb = e->src;
1529
1530           /* It is possible to have a non-simple jump here.  Consider a target
1531              where some forms of unconditional jumps clobber a register.  This
1532              happens on the fr30 for example.
1533
1534              We know this block has a single successor, so we can just emit
1535              the queued insns before the jump.  */
1536           if (GET_CODE (bb->end) == JUMP_INSN)
1537             for (before = bb->end;
1538                  GET_CODE (PREV_INSN (before)) == NOTE
1539                  && NOTE_LINE_NUMBER (PREV_INSN (before)) ==
1540                  NOTE_INSN_LOOP_BEG; before = PREV_INSN (before))
1541               ;
1542           else
1543             {
1544               /* We'd better be fallthru, or we've lost track of what's what.  */
1545               if ((e->flags & EDGE_FALLTHRU) == 0)
1546                 abort ();
1547
1548               after = bb->end;
1549             }
1550         }
1551       /* Otherwise we must split the edge.  */
1552       else
1553         {
1554           bb = split_edge (e);
1555           after = bb->end;
1556         }
1557     }
1558
1559   /* Now that we've found the spot, do the insertion.  */
1560
1561   if (before)
1562     {
1563       emit_insn_before (insns, before);
1564       last = prev_nonnote_insn (before);
1565     }
1566   else
1567     last = emit_insn_after (insns, after);
1568
1569   if (returnjump_p (last))
1570     {
1571       /* ??? Remove all outgoing edges from BB and add one for EXIT.
1572          This is not currently a problem because this only happens
1573          for the (single) epilogue, which already has a fallthru edge
1574          to EXIT.  */
1575
1576       e = bb->succ;
1577       if (e->dest != EXIT_BLOCK_PTR
1578           || e->succ_next != NULL || (e->flags & EDGE_FALLTHRU) == 0)
1579         abort ();
1580
1581       e->flags &= ~EDGE_FALLTHRU;
1582       emit_barrier_after (last);
1583
1584       if (before)
1585         delete_insn (before);
1586     }
1587   else if (GET_CODE (last) == JUMP_INSN)
1588     abort ();
1589
1590   /* Mark the basic block for find_sub_basic_blocks.  */
1591   bb->aux = &bb->aux;
1592 }
1593
1594 /* Update the CFG for all queued instructions.  */
1595
1596 void
1597 commit_edge_insertions (void)
1598 {
1599   basic_block bb;
1600   sbitmap blocks;
1601   bool changed = false;
1602
1603 #ifdef ENABLE_CHECKING
1604   verify_flow_info ();
1605 #endif
1606
1607   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
1608     {
1609       edge e, next;
1610
1611       for (e = bb->succ; e; e = next)
1612         {
1613           next = e->succ_next;
1614           if (e->insns)
1615             {
1616                changed = true;
1617                commit_one_edge_insertion (e, false);
1618             }
1619         }
1620     }
1621
1622   if (!changed)
1623     return;
1624
1625   blocks = sbitmap_alloc (last_basic_block);
1626   sbitmap_zero (blocks);
1627   FOR_EACH_BB (bb)
1628     if (bb->aux)
1629       {
1630         SET_BIT (blocks, bb->index);
1631         /* Check for forgotten bb->aux values before commit_edge_insertions
1632            call.  */
1633         if (bb->aux != &bb->aux)
1634           abort ();
1635         bb->aux = NULL;
1636       }
1637   find_many_sub_basic_blocks (blocks);
1638   sbitmap_free (blocks);
1639 }
1640 \f
1641 /* Update the CFG for all queued instructions, taking special care of inserting
1642    code on edges between call and storing its return value.  */
1643
1644 void
1645 commit_edge_insertions_watch_calls (void)
1646 {
1647   basic_block bb;
1648   sbitmap blocks;
1649   bool changed = false;
1650
1651 #ifdef ENABLE_CHECKING
1652   verify_flow_info ();
1653 #endif
1654
1655   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
1656     {
1657       edge e, next;
1658
1659       for (e = bb->succ; e; e = next)
1660         {
1661           next = e->succ_next;
1662           if (e->insns)
1663             {
1664               changed = true;
1665               commit_one_edge_insertion (e, true);
1666             }
1667         }
1668     }
1669
1670   if (!changed)
1671     return;
1672
1673   blocks = sbitmap_alloc (last_basic_block);
1674   sbitmap_zero (blocks);
1675   FOR_EACH_BB (bb)
1676     if (bb->aux)
1677       {
1678         SET_BIT (blocks, bb->index);
1679         /* Check for forgotten bb->aux values before commit_edge_insertions
1680            call.  */
1681         if (bb->aux != &bb->aux)
1682           abort ();
1683         bb->aux = NULL;
1684       }
1685   find_many_sub_basic_blocks (blocks);
1686   sbitmap_free (blocks);
1687 }
1688 \f
1689 /* Print out one basic block with live information at start and end.  */
1690
1691 static void
1692 rtl_dump_bb (basic_block bb, FILE *outf)
1693 {
1694   rtx insn;
1695   rtx last;
1696
1697   fputs (";; Registers live at start:", outf);
1698   dump_regset (bb->global_live_at_start, outf);
1699   putc ('\n', outf);
1700
1701   for (insn = bb->head, last = NEXT_INSN (bb->end); insn != last;
1702        insn = NEXT_INSN (insn))
1703     print_rtl_single (outf, insn);
1704
1705   fputs (";; Registers live at end:", outf);
1706   dump_regset (bb->global_live_at_end, outf);
1707   putc ('\n', outf);
1708 }
1709 \f
1710 /* Like print_rtl, but also print out live information for the start of each
1711    basic block.  */
1712
1713 void
1714 print_rtl_with_bb (FILE *outf, rtx rtx_first)
1715 {
1716   rtx tmp_rtx;
1717
1718   if (rtx_first == 0)
1719     fprintf (outf, "(nil)\n");
1720   else
1721     {
1722       enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
1723       int max_uid = get_max_uid ();
1724       basic_block *start = xcalloc (max_uid, sizeof (basic_block));
1725       basic_block *end = xcalloc (max_uid, sizeof (basic_block));
1726       enum bb_state *in_bb_p = xcalloc (max_uid, sizeof (enum bb_state));
1727
1728       basic_block bb;
1729
1730       FOR_EACH_BB_REVERSE (bb)
1731         {
1732           rtx x;
1733
1734           start[INSN_UID (bb->head)] = bb;
1735           end[INSN_UID (bb->end)] = bb;
1736           for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x))
1737             {
1738               enum bb_state state = IN_MULTIPLE_BB;
1739
1740               if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1741                 state = IN_ONE_BB;
1742               in_bb_p[INSN_UID (x)] = state;
1743
1744               if (x == bb->end)
1745                 break;
1746             }
1747         }
1748
1749       for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1750         {
1751           int did_output;
1752
1753           if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
1754             {
1755               fprintf (outf, ";; Start of basic block %d, registers live:",
1756                        bb->index);
1757               dump_regset (bb->global_live_at_start, outf);
1758               putc ('\n', outf);
1759             }
1760
1761           if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1762               && GET_CODE (tmp_rtx) != NOTE
1763               && GET_CODE (tmp_rtx) != BARRIER)
1764             fprintf (outf, ";; Insn is not within a basic block\n");
1765           else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1766             fprintf (outf, ";; Insn is in multiple basic blocks\n");
1767
1768           did_output = print_rtl_single (outf, tmp_rtx);
1769
1770           if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
1771             {
1772               fprintf (outf, ";; End of basic block %d, registers live:\n",
1773                        bb->index);
1774               dump_regset (bb->global_live_at_end, outf);
1775               putc ('\n', outf);
1776             }
1777
1778           if (did_output)
1779             putc ('\n', outf);
1780         }
1781
1782       free (start);
1783       free (end);
1784       free (in_bb_p);
1785     }
1786
1787   if (current_function_epilogue_delay_list != 0)
1788     {
1789       fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1790       for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
1791            tmp_rtx = XEXP (tmp_rtx, 1))
1792         print_rtl_single (outf, XEXP (tmp_rtx, 0));
1793     }
1794 }
1795 \f
1796 void
1797 update_br_prob_note (basic_block bb)
1798 {
1799   rtx note;
1800   if (GET_CODE (bb->end) != JUMP_INSN)
1801     return;
1802   note = find_reg_note (bb->end, REG_BR_PROB, NULL_RTX);
1803   if (!note || INTVAL (XEXP (note, 0)) == BRANCH_EDGE (bb)->probability)
1804     return;
1805   XEXP (note, 0) = GEN_INT (BRANCH_EDGE (bb)->probability);
1806 }
1807 \f
1808 /* Verify the CFG and RTL consistency common for both underlying RTL and
1809    cfglayout RTL.
1810
1811    Currently it does following checks:
1812
1813    - test head/end pointers
1814    - overlapping of basic blocks
1815    - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
1816    - tails of basic blocks (ensure that boundary is necessary)
1817    - scans body of the basic block for JUMP_INSN, CODE_LABEL
1818      and NOTE_INSN_BASIC_BLOCK
1819
1820    In future it can be extended check a lot of other stuff as well
1821    (reachability of basic blocks, life information, etc. etc.).  */
1822 static int
1823 rtl_verify_flow_info_1 (void)
1824 {
1825   const int max_uid = get_max_uid ();
1826   rtx last_head = get_last_insn ();
1827   basic_block *bb_info;
1828   rtx x;
1829   int err = 0;
1830   basic_block bb, last_bb_seen;
1831
1832   bb_info = xcalloc (max_uid, sizeof (basic_block));
1833
1834   /* Check bb chain & numbers.  */
1835   last_bb_seen = ENTRY_BLOCK_PTR;
1836
1837   FOR_EACH_BB_REVERSE (bb)
1838     {
1839       rtx head = bb->head;
1840       rtx end = bb->end;
1841
1842       /* Verify the end of the basic block is in the INSN chain.  */
1843       for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
1844         if (x == end)
1845           break;
1846
1847       if (!x)
1848         {
1849           error ("end insn %d for block %d not found in the insn stream",
1850                  INSN_UID (end), bb->index);
1851           err = 1;
1852         }
1853
1854       /* Work backwards from the end to the head of the basic block
1855          to verify the head is in the RTL chain.  */
1856       for (; x != NULL_RTX; x = PREV_INSN (x))
1857         {
1858           /* While walking over the insn chain, verify insns appear
1859              in only one basic block and initialize the BB_INFO array
1860              used by other passes.  */
1861           if (bb_info[INSN_UID (x)] != NULL)
1862             {
1863               error ("insn %d is in multiple basic blocks (%d and %d)",
1864                      INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
1865               err = 1;
1866             }
1867
1868           bb_info[INSN_UID (x)] = bb;
1869
1870           if (x == head)
1871             break;
1872         }
1873       if (!x)
1874         {
1875           error ("head insn %d for block %d not found in the insn stream",
1876                  INSN_UID (head), bb->index);
1877           err = 1;
1878         }
1879
1880       last_head = x;
1881     }
1882
1883   /* Now check the basic blocks (boundaries etc.) */
1884   FOR_EACH_BB_REVERSE (bb)
1885     {
1886       int n_fallthru = 0, n_eh = 0, n_call = 0, n_abnormal = 0, n_branch = 0;
1887       edge e, fallthru = NULL;
1888       rtx note;
1889
1890       if (INSN_P (bb->end)
1891           && (note = find_reg_note (bb->end, REG_BR_PROB, NULL_RTX))
1892           && bb->succ && bb->succ->succ_next
1893           && any_condjump_p (bb->end))
1894         {
1895           if (INTVAL (XEXP (note, 0)) != BRANCH_EDGE (bb)->probability)
1896             {
1897               error ("verify_flow_info: REG_BR_PROB does not match cfg %wi %i",
1898                      INTVAL (XEXP (note, 0)), BRANCH_EDGE (bb)->probability);
1899               err = 1;
1900             }
1901         }
1902       for (e = bb->succ; e; e = e->succ_next)
1903         {
1904           if (e->flags & EDGE_FALLTHRU)
1905             n_fallthru++, fallthru = e;
1906
1907           if ((e->flags & ~(EDGE_DFS_BACK
1908                             | EDGE_CAN_FALLTHRU
1909                             | EDGE_IRREDUCIBLE_LOOP
1910                             | EDGE_LOOP_EXIT)) == 0)
1911             n_branch++;
1912
1913           if (e->flags & EDGE_ABNORMAL_CALL)
1914             n_call++;
1915
1916           if (e->flags & EDGE_EH)
1917             n_eh++;
1918           else if (e->flags & EDGE_ABNORMAL)
1919             n_abnormal++;
1920         }
1921
1922       if (n_eh && GET_CODE (PATTERN (bb->end)) != RESX
1923           && !find_reg_note (bb->end, REG_EH_REGION, NULL_RTX))
1924         {
1925           error ("Missing REG_EH_REGION note in the end of bb %i", bb->index);
1926           err = 1;
1927         }
1928       if (n_branch
1929           && (GET_CODE (bb->end) != JUMP_INSN
1930               || (n_branch > 1 && (any_uncondjump_p (bb->end)
1931                                    || any_condjump_p (bb->end)))))
1932         {
1933           error ("Too many outgoing branch edges from bb %i", bb->index);
1934           err = 1;
1935         }
1936       if (n_fallthru && any_uncondjump_p (bb->end))
1937         {
1938           error ("Fallthru edge after unconditional jump %i", bb->index);
1939           err = 1;
1940         }
1941       if (n_branch != 1 && any_uncondjump_p (bb->end))
1942         {
1943           error ("Wrong amount of branch edges after unconditional jump %i", bb->index);
1944           err = 1;
1945         }
1946       if (n_branch != 1 && any_condjump_p (bb->end)
1947           && JUMP_LABEL (bb->end) != fallthru->dest->head)
1948         {
1949           error ("Wrong amount of branch edges after conditional jump %i", bb->index);
1950           err = 1;
1951         }
1952       if (n_call && GET_CODE (bb->end) != CALL_INSN)
1953         {
1954           error ("Call edges for non-call insn in bb %i", bb->index);
1955           err = 1;
1956         }
1957       if (n_abnormal
1958           && (GET_CODE (bb->end) != CALL_INSN && n_call != n_abnormal)
1959           && (GET_CODE (bb->end) != JUMP_INSN
1960               || any_condjump_p (bb->end)
1961               || any_uncondjump_p (bb->end)))
1962         {
1963           error ("Abnormal edges for no purpose in bb %i", bb->index);
1964           err = 1;
1965         }
1966
1967       for (x = bb->head; x != NEXT_INSN (bb->end); x = NEXT_INSN (x))
1968         if (BLOCK_FOR_INSN (x) != bb)
1969           {
1970             debug_rtx (x);
1971             if (! BLOCK_FOR_INSN (x))
1972               error
1973                 ("insn %d inside basic block %d but block_for_insn is NULL",
1974                  INSN_UID (x), bb->index);
1975             else
1976               error
1977                 ("insn %d inside basic block %d but block_for_insn is %i",
1978                  INSN_UID (x), bb->index, BLOCK_FOR_INSN (x)->index);
1979
1980             err = 1;
1981           }
1982
1983       /* OK pointers are correct.  Now check the header of basic
1984          block.  It ought to contain optional CODE_LABEL followed
1985          by NOTE_BASIC_BLOCK.  */
1986       x = bb->head;
1987       if (GET_CODE (x) == CODE_LABEL)
1988         {
1989           if (bb->end == x)
1990             {
1991               error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
1992                      bb->index);
1993               err = 1;
1994             }
1995
1996           x = NEXT_INSN (x);
1997         }
1998
1999       if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
2000         {
2001           error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2002                  bb->index);
2003           err = 1;
2004         }
2005
2006       if (bb->end == x)
2007         /* Do checks for empty blocks her. e */
2008         ;
2009       else
2010         for (x = NEXT_INSN (x); x; x = NEXT_INSN (x))
2011           {
2012             if (NOTE_INSN_BASIC_BLOCK_P (x))
2013               {
2014                 error ("NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d",
2015                        INSN_UID (x), bb->index);
2016                 err = 1;
2017               }
2018
2019             if (x == bb->end)
2020               break;
2021
2022             if (control_flow_insn_p (x))
2023               {
2024                 error ("in basic block %d:", bb->index);
2025                 fatal_insn ("flow control insn inside a basic block", x);
2026               }
2027           }
2028     }
2029
2030   /* Clean up.  */
2031   free (bb_info);
2032   return err;
2033 }
2034
2035 /* Verify the CFG and RTL consistency common for both underlying RTL and
2036    cfglayout RTL.
2037
2038    Currently it does following checks:
2039    - all checks of rtl_verify_flow_info_1
2040    - check that all insns are in the basic blocks
2041      (except the switch handling code, barriers and notes)
2042    - check that all returns are followed by barriers
2043    - check that all fallthru edge points to the adjacent blocks.  */
2044 static int
2045 rtl_verify_flow_info (void)
2046 {
2047   basic_block bb;
2048   int err = rtl_verify_flow_info_1 ();
2049   rtx x;
2050   int num_bb_notes;
2051   const rtx rtx_first = get_insns ();
2052   basic_block last_bb_seen = ENTRY_BLOCK_PTR, curr_bb = NULL;
2053
2054   FOR_EACH_BB_REVERSE (bb)
2055     {
2056       edge e;
2057       for (e = bb->succ; e; e = e->succ_next)
2058         if (e->flags & EDGE_FALLTHRU)
2059           break;
2060       if (!e)
2061         {
2062           rtx insn;
2063
2064           /* Ensure existence of barrier in BB with no fallthru edges.  */
2065           for (insn = bb->end; !insn || GET_CODE (insn) != BARRIER;
2066                insn = NEXT_INSN (insn))
2067             if (!insn
2068                 || (GET_CODE (insn) == NOTE
2069                     && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK))
2070                 {
2071                   error ("missing barrier after block %i", bb->index);
2072                   err = 1;
2073                   break;
2074                 }
2075         }
2076       else if (e->src != ENTRY_BLOCK_PTR
2077                && e->dest != EXIT_BLOCK_PTR)
2078         {
2079           rtx insn;
2080
2081           if (e->src->next_bb != e->dest)
2082             {
2083               error
2084                 ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
2085                  e->src->index, e->dest->index);
2086               err = 1;
2087             }
2088           else
2089             for (insn = NEXT_INSN (e->src->end); insn != e->dest->head;
2090                  insn = NEXT_INSN (insn))
2091               if (GET_CODE (insn) == BARRIER
2092 #ifndef CASE_DROPS_THROUGH
2093                   || INSN_P (insn)
2094 #else
2095                   || (INSN_P (insn) && ! JUMP_TABLE_DATA_P (insn))
2096 #endif
2097                   )
2098                 {
2099                   error ("verify_flow_info: Incorrect fallthru %i->%i",
2100                          e->src->index, e->dest->index);
2101                   fatal_insn ("wrong insn in the fallthru edge", insn);
2102                   err = 1;
2103                 }
2104         }
2105     }
2106
2107   num_bb_notes = 0;
2108   last_bb_seen = ENTRY_BLOCK_PTR;
2109
2110   for (x = rtx_first; x; x = NEXT_INSN (x))
2111     {
2112       if (NOTE_INSN_BASIC_BLOCK_P (x))
2113         {
2114           bb = NOTE_BASIC_BLOCK (x);
2115
2116           num_bb_notes++;
2117           if (bb != last_bb_seen->next_bb)
2118             internal_error ("basic blocks not laid down consecutively");
2119
2120           curr_bb = last_bb_seen = bb;
2121         }
2122
2123       if (!curr_bb)
2124         {
2125           switch (GET_CODE (x))
2126             {
2127             case BARRIER:
2128             case NOTE:
2129               break;
2130
2131             case CODE_LABEL:
2132               /* An addr_vec is placed outside any block block.  */
2133               if (NEXT_INSN (x)
2134                   && GET_CODE (NEXT_INSN (x)) == JUMP_INSN
2135                   && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
2136                       || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
2137                 x = NEXT_INSN (x);
2138
2139               /* But in any case, non-deletable labels can appear anywhere.  */
2140               break;
2141
2142             default:
2143               fatal_insn ("insn outside basic block", x);
2144             }
2145         }
2146
2147       if (INSN_P (x)
2148           && GET_CODE (x) == JUMP_INSN
2149           && returnjump_p (x) && ! condjump_p (x)
2150           && ! (NEXT_INSN (x) && GET_CODE (NEXT_INSN (x)) == BARRIER))
2151             fatal_insn ("return not followed by barrier", x);
2152       if (curr_bb && x == curr_bb->end)
2153         curr_bb = NULL;
2154     }
2155
2156   if (num_bb_notes != n_basic_blocks)
2157     internal_error
2158       ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2159        num_bb_notes, n_basic_blocks);
2160
2161    return err;
2162 }
2163 \f
2164 /* Assume that the preceding pass has possibly eliminated jump instructions
2165    or converted the unconditional jumps.  Eliminate the edges from CFG.
2166    Return true if any edges are eliminated.  */
2167
2168 bool
2169 purge_dead_edges (basic_block bb)
2170 {
2171   edge e, next;
2172   rtx insn = bb->end, note;
2173   bool purged = false;
2174
2175   /* If this instruction cannot trap, remove REG_EH_REGION notes.  */
2176   if (GET_CODE (insn) == INSN
2177       && (note = find_reg_note (insn, REG_EH_REGION, NULL)))
2178     {
2179       rtx eqnote;
2180
2181       if (! may_trap_p (PATTERN (insn))
2182           || ((eqnote = find_reg_equal_equiv_note (insn))
2183               && ! may_trap_p (XEXP (eqnote, 0))))
2184         remove_note (insn, note);
2185     }
2186
2187   /* Cleanup abnormal edges caused by exceptions or non-local gotos.  */
2188   for (e = bb->succ; e; e = next)
2189     {
2190       next = e->succ_next;
2191       if (e->flags & EDGE_EH)
2192         {
2193           if (can_throw_internal (bb->end))
2194             continue;
2195         }
2196       else if (e->flags & EDGE_ABNORMAL_CALL)
2197         {
2198           if (GET_CODE (bb->end) == CALL_INSN
2199               && (! (note = find_reg_note (insn, REG_EH_REGION, NULL))
2200                   || INTVAL (XEXP (note, 0)) >= 0))
2201             continue;
2202         }
2203       else
2204         continue;
2205
2206       remove_edge (e);
2207       bb->flags |= BB_DIRTY;
2208       purged = true;
2209     }
2210
2211   if (GET_CODE (insn) == JUMP_INSN)
2212     {
2213       rtx note;
2214       edge b,f;
2215
2216       /* We do care only about conditional jumps and simplejumps.  */
2217       if (!any_condjump_p (insn)
2218           && !returnjump_p (insn)
2219           && !simplejump_p (insn))
2220         return purged;
2221
2222       /* Branch probability/prediction notes are defined only for
2223          condjumps.  We've possibly turned condjump into simplejump.  */
2224       if (simplejump_p (insn))
2225         {
2226           note = find_reg_note (insn, REG_BR_PROB, NULL);
2227           if (note)
2228             remove_note (insn, note);
2229           while ((note = find_reg_note (insn, REG_BR_PRED, NULL)))
2230             remove_note (insn, note);
2231         }
2232
2233       for (e = bb->succ; e; e = next)
2234         {
2235           next = e->succ_next;
2236
2237           /* Avoid abnormal flags to leak from computed jumps turned
2238              into simplejumps.  */
2239
2240           e->flags &= ~EDGE_ABNORMAL;
2241
2242           /* See if this edge is one we should keep.  */
2243           if ((e->flags & EDGE_FALLTHRU) && any_condjump_p (insn))
2244             /* A conditional jump can fall through into the next
2245                block, so we should keep the edge.  */
2246             continue;
2247           else if (e->dest != EXIT_BLOCK_PTR
2248                    && e->dest->head == JUMP_LABEL (insn))
2249             /* If the destination block is the target of the jump,
2250                keep the edge.  */
2251             continue;
2252           else if (e->dest == EXIT_BLOCK_PTR && returnjump_p (insn))
2253             /* If the destination block is the exit block, and this
2254                instruction is a return, then keep the edge.  */
2255             continue;
2256           else if ((e->flags & EDGE_EH) && can_throw_internal (insn))
2257             /* Keep the edges that correspond to exceptions thrown by
2258                this instruction.  */
2259             continue;
2260
2261           /* We do not need this edge.  */
2262           bb->flags |= BB_DIRTY;
2263           purged = true;
2264           remove_edge (e);
2265         }
2266
2267       if (!bb->succ || !purged)
2268         return purged;
2269
2270       if (rtl_dump_file)
2271         fprintf (rtl_dump_file, "Purged edges from bb %i\n", bb->index);
2272
2273       if (!optimize)
2274         return purged;
2275
2276       /* Redistribute probabilities.  */
2277       if (!bb->succ->succ_next)
2278         {
2279           bb->succ->probability = REG_BR_PROB_BASE;
2280           bb->succ->count = bb->count;
2281         }
2282       else
2283         {
2284           note = find_reg_note (insn, REG_BR_PROB, NULL);
2285           if (!note)
2286             return purged;
2287
2288           b = BRANCH_EDGE (bb);
2289           f = FALLTHRU_EDGE (bb);
2290           b->probability = INTVAL (XEXP (note, 0));
2291           f->probability = REG_BR_PROB_BASE - b->probability;
2292           b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2293           f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2294         }
2295
2296       return purged;
2297     }
2298   else if (GET_CODE (insn) == CALL_INSN && SIBLING_CALL_P (insn))
2299     {
2300       /* First, there should not be any EH or ABCALL edges resulting
2301          from non-local gotos and the like.  If there were, we shouldn't
2302          have created the sibcall in the first place.  Second, there
2303          should of course never have been a fallthru edge.  */
2304       if (!bb->succ || bb->succ->succ_next)
2305         abort ();
2306       if (bb->succ->flags != (EDGE_SIBCALL | EDGE_ABNORMAL))
2307         abort ();
2308
2309       return 0;
2310     }
2311
2312   /* If we don't see a jump insn, we don't know exactly why the block would
2313      have been broken at this point.  Look for a simple, non-fallthru edge,
2314      as these are only created by conditional branches.  If we find such an
2315      edge we know that there used to be a jump here and can then safely
2316      remove all non-fallthru edges.  */
2317   for (e = bb->succ; e && (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU));
2318        e = e->succ_next)
2319     ;
2320
2321   if (!e)
2322     return purged;
2323
2324   for (e = bb->succ; e; e = next)
2325     {
2326       next = e->succ_next;
2327       if (!(e->flags & EDGE_FALLTHRU))
2328         {
2329           bb->flags |= BB_DIRTY;
2330           remove_edge (e);
2331           purged = true;
2332         }
2333     }
2334
2335   if (!bb->succ || bb->succ->succ_next)
2336     abort ();
2337
2338   bb->succ->probability = REG_BR_PROB_BASE;
2339   bb->succ->count = bb->count;
2340
2341   if (rtl_dump_file)
2342     fprintf (rtl_dump_file, "Purged non-fallthru edges from bb %i\n",
2343              bb->index);
2344   return purged;
2345 }
2346
2347 /* Search all basic blocks for potentially dead edges and purge them.  Return
2348    true if some edge has been eliminated.  */
2349
2350 bool
2351 purge_all_dead_edges (int update_life_p)
2352 {
2353   int purged = false;
2354   sbitmap blocks = 0;
2355   basic_block bb;
2356
2357   if (update_life_p)
2358     {
2359       blocks = sbitmap_alloc (last_basic_block);
2360       sbitmap_zero (blocks);
2361     }
2362
2363   FOR_EACH_BB (bb)
2364     {
2365       bool purged_here = purge_dead_edges (bb);
2366
2367       purged |= purged_here;
2368       if (purged_here && update_life_p)
2369         SET_BIT (blocks, bb->index);
2370     }
2371
2372   if (update_life_p && purged)
2373     update_life_info (blocks, UPDATE_LIFE_GLOBAL,
2374                       PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
2375                       | PROP_KILL_DEAD_CODE);
2376
2377   if (update_life_p)
2378     sbitmap_free (blocks);
2379   return purged;
2380 }
2381
2382 /* Same as split_block but update cfg_layout structures.  */
2383 static edge
2384 cfg_layout_split_block (basic_block bb, void *insnp)
2385 {
2386   rtx insn = insnp;
2387
2388   edge fallthru = rtl_split_block (bb, insn);
2389
2390   fallthru->dest->rbi->footer = fallthru->src->rbi->footer;
2391   fallthru->src->rbi->footer = NULL;
2392   return fallthru;
2393 }
2394
2395
2396 /* Redirect Edge to DEST.  */
2397 static bool
2398 cfg_layout_redirect_edge_and_branch (edge e, basic_block dest)
2399 {
2400   basic_block src = e->src;
2401   bool ret;
2402
2403   if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
2404     return false;
2405
2406   if (e->src != ENTRY_BLOCK_PTR
2407       && try_redirect_by_replacing_jump (e, dest, true))
2408     return true;
2409
2410   if (e->dest == dest)
2411     return true;
2412
2413   if (e->src == ENTRY_BLOCK_PTR
2414       && (e->flags & EDGE_FALLTHRU) && !(e->flags & EDGE_COMPLEX))
2415     {
2416       if (rtl_dump_file)
2417         fprintf (rtl_dump_file, "Redirecting entry edge from bb %i to %i\n",
2418                  e->src->index, dest->index);
2419
2420       redirect_edge_succ (e, dest);
2421       return true;
2422     }
2423
2424   /* Redirect_edge_and_branch may decide to turn branch into fallthru edge
2425      in the case the basic block appears to be in sequence.  Avoid this
2426      transformation.  */
2427
2428   if (e->flags & EDGE_FALLTHRU)
2429     {
2430       /* Redirect any branch edges unified with the fallthru one.  */
2431       if (GET_CODE (src->end) == JUMP_INSN
2432           && JUMP_LABEL (src->end) == e->dest->head)
2433         {
2434           if (!redirect_jump (src->end, block_label (dest), 0))
2435             abort ();
2436         }
2437       /* In case we are redirecting fallthru edge to the branch edge
2438          of conditional jump, remove it.  */
2439       if (src->succ->succ_next
2440           && !src->succ->succ_next->succ_next)
2441         {
2442           edge s = e->succ_next ? e->succ_next : src->succ;
2443           if (s->dest == dest
2444               && any_condjump_p (src->end)
2445               && onlyjump_p (src->end))
2446             delete_insn (src->end);
2447         }
2448       redirect_edge_succ_nodup (e, dest);
2449       if (rtl_dump_file)
2450         fprintf (rtl_dump_file, "Fallthru edge %i->%i redirected to %i\n",
2451                  e->src->index, e->dest->index, dest->index);
2452
2453       ret = true;
2454     }
2455   else
2456     ret = redirect_branch_edge (e, dest);
2457
2458   /* We don't want simplejumps in the insn stream during cfglayout.  */
2459   if (simplejump_p (src->end))
2460     abort ();
2461
2462   return ret;
2463 }
2464
2465 /* Simple wrapper as we always can redirect fallthru edges.  */
2466 static basic_block
2467 cfg_layout_redirect_edge_and_branch_force (edge e, basic_block dest)
2468 {
2469   if (!cfg_layout_redirect_edge_and_branch (e, dest))
2470     abort ();
2471   return NULL;
2472 }
2473
2474 /* Same as flow_delete_block but update cfg_layout structures.  */
2475 static void
2476 cfg_layout_delete_block (basic_block bb)
2477 {
2478   rtx insn, next, prev = PREV_INSN (bb->head), *to, remaints;
2479
2480   if (bb->rbi->header)
2481     {
2482       next = bb->head;
2483       if (prev)
2484         NEXT_INSN (prev) = bb->rbi->header;
2485       else
2486         set_first_insn (bb->rbi->header);
2487       PREV_INSN (bb->rbi->header) = prev;
2488       insn = bb->rbi->header;
2489       while (NEXT_INSN (insn))
2490         insn = NEXT_INSN (insn);
2491       NEXT_INSN (insn) = next;
2492       PREV_INSN (next) = insn;
2493     }
2494   next = NEXT_INSN (bb->end);
2495   if (bb->rbi->footer)
2496     {
2497       insn = bb->rbi->footer;
2498       while (insn)
2499         {
2500           if (GET_CODE (insn) == BARRIER)
2501             {
2502               if (PREV_INSN (insn))
2503                 NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
2504               else
2505                 bb->rbi->footer = NEXT_INSN (insn);
2506               if (NEXT_INSN (insn))
2507                 PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
2508             }
2509           if (GET_CODE (insn) == CODE_LABEL)
2510             break;
2511           insn = NEXT_INSN (insn);
2512         }
2513       if (bb->rbi->footer)
2514         {
2515           insn = bb->end;
2516           NEXT_INSN (insn) = bb->rbi->footer;
2517           PREV_INSN (bb->rbi->footer) = insn;
2518           while (NEXT_INSN (insn))
2519             insn = NEXT_INSN (insn);
2520           NEXT_INSN (insn) = next;
2521           if (next)
2522             PREV_INSN (next) = insn;
2523           else
2524             set_last_insn (insn);
2525         }
2526     }
2527   if (bb->next_bb != EXIT_BLOCK_PTR)
2528     to = &bb->next_bb->rbi->header;
2529   else
2530     to = &cfg_layout_function_footer;
2531   rtl_delete_block (bb);
2532
2533   if (prev)
2534     prev = NEXT_INSN (prev);
2535   else
2536     prev = get_insns ();
2537   if (next)
2538     next = PREV_INSN (next);
2539   else
2540     next = get_last_insn ();
2541
2542   if (next && NEXT_INSN (next) != prev)
2543     {
2544       remaints = unlink_insn_chain (prev, next);
2545       insn = remaints;
2546       while (NEXT_INSN (insn))
2547         insn = NEXT_INSN (insn);
2548       NEXT_INSN (insn) = *to;
2549       if (*to)
2550         PREV_INSN (*to) = insn;
2551       *to = remaints;
2552     }
2553 }
2554
2555 /* Return true when blocks A and B can be safely merged.  */
2556 static bool
2557 cfg_layout_can_merge_blocks_p (basic_block a, basic_block b)
2558 {
2559   /* There must be exactly one edge in between the blocks.  */
2560   return (a->succ && !a->succ->succ_next && a->succ->dest == b
2561           && !b->pred->pred_next && a != b
2562           /* Must be simple edge.  */
2563           && !(a->succ->flags & EDGE_COMPLEX)
2564           && a != ENTRY_BLOCK_PTR && b != EXIT_BLOCK_PTR
2565           /* If the jump insn has side effects,
2566              we can't kill the edge.  */
2567           && (GET_CODE (a->end) != JUMP_INSN
2568               || (flow2_completed
2569                   ? simplejump_p (a->end) : onlyjump_p (a->end))));
2570 }
2571
2572 /* Merge block A and B, abort when it is not possible.  */
2573 static void
2574 cfg_layout_merge_blocks (basic_block a, basic_block b)
2575 {
2576 #ifdef ENABLE_CHECKING
2577   if (!cfg_layout_can_merge_blocks_p (a, b))
2578     abort ();
2579 #endif
2580
2581   /* If there was a CODE_LABEL beginning B, delete it.  */
2582   if (GET_CODE (b->head) == CODE_LABEL)
2583     delete_insn (b->head);
2584
2585   /* We should have fallthru edge in a, or we can do dummy redirection to get
2586      it cleaned up.  */
2587   if (GET_CODE (a->end) == JUMP_INSN)
2588     redirect_edge_and_branch (a->succ, b);
2589   if (GET_CODE (a->end) == JUMP_INSN)
2590     abort ();
2591
2592   /* Possible line number notes should appear in between.  */
2593   if (b->rbi->header)
2594     {
2595       rtx first = a->end, last;
2596
2597       last = emit_insn_after (b->rbi->header, a->end);
2598       delete_insn_chain (NEXT_INSN (first), last);
2599       b->rbi->header = NULL;
2600     }
2601
2602   /* In the case basic blocks are not adjacent, move them around.  */
2603   if (NEXT_INSN (a->end) != b->head)
2604     {
2605       rtx first = unlink_insn_chain (b->head, b->end);
2606
2607       emit_insn_after (first, a->end);
2608       /* Skip possible DELETED_LABEL insn.  */
2609       if (!NOTE_INSN_BASIC_BLOCK_P (first))
2610         first = NEXT_INSN (first);
2611       if (!NOTE_INSN_BASIC_BLOCK_P (first))
2612         abort ();
2613       b->head = NULL;
2614       delete_insn (first);
2615     }
2616   /* Otherwise just re-associate the instructions.  */
2617   else
2618     {
2619       rtx insn;
2620
2621       for (insn = b->head; insn != NEXT_INSN (b->end); insn = NEXT_INSN (insn))
2622         set_block_for_insn (insn, a);
2623       insn = b->head;
2624       /* Skip possible DELETED_LABEL insn.  */
2625       if (!NOTE_INSN_BASIC_BLOCK_P (insn))
2626         insn = NEXT_INSN (insn);
2627       if (!NOTE_INSN_BASIC_BLOCK_P (insn))
2628         abort ();
2629       b->head = NULL;
2630       a->end = b->end;
2631       delete_insn (insn);
2632     }
2633
2634   /* Possible tablejumps and barriers should appear after the block.  */
2635   if (b->rbi->footer)
2636     {
2637       if (!a->rbi->footer)
2638         a->rbi->footer = b->rbi->footer;
2639       else
2640         {
2641           rtx last = a->rbi->footer;
2642
2643           while (NEXT_INSN (last))
2644             last = NEXT_INSN (last);
2645           NEXT_INSN (last) = b->rbi->footer;
2646           PREV_INSN (b->rbi->footer) = last;
2647         }
2648       b->rbi->footer = NULL;
2649     }
2650
2651   if (rtl_dump_file)
2652     fprintf (rtl_dump_file, "Merged blocks %d and %d.\n",
2653              a->index, b->index);
2654
2655   update_cfg_after_block_merging (a, b);
2656 }
2657
2658 /* Split edge E.  */
2659 static basic_block
2660 cfg_layout_split_edge (edge e)
2661 {
2662   edge new_e;
2663   basic_block new_bb =
2664     create_basic_block (e->src != ENTRY_BLOCK_PTR
2665                         ? NEXT_INSN (e->src-> end) : get_insns (),
2666                         NULL_RTX, e->src);
2667
2668   new_bb->count = e->count;
2669   new_bb->frequency = EDGE_FREQUENCY (e);
2670
2671   new_e = make_edge (new_bb, e->dest, EDGE_FALLTHRU);
2672   new_e->probability = REG_BR_PROB_BASE;
2673   new_e->count = e->count;
2674   redirect_edge_and_branch_force (e, new_bb);
2675
2676   return new_bb;
2677 }
2678
2679 /* Implementation of CFG manipulation for linearized RTL.  */
2680 struct cfg_hooks rtl_cfg_hooks = {
2681   rtl_verify_flow_info,
2682   rtl_dump_bb,
2683   rtl_create_basic_block,
2684   rtl_redirect_edge_and_branch,
2685   rtl_redirect_edge_and_branch_force,
2686   rtl_delete_block,
2687   rtl_split_block,
2688   rtl_can_merge_blocks,  /* can_merge_blocks_p */
2689   rtl_merge_blocks,
2690   rtl_split_edge
2691 };
2692
2693 /* Implementation of CFG manipulation for cfg layout RTL, where
2694    basic block connected via fallthru edges does not have to be adjacent.
2695    This representation will hopefully become the default one in future
2696    version of the compiler.  */
2697 struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
2698   rtl_verify_flow_info_1,
2699   rtl_dump_bb,
2700   cfg_layout_create_basic_block,
2701   cfg_layout_redirect_edge_and_branch,
2702   cfg_layout_redirect_edge_and_branch_force,
2703   cfg_layout_delete_block,
2704   cfg_layout_split_block,
2705   cfg_layout_can_merge_blocks_p,
2706   cfg_layout_merge_blocks,
2707   cfg_layout_split_edge
2708 };