OSDN Git Service

* Makefile.in (ifcvt.o): Add cfgloop.h.
[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
1725         = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1726       basic_block *end
1727         = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1728       enum bb_state *in_bb_p
1729         = (enum bb_state *) xcalloc (max_uid, sizeof (enum bb_state));
1730
1731       basic_block bb;
1732
1733       FOR_EACH_BB_REVERSE (bb)
1734         {
1735           rtx x;
1736
1737           start[INSN_UID (bb->head)] = bb;
1738           end[INSN_UID (bb->end)] = bb;
1739           for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x))
1740             {
1741               enum bb_state state = IN_MULTIPLE_BB;
1742
1743               if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1744                 state = IN_ONE_BB;
1745               in_bb_p[INSN_UID (x)] = state;
1746
1747               if (x == bb->end)
1748                 break;
1749             }
1750         }
1751
1752       for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1753         {
1754           int did_output;
1755
1756           if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
1757             {
1758               fprintf (outf, ";; Start of basic block %d, registers live:",
1759                        bb->index);
1760               dump_regset (bb->global_live_at_start, outf);
1761               putc ('\n', outf);
1762             }
1763
1764           if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1765               && GET_CODE (tmp_rtx) != NOTE
1766               && GET_CODE (tmp_rtx) != BARRIER)
1767             fprintf (outf, ";; Insn is not within a basic block\n");
1768           else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1769             fprintf (outf, ";; Insn is in multiple basic blocks\n");
1770
1771           did_output = print_rtl_single (outf, tmp_rtx);
1772
1773           if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
1774             {
1775               fprintf (outf, ";; End of basic block %d, registers live:\n",
1776                        bb->index);
1777               dump_regset (bb->global_live_at_end, outf);
1778               putc ('\n', outf);
1779             }
1780
1781           if (did_output)
1782             putc ('\n', outf);
1783         }
1784
1785       free (start);
1786       free (end);
1787       free (in_bb_p);
1788     }
1789
1790   if (current_function_epilogue_delay_list != 0)
1791     {
1792       fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1793       for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
1794            tmp_rtx = XEXP (tmp_rtx, 1))
1795         print_rtl_single (outf, XEXP (tmp_rtx, 0));
1796     }
1797 }
1798 \f
1799 void
1800 update_br_prob_note (basic_block bb)
1801 {
1802   rtx note;
1803   if (GET_CODE (bb->end) != JUMP_INSN)
1804     return;
1805   note = find_reg_note (bb->end, REG_BR_PROB, NULL_RTX);
1806   if (!note || INTVAL (XEXP (note, 0)) == BRANCH_EDGE (bb)->probability)
1807     return;
1808   XEXP (note, 0) = GEN_INT (BRANCH_EDGE (bb)->probability);
1809 }
1810 \f
1811 /* Verify the CFG and RTL consistency common for both underlying RTL and
1812    cfglayout RTL.
1813
1814    Currently it does following checks:
1815
1816    - test head/end pointers
1817    - overlapping of basic blocks
1818    - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
1819    - tails of basic blocks (ensure that boundary is necessary)
1820    - scans body of the basic block for JUMP_INSN, CODE_LABEL
1821      and NOTE_INSN_BASIC_BLOCK
1822
1823    In future it can be extended check a lot of other stuff as well
1824    (reachability of basic blocks, life information, etc. etc.).  */
1825 static int
1826 rtl_verify_flow_info_1 (void)
1827 {
1828   const int max_uid = get_max_uid ();
1829   rtx last_head = get_last_insn ();
1830   basic_block *bb_info;
1831   rtx x;
1832   int err = 0;
1833   basic_block bb, last_bb_seen;
1834
1835   bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1836
1837   /* Check bb chain & numbers.  */
1838   last_bb_seen = ENTRY_BLOCK_PTR;
1839
1840   FOR_EACH_BB_REVERSE (bb)
1841     {
1842       rtx head = bb->head;
1843       rtx end = bb->end;
1844
1845       /* Verify the end of the basic block is in the INSN chain.  */
1846       for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
1847         if (x == end)
1848           break;
1849
1850       if (!x)
1851         {
1852           error ("end insn %d for block %d not found in the insn stream",
1853                  INSN_UID (end), bb->index);
1854           err = 1;
1855         }
1856
1857       /* Work backwards from the end to the head of the basic block
1858          to verify the head is in the RTL chain.  */
1859       for (; x != NULL_RTX; x = PREV_INSN (x))
1860         {
1861           /* While walking over the insn chain, verify insns appear
1862              in only one basic block and initialize the BB_INFO array
1863              used by other passes.  */
1864           if (bb_info[INSN_UID (x)] != NULL)
1865             {
1866               error ("insn %d is in multiple basic blocks (%d and %d)",
1867                      INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
1868               err = 1;
1869             }
1870
1871           bb_info[INSN_UID (x)] = bb;
1872
1873           if (x == head)
1874             break;
1875         }
1876       if (!x)
1877         {
1878           error ("head insn %d for block %d not found in the insn stream",
1879                  INSN_UID (head), bb->index);
1880           err = 1;
1881         }
1882
1883       last_head = x;
1884     }
1885
1886   /* Now check the basic blocks (boundaries etc.) */
1887   FOR_EACH_BB_REVERSE (bb)
1888     {
1889       int n_fallthru = 0, n_eh = 0, n_call = 0, n_abnormal = 0, n_branch = 0;
1890       edge e, fallthru = NULL;
1891       rtx note;
1892
1893       if (INSN_P (bb->end)
1894           && (note = find_reg_note (bb->end, REG_BR_PROB, NULL_RTX))
1895           && bb->succ && bb->succ->succ_next
1896           && any_condjump_p (bb->end))
1897         {
1898           if (INTVAL (XEXP (note, 0)) != BRANCH_EDGE (bb)->probability)
1899             {
1900               error ("verify_flow_info: REG_BR_PROB does not match cfg %wi %i",
1901                      INTVAL (XEXP (note, 0)), BRANCH_EDGE (bb)->probability);
1902               err = 1;
1903             }
1904         }
1905       for (e = bb->succ; e; e = e->succ_next)
1906         {
1907           if (e->flags & EDGE_FALLTHRU)
1908             n_fallthru++, fallthru = e;
1909
1910           if ((e->flags & ~(EDGE_DFS_BACK
1911                             | EDGE_CAN_FALLTHRU
1912                             | EDGE_IRREDUCIBLE_LOOP
1913                             | EDGE_LOOP_EXIT)) == 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 };