OSDN Git Service

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