OSDN Git Service

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