Makefile.in (cfgrtl.o): Add.
[platform/upstream/gcc.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 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 with CFG and analyze it
23    that are aware of RTL intermediate language.
24
25    Available functionality:
26      - CFG aware instruction chain manipulation
27          delete_insn, delete_insn_chain
28      - Basic block manipulation
29          create_basic_block, flow_delete_block, split_block, merge_blocks_nomove
30      - Infrastructure to determine quickly basic block for instruction.
31          compute_bb_for_insn, update_bb_for_insn, set_block_for_insn,
32      - Edge redirection with updating and optimizing instruction chain
33              block_label, redirect_edge_and_branch,
34              redirect_edge_and_branch_force, tidy_fallthru_edge, force_nonfallthru
35      - Edge splitting and commiting to edges
36           split_edge, insert_insn_on_edge, commit_edge_insertions
37      - Dumpipng and debugging
38           print_rtl_with_bb, dump_bb, debug_bb, debug_bb_n
39      - Consistency checking
40           verify_flow_info
41      - CFG updating after constant propagation
42           purge_dead_edges, purge_all_dead_edges
43  */
44 \f
45 #include "config.h"
46 #include "system.h"
47 #include "tree.h"
48 #include "rtl.h"
49 #include "hard-reg-set.h"
50 #include "basic-block.h"
51 #include "regs.h"
52 #include "flags.h"
53 #include "output.h"
54 #include "function.h"
55 #include "except.h"
56 #include "toplev.h"
57 #include "tm_p.h"
58 #include "obstack.h"
59
60 /* Stubs in case we haven't got a return insn.  */
61 #ifndef HAVE_return
62 #define HAVE_return 0
63 #define gen_return() NULL_RTX
64 #endif
65
66 /* The basic block structure for every insn, indexed by uid.  */
67
68 varray_type basic_block_for_insn;
69
70 /* The labels mentioned in non-jump rtl.  Valid during find_basic_blocks.  */
71 /* ??? Should probably be using LABEL_NUSES instead.  It would take a
72    bit of surgery to be able to use or co-opt the routines in jump.  */
73
74 rtx label_value_list;
75 rtx tail_recursion_label_list;
76
77 static int can_delete_note_p            PARAMS ((rtx));
78 static int can_delete_label_p           PARAMS ((rtx));
79 static void commit_one_edge_insertion   PARAMS ((edge));
80 static bool try_redirect_by_replacing_jump PARAMS ((edge, basic_block));
81 static rtx last_loop_beg_note           PARAMS ((rtx));
82 static bool back_edge_of_syntactic_loop_p PARAMS ((basic_block, basic_block));
83 static basic_block force_nonfallthru_and_redirect PARAMS ((edge, basic_block));
84 \f
85 /* Return true if NOTE is not one of the ones that must be kept paired,
86    so that we may simply delete them.  */
87
88 static int
89 can_delete_note_p (note)
90      rtx note;
91 {
92   return (NOTE_LINE_NUMBER (note) == NOTE_INSN_DELETED
93           || NOTE_LINE_NUMBER (note) == NOTE_INSN_BASIC_BLOCK);
94 }
95
96 /* True if a given label can be deleted.  */
97
98 static int
99 can_delete_label_p (label)
100      rtx label;
101 {
102   rtx x;
103
104   if (LABEL_PRESERVE_P (label))
105     return 0;
106
107   for (x = forced_labels; x; x = XEXP (x, 1))
108     if (label == XEXP (x, 0))
109       return 0;
110   for (x = label_value_list; x; x = XEXP (x, 1))
111     if (label == XEXP (x, 0))
112       return 0;
113   for (x = exception_handler_labels; x; x = XEXP (x, 1))
114     if (label == XEXP (x, 0))
115       return 0;
116
117   /* User declared labels must be preserved.  */
118   if (LABEL_NAME (label) != 0)
119     return 0;
120
121   return 1;
122 }
123
124 /* Delete INSN by patching it out.  Return the next insn.  */
125
126 rtx
127 delete_insn (insn)
128      rtx insn;
129 {
130   rtx next = NEXT_INSN (insn);
131   rtx note;
132   bool really_delete = true;
133
134   if (GET_CODE (insn) == CODE_LABEL)
135     {
136       /* Some labels can't be directly removed from the INSN chain, as they
137          might be references via variables, constant pool etc. 
138          Convert them to the special NOTE_INSN_DELETED_LABEL note.  */
139       if (! can_delete_label_p (insn))
140         {
141           const char *name = LABEL_NAME (insn);
142
143           really_delete = false;
144           PUT_CODE (insn, NOTE);
145           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED_LABEL;
146           NOTE_SOURCE_FILE (insn) = name;
147         }
148       remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
149     }
150
151   if (really_delete)
152     {
153       remove_insn (insn);
154       INSN_DELETED_P (insn) = 1;
155     }
156
157   /* If deleting a jump, decrement the use count of the label.  Deleting
158      the label itself should happen in the normal course of block merging.  */
159   if (GET_CODE (insn) == JUMP_INSN
160       && JUMP_LABEL (insn)
161       && GET_CODE (JUMP_LABEL (insn)) == CODE_LABEL)
162     LABEL_NUSES (JUMP_LABEL (insn))--;
163
164   /* Also if deleting an insn that references a label.  */
165   else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX
166            && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
167     LABEL_NUSES (XEXP (note, 0))--;
168
169   if (GET_CODE (insn) == JUMP_INSN
170       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
171           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
172     {
173       rtx pat = PATTERN (insn);
174       int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
175       int len = XVECLEN (pat, diff_vec_p);
176       int i;
177
178       for (i = 0; i < len; i++)
179         LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))--;
180     }
181
182   return next;
183 }
184
185 /* Unlink a chain of insns between START and FINISH, leaving notes
186    that must be paired.  */
187
188 void
189 delete_insn_chain (start, finish)
190      rtx start, finish;
191 {
192   /* Unchain the insns one by one.  It would be quicker to delete all
193      of these with a single unchaining, rather than one at a time, but
194      we need to keep the NOTE's.  */
195
196   rtx next;
197
198   while (1)
199     {
200       next = NEXT_INSN (start);
201       if (GET_CODE (start) == NOTE && !can_delete_note_p (start))
202         ;
203       else
204         next = delete_insn (start);
205
206       if (start == finish)
207         break;
208       start = next;
209     }
210 }
211 \f
212 /* Create a new basic block consisting of the instructions between
213    HEAD and END inclusive.  This function is designed to allow fast
214    BB construction - reuses the note and basic block struct
215    in BB_NOTE, if any and do not grow BASIC_BLOCK chain and should
216    be used directly only by CFG construction code.
217    END can be NULL in to create new empty basic block before HEAD.
218    Both END and HEAD can be NULL to create basic block at the end of
219    INSN chain.  */
220
221 basic_block
222 create_basic_block_structure (index, head, end, bb_note)
223      int index;
224      rtx head, end, bb_note;
225 {
226   basic_block bb;
227
228   if (bb_note
229       && ! RTX_INTEGRATED_P (bb_note)
230       && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
231       && bb->aux == NULL)
232     {
233       /* If we found an existing note, thread it back onto the chain.  */
234
235       rtx after;
236
237       if (GET_CODE (head) == CODE_LABEL)
238         after = head;
239       else
240         {
241           after = PREV_INSN (head);
242           head = bb_note;
243         }
244
245       if (after != bb_note && NEXT_INSN (after) != bb_note)
246         reorder_insns (bb_note, bb_note, after);
247     }
248   else
249     {
250       /* Otherwise we must create a note and a basic block structure.  */
251
252       bb = alloc_block ();
253
254       if (!head && !end)
255         {
256           head = end = bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK,
257                                                   get_last_insn ());
258         }
259       else if (GET_CODE (head) == CODE_LABEL && end)
260         {
261           bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
262           if (head == end)
263             end = bb_note;
264         }
265       else
266         {
267           bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
268           head = bb_note;
269           if (!end)
270             end = head;
271         }
272       NOTE_BASIC_BLOCK (bb_note) = bb;
273     }
274
275   /* Always include the bb note in the block.  */
276   if (NEXT_INSN (end) == bb_note)
277     end = bb_note;
278
279   bb->head = head;
280   bb->end = end;
281   bb->index = index;
282   BASIC_BLOCK (index) = bb;
283   if (basic_block_for_insn)
284     update_bb_for_insn (bb);
285
286   /* Tag the block so that we know it has been used when considering
287      other basic block notes.  */
288   bb->aux = bb;
289
290   return bb;
291 }
292
293 /* Create new basic block consisting of instructions in between HEAD and
294    END and place it to the BB chain at possition INDEX.
295    END can be NULL in to create new empty basic block before HEAD.
296    Both END and HEAD can be NULL to create basic block at the end of
297    INSN chain.  */
298
299 basic_block
300 create_basic_block (index, head, end)
301      int index;
302      rtx head, end;
303 {
304   basic_block bb;
305   int i;
306
307   /* Place the new block just after the block being split.  */
308   VARRAY_GROW (basic_block_info, ++n_basic_blocks);
309
310   /* Some parts of the compiler expect blocks to be number in
311      sequential order so insert the new block immediately after the
312      block being split..  */
313   for (i = n_basic_blocks - 1; i > index; --i)
314     {
315       basic_block tmp = BASIC_BLOCK (i - 1);
316       BASIC_BLOCK (i) = tmp;
317       tmp->index = i;
318     }
319
320   bb = create_basic_block_structure (index, head, end, NULL);
321   bb->aux = NULL;
322   return bb;
323 }
324 \f
325 /* Delete the insns in a (non-live) block.  We physically delete every
326    non-deleted-note insn, and update the flow graph appropriately.
327
328    Return nonzero if we deleted an exception handler.  */
329
330 /* ??? Preserving all such notes strikes me as wrong.  It would be nice
331    to post-process the stream to remove empty blocks, loops, ranges, etc.  */
332
333 int
334 flow_delete_block (b)
335      basic_block b;
336 {
337   int deleted_handler = 0;
338   rtx insn, end, tmp;
339
340   /* If the head of this block is a CODE_LABEL, then it might be the
341      label for an exception handler which can't be reached.
342
343      We need to remove the label from the exception_handler_label list
344      and remove the associated NOTE_INSN_EH_REGION_BEG and
345      NOTE_INSN_EH_REGION_END notes.  */
346
347   insn = b->head;
348
349   never_reached_warning (insn);
350
351   if (GET_CODE (insn) == CODE_LABEL)
352     maybe_remove_eh_handler (insn);
353
354   /* Include any jump table following the basic block.  */
355   end = b->end;
356   if (GET_CODE (end) == JUMP_INSN
357       && (tmp = JUMP_LABEL (end)) != NULL_RTX
358       && (tmp = NEXT_INSN (tmp)) != NULL_RTX
359       && GET_CODE (tmp) == JUMP_INSN
360       && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
361           || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
362     end = tmp;
363
364   /* Include any barrier that may follow the basic block.  */
365   tmp = next_nonnote_insn (end);
366   if (tmp && GET_CODE (tmp) == BARRIER)
367     end = tmp;
368
369   /* Selectively delete the entire chain.  */
370   b->head = NULL;
371   delete_insn_chain (insn, end);
372
373   /* Remove the edges into and out of this block.  Note that there may
374      indeed be edges in, if we are removing an unreachable loop.  */
375   while (b->pred != NULL)
376     remove_edge (b->pred);
377   while (b->succ != NULL)
378     remove_edge (b->succ);
379
380   b->pred = NULL;
381   b->succ = NULL;
382
383   /* Remove the basic block from the array, and compact behind it.  */
384   expunge_block (b);
385
386   return deleted_handler;
387 }
388 \f
389 /* Records the basic block struct in BB_FOR_INSN, for every instruction
390    indexed by INSN_UID.  MAX is the size of the array.  */
391
392 void
393 compute_bb_for_insn (max)
394      int max;
395 {
396   int i;
397
398   if (basic_block_for_insn)
399     VARRAY_FREE (basic_block_for_insn);
400   VARRAY_BB_INIT (basic_block_for_insn, max, "basic_block_for_insn");
401
402   for (i = 0; i < n_basic_blocks; ++i)
403     {
404       basic_block bb = BASIC_BLOCK (i);
405       rtx insn, end;
406
407       end = bb->end;
408       insn = bb->head;
409       while (1)
410         {
411           int uid = INSN_UID (insn);
412           if (uid < max)
413             VARRAY_BB (basic_block_for_insn, uid) = bb;
414           if (insn == end)
415             break;
416           insn = NEXT_INSN (insn);
417         }
418     }
419 }
420
421 /* Release the basic_block_for_insn array.  */
422
423 void
424 free_bb_for_insn ()
425 {
426   if (basic_block_for_insn)
427     VARRAY_FREE (basic_block_for_insn);
428   basic_block_for_insn = 0;
429 }
430
431 /* Update insns block within BB.  */
432
433 void
434 update_bb_for_insn (bb)
435      basic_block bb;
436 {
437   rtx insn;
438
439   if (! basic_block_for_insn)
440     return;
441
442   for (insn = bb->head; ; insn = NEXT_INSN (insn))
443     {
444       set_block_for_insn (insn, bb);
445
446       if (insn == bb->end)
447         break;
448     }
449 }
450
451 /* Record INSN's block as BB.  */
452
453 void
454 set_block_for_insn (insn, bb)
455      rtx insn;
456      basic_block bb;
457 {
458   size_t uid = INSN_UID (insn);
459   if (uid >= basic_block_for_insn->num_elements)
460     {
461       int new_size;
462
463       /* Add one-eighth the size so we don't keep calling xrealloc.  */
464       new_size = uid + (uid + 7) / 8;
465
466       VARRAY_GROW (basic_block_for_insn, new_size);
467     }
468   VARRAY_BB (basic_block_for_insn, uid) = bb;
469 }
470 \f
471 /* Split a block BB after insn INSN creating a new fallthru edge.
472    Return the new edge.  Note that to keep other parts of the compiler happy,
473    this function renumbers all the basic blocks so that the new
474    one has a number one greater than the block split.  */
475
476 edge
477 split_block (bb, insn)
478      basic_block bb;
479      rtx insn;
480 {
481   basic_block new_bb;
482   edge new_edge;
483   edge e;
484
485   /* There is no point splitting the block after its end.  */
486   if (bb->end == insn)
487     return 0;
488
489   /* Create the new basic block.  */
490   new_bb = create_basic_block (bb->index + 1, NEXT_INSN (insn), bb->end);
491   new_bb->count = bb->count;
492   new_bb->frequency = bb->frequency;
493   new_bb->loop_depth = bb->loop_depth;
494   bb->end = insn;
495
496   /* Redirect the outgoing edges.  */
497   new_bb->succ = bb->succ;
498   bb->succ = NULL;
499   for (e = new_bb->succ; e; e = e->succ_next)
500     e->src = new_bb;
501
502   new_edge = make_single_succ_edge (bb, new_bb, EDGE_FALLTHRU);
503
504   if (bb->global_live_at_start)
505     {
506       new_bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
507       new_bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
508       COPY_REG_SET (new_bb->global_live_at_end, bb->global_live_at_end);
509
510       /* We now have to calculate which registers are live at the end
511          of the split basic block and at the start of the new basic
512          block.  Start with those registers that are known to be live
513          at the end of the original basic block and get
514          propagate_block to determine which registers are live.  */
515       COPY_REG_SET (new_bb->global_live_at_start, bb->global_live_at_end);
516       propagate_block (new_bb, new_bb->global_live_at_start, NULL, NULL, 0);
517       COPY_REG_SET (bb->global_live_at_end,
518                     new_bb->global_live_at_start);
519     }
520
521   return new_edge;
522 }
523
524 /* Blocks A and B are to be merged into a single block A.  The insns
525    are already contiguous, hence `nomove'.  */
526
527 void
528 merge_blocks_nomove (a, b)
529      basic_block a, b;
530 {
531   edge e;
532   rtx b_head, b_end, a_end;
533   rtx del_first = NULL_RTX, del_last = NULL_RTX;
534   int b_empty = 0;
535
536   /* If there was a CODE_LABEL beginning B, delete it.  */
537   b_head = b->head;
538   b_end = b->end;
539   if (GET_CODE (b_head) == CODE_LABEL)
540     {
541       /* Detect basic blocks with nothing but a label.  This can happen
542          in particular at the end of a function.  */
543       if (b_head == b_end)
544         b_empty = 1;
545       del_first = del_last = b_head;
546       b_head = NEXT_INSN (b_head);
547     }
548
549   /* Delete the basic block note.  */
550   if (NOTE_INSN_BASIC_BLOCK_P (b_head))
551     {
552       if (b_head == b_end)
553         b_empty = 1;
554       if (! del_last)
555         del_first = b_head;
556       del_last = b_head;
557       b_head = NEXT_INSN (b_head);
558     }
559
560   /* If there was a jump out of A, delete it.  */
561   a_end = a->end;
562   if (GET_CODE (a_end) == JUMP_INSN)
563     {
564       rtx prev;
565
566       for (prev = PREV_INSN (a_end); ; prev = PREV_INSN (prev))
567         if (GET_CODE (prev) != NOTE
568             || NOTE_LINE_NUMBER (prev) == NOTE_INSN_BASIC_BLOCK
569             || prev == a->head)
570           break;
571
572       del_first = a_end;
573
574 #ifdef HAVE_cc0
575       /* If this was a conditional jump, we need to also delete
576          the insn that set cc0.  */
577       if (only_sets_cc0_p (prev))
578         {
579           rtx tmp = prev;
580           prev = prev_nonnote_insn (prev);
581           if (!prev)
582             prev = a->head;
583           del_first = tmp;
584         }
585 #endif
586
587       a_end = PREV_INSN (del_first);
588     }
589   else if (GET_CODE (NEXT_INSN (a_end)) == BARRIER)
590     del_first = NEXT_INSN (a_end);
591
592   /* Normally there should only be one successor of A and that is B, but
593      partway though the merge of blocks for conditional_execution we'll
594      be merging a TEST block with THEN and ELSE successors.  Free the
595      whole lot of them and hope the caller knows what they're doing.  */
596   while (a->succ)
597     remove_edge (a->succ);
598
599   /* Adjust the edges out of B for the new owner.  */
600   for (e = b->succ; e; e = e->succ_next)
601     e->src = a;
602   a->succ = b->succ;
603
604   /* B hasn't quite yet ceased to exist.  Attempt to prevent mishap.  */
605   b->pred = b->succ = NULL;
606
607   expunge_block (b);
608
609   /* Delete everything marked above as well as crap that might be
610      hanging out between the two blocks.  */
611   delete_insn_chain (del_first, del_last);
612
613   /* Reassociate the insns of B with A.  */
614   if (!b_empty)
615     {
616       rtx x = a_end;
617       if (basic_block_for_insn)
618         {
619           BLOCK_FOR_INSN (x) = a;
620           while (x != b_end)
621             {
622               x = NEXT_INSN (x);
623               BLOCK_FOR_INSN (x) = a;
624             }
625         }
626       a_end = b_end;
627     }
628   a->end = a_end;
629 }
630 \f
631 /* Return label in the head of basic block.  Create one if it doesn't exist.  */
632
633 rtx
634 block_label (block)
635      basic_block block;
636 {
637   if (block == EXIT_BLOCK_PTR)
638     return NULL_RTX;
639   if (GET_CODE (block->head) != CODE_LABEL)
640     {
641       block->head = emit_label_before (gen_label_rtx (), block->head);
642       if (basic_block_for_insn)
643         set_block_for_insn (block->head, block);
644     }
645   return block->head;
646 }
647
648 /* Attempt to perform edge redirection by replacing possibly complex jump
649    instruction by unconditional jump or removing jump completely.
650    This can apply only if all edges now point to the same block.
651
652    The parameters and return values are equivalent to redirect_edge_and_branch.
653  */
654
655 static bool
656 try_redirect_by_replacing_jump (e, target)
657      edge e;
658      basic_block target;
659 {
660   basic_block src = e->src;
661   rtx insn = src->end, kill_from;
662   edge tmp;
663   rtx set;
664   int fallthru = 0;
665
666   /* Verify that all targets will be TARGET.  */
667   for (tmp = src->succ; tmp; tmp = tmp->succ_next)
668     if (tmp->dest != target && tmp != e)
669       break;
670   if (tmp || !onlyjump_p (insn))
671     return false;
672
673   /* Avoid removing branch with side effects.  */
674   set = single_set (insn);
675   if (!set || side_effects_p (set))
676     return false;
677
678   /* In case we zap a conditional jump, we'll need to kill
679      the cc0 setter too.  */
680   kill_from = insn;
681 #ifdef HAVE_cc0
682   if (reg_mentioned_p (cc0_rtx, PATTERN (insn)))
683     kill_from = PREV_INSN (insn);
684 #endif
685
686   /* See if we can create the fallthru edge.  */
687   if (can_fallthru (src, target))
688     {
689       if (rtl_dump_file)
690         fprintf (rtl_dump_file, "Removing jump %i.\n", INSN_UID (insn));
691       fallthru = 1;
692
693       /* Selectivly unlink whole insn chain.  */
694       delete_insn_chain (kill_from, PREV_INSN (target->head));
695     }
696   /* If this already is simplejump, redirect it.  */
697   else if (simplejump_p (insn))
698     {
699       if (e->dest == target)
700         return false;
701       if (rtl_dump_file)
702         fprintf (rtl_dump_file, "Redirecting jump %i from %i to %i.\n",
703                  INSN_UID (insn), e->dest->index, target->index);
704       redirect_jump (insn, block_label (target), 0);
705     }
706   /* Or replace possibly complicated jump insn by simple jump insn.  */
707   else
708     {
709       rtx target_label = block_label (target);
710       rtx barrier;
711
712       emit_jump_insn_after (gen_jump (target_label), kill_from);
713       JUMP_LABEL (src->end) = target_label;
714       LABEL_NUSES (target_label)++;
715       if (rtl_dump_file)
716         fprintf (rtl_dump_file, "Replacing insn %i by jump %i\n",
717                  INSN_UID (insn), INSN_UID (src->end));
718
719       delete_insn_chain (kill_from, insn);
720
721       barrier = next_nonnote_insn (src->end);
722       if (!barrier || GET_CODE (barrier) != BARRIER)
723         emit_barrier_after (src->end);
724     }
725
726   /* Keep only one edge out and set proper flags.  */
727   while (src->succ->succ_next)
728     remove_edge (src->succ);
729   e = src->succ;
730   if (fallthru)
731     e->flags = EDGE_FALLTHRU;
732   else
733     e->flags = 0;
734   e->probability = REG_BR_PROB_BASE;
735   e->count = src->count;
736
737   /* We don't want a block to end on a line-number note since that has
738      the potential of changing the code between -g and not -g.  */
739   while (GET_CODE (e->src->end) == NOTE
740          && NOTE_LINE_NUMBER (e->src->end) >= 0)
741     delete_insn (e->src->end);
742
743   if (e->dest != target)
744     redirect_edge_succ (e, target);
745   return true;
746 }
747
748 /* Return last loop_beg note appearing after INSN, before start of next
749    basic block.  Return INSN if there are no such notes.
750
751    When emmiting jump to redirect an fallthru edge, it should always
752    appear after the LOOP_BEG notes, as loop optimizer expect loop to
753    eighter start by fallthru edge or jump following the LOOP_BEG note
754    jumping to the loop exit test.  */
755
756 static rtx
757 last_loop_beg_note (insn)
758      rtx insn;
759 {
760   rtx last = insn;
761   insn = NEXT_INSN (insn);
762   while (insn && GET_CODE (insn) == NOTE
763          && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK)
764     {
765       if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
766         last = insn;
767       insn = NEXT_INSN (insn);
768     }
769   return last;
770 }
771
772 /* Attempt to change code to redirect edge E to TARGET.
773    Don't do that on expense of adding new instructions or reordering
774    basic blocks.
775
776    Function can be also called with edge destionation equivalent to the
777    TARGET.  Then it should try the simplifications and do nothing if
778    none is possible.
779
780    Return true if transformation suceeded.  We still return flase in case
781    E already destinated TARGET and we didn't managed to simplify instruction
782    stream.  */
783
784 bool
785 redirect_edge_and_branch (e, target)
786      edge e;
787      basic_block target;
788 {
789   rtx tmp;
790   rtx old_label = e->dest->head;
791   basic_block src = e->src;
792   rtx insn = src->end;
793
794   if (e->flags & EDGE_COMPLEX)
795     return false;
796
797   if (try_redirect_by_replacing_jump (e, target))
798     return true;
799   /* Do this fast path late, as we want above code to simplify for cases
800      where called on single edge leaving basic block containing nontrivial
801      jump insn.  */
802   else if (e->dest == target)
803     return false;
804
805   /* We can only redirect non-fallthru edges of jump insn.  */
806   if (e->flags & EDGE_FALLTHRU)
807     return false;
808   if (GET_CODE (insn) != JUMP_INSN)
809     return false;
810
811   /* Recognize a tablejump and adjust all matching cases.  */
812   if ((tmp = JUMP_LABEL (insn)) != NULL_RTX
813       && (tmp = NEXT_INSN (tmp)) != NULL_RTX
814       && GET_CODE (tmp) == JUMP_INSN
815       && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
816           || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
817     {
818       rtvec vec;
819       int j;
820       rtx new_label = block_label (target);
821
822       if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
823         vec = XVEC (PATTERN (tmp), 0);
824       else
825         vec = XVEC (PATTERN (tmp), 1);
826
827       for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
828         if (XEXP (RTVEC_ELT (vec, j), 0) == old_label)
829           {
830             RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (Pmode, new_label);
831             --LABEL_NUSES (old_label);
832             ++LABEL_NUSES (new_label);
833           }
834
835       /* Handle casesi dispatch insns */
836       if ((tmp = single_set (insn)) != NULL
837           && SET_DEST (tmp) == pc_rtx
838           && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
839           && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF
840           && XEXP (XEXP (SET_SRC (tmp), 2), 0) == old_label)
841         {
842           XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (VOIDmode,
843                                                        new_label);
844           --LABEL_NUSES (old_label);
845           ++LABEL_NUSES (new_label);
846         }
847     }
848   else
849     {
850       /* ?? We may play the games with moving the named labels from
851          one basic block to the other in case only one computed_jump is
852          available.  */
853       if (computed_jump_p (insn))
854         return false;
855
856       /* A return instruction can't be redirected.  */
857       if (returnjump_p (insn))
858         return false;
859
860       /* If the insn doesn't go where we think, we're confused.  */
861       if (JUMP_LABEL (insn) != old_label)
862         abort ();
863       redirect_jump (insn, block_label (target), 0);
864     }
865
866   if (rtl_dump_file)
867     fprintf (rtl_dump_file, "Edge %i->%i redirected to %i\n",
868              e->src->index, e->dest->index, target->index);
869   if (e->dest != target)
870     redirect_edge_succ_nodup (e, target);
871   return true;
872 }
873
874 /* Like force_nonfallthru bellow, but additionally performs redirection
875    Used by redirect_edge_and_branch_force.  */
876
877 static basic_block
878 force_nonfallthru_and_redirect (e, target)
879      edge e;
880      basic_block target;
881 {
882   basic_block jump_block, new_bb = NULL;
883   rtx note;
884   edge new_edge;
885
886   if (e->flags & EDGE_ABNORMAL)
887     abort ();
888   if (!(e->flags & EDGE_FALLTHRU))
889     abort ();
890   if (e->src->succ->succ_next)
891     {
892       /* Create the new structures.  */
893       note = last_loop_beg_note (e->src->end);
894       jump_block = create_basic_block (e->src->index + 1, NEXT_INSN (note), NULL);
895       jump_block->count = e->count;
896       jump_block->frequency = EDGE_FREQUENCY (e);
897       jump_block->loop_depth = target->loop_depth;
898
899       if (target->global_live_at_start)
900         {
901           jump_block->global_live_at_start =
902             OBSTACK_ALLOC_REG_SET (&flow_obstack);
903           jump_block->global_live_at_end =
904             OBSTACK_ALLOC_REG_SET (&flow_obstack);
905           COPY_REG_SET (jump_block->global_live_at_start,
906                         target->global_live_at_start);
907           COPY_REG_SET (jump_block->global_live_at_end,
908                         target->global_live_at_start);
909         }
910
911       /* Wire edge in.  */
912       new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
913       new_edge->probability = e->probability;
914       new_edge->count = e->count;
915
916       /* Redirect old edge.  */
917       redirect_edge_pred (e, jump_block);
918       e->probability = REG_BR_PROB_BASE;
919
920       new_bb = jump_block;
921     }
922   else
923     jump_block = e->src;
924   e->flags &= ~EDGE_FALLTHRU;
925   if (target == EXIT_BLOCK_PTR)
926     {
927       if (HAVE_return)
928         emit_jump_insn_after (gen_return (), jump_block->end);
929       else
930         abort ();
931     }
932   else
933     {
934       rtx label = block_label (target);
935       emit_jump_insn_after (gen_jump (label), jump_block->end);
936       JUMP_LABEL (jump_block->end) = label;
937       LABEL_NUSES (label)++;
938     }
939   emit_barrier_after (jump_block->end);
940   redirect_edge_succ_nodup (e, target);
941
942   return new_bb;
943 }
944
945 /* Edge E is assumed to be fallthru edge.  Emit needed jump instruction
946    (and possibly create new basic block) to make edge non-fallthru.
947    Return newly created BB or NULL if none.  */
948 basic_block
949 force_nonfallthru (e)
950      edge e;
951 {
952   return force_nonfallthru_and_redirect (e, e->dest);
953 }
954
955 /* Redirect edge even at the expense of creating new jump insn or
956    basic block.  Return new basic block if created, NULL otherwise.
957    Abort if converison is impossible.  */
958
959 basic_block
960 redirect_edge_and_branch_force (e, target)
961      edge e;
962      basic_block target;
963 {
964   basic_block new_bb;
965
966   if (redirect_edge_and_branch (e, target))
967     return NULL;
968   if (e->dest == target)
969     return NULL;
970
971   /* In case the edge redirection failed, try to force it to be non-fallthru
972      and redirect newly created simplejump.  */
973   new_bb = force_nonfallthru_and_redirect (e, target);
974   return new_bb;
975 }
976
977 /* The given edge should potentially be a fallthru edge.  If that is in
978    fact true, delete the jump and barriers that are in the way.  */
979
980 void
981 tidy_fallthru_edge (e, b, c)
982      edge e;
983      basic_block b, c;
984 {
985   rtx q;
986
987   /* ??? In a late-running flow pass, other folks may have deleted basic
988      blocks by nopping out blocks, leaving multiple BARRIERs between here
989      and the target label. They ought to be chastized and fixed.
990
991      We can also wind up with a sequence of undeletable labels between
992      one block and the next.
993
994      So search through a sequence of barriers, labels, and notes for
995      the head of block C and assert that we really do fall through.  */
996
997   if (next_real_insn (b->end) != next_real_insn (PREV_INSN (c->head)))
998     return;
999
1000   /* Remove what will soon cease being the jump insn from the source block.
1001      If block B consisted only of this single jump, turn it into a deleted
1002      note.  */
1003   q = b->end;
1004   if (GET_CODE (q) == JUMP_INSN
1005       && onlyjump_p (q)
1006       && (any_uncondjump_p (q)
1007           || (b->succ == e && e->succ_next == NULL)))
1008     {
1009 #ifdef HAVE_cc0
1010       /* If this was a conditional jump, we need to also delete
1011          the insn that set cc0.  */
1012       if (any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1013         q = PREV_INSN (q);
1014 #endif
1015
1016       q = PREV_INSN (q);
1017
1018       /* We don't want a block to end on a line-number note since that has
1019          the potential of changing the code between -g and not -g.  */
1020       while (GET_CODE (q) == NOTE && NOTE_LINE_NUMBER (q) >= 0)
1021         q = PREV_INSN (q);
1022     }
1023
1024   /* Selectively unlink the sequence.  */
1025   if (q != PREV_INSN (c->head))
1026     delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
1027
1028   e->flags |= EDGE_FALLTHRU;
1029 }
1030
1031 /* Fix up edges that now fall through, or rather should now fall through
1032    but previously required a jump around now deleted blocks.  Simplify
1033    the search by only examining blocks numerically adjacent, since this
1034    is how find_basic_blocks created them.  */
1035
1036 void
1037 tidy_fallthru_edges ()
1038 {
1039   int i;
1040
1041   for (i = 1; i < n_basic_blocks; ++i)
1042     {
1043       basic_block b = BASIC_BLOCK (i - 1);
1044       basic_block c = BASIC_BLOCK (i);
1045       edge s;
1046
1047       /* We care about simple conditional or unconditional jumps with
1048          a single successor.
1049
1050          If we had a conditional branch to the next instruction when
1051          find_basic_blocks was called, then there will only be one
1052          out edge for the block which ended with the conditional
1053          branch (since we do not create duplicate edges).
1054
1055          Furthermore, the edge will be marked as a fallthru because we
1056          merge the flags for the duplicate edges.  So we do not want to
1057          check that the edge is not a FALLTHRU edge.  */
1058       if ((s = b->succ) != NULL
1059           && ! (s->flags & EDGE_COMPLEX)
1060           && s->succ_next == NULL
1061           && s->dest == c
1062           /* If the jump insn has side effects, we can't tidy the edge.  */
1063           && (GET_CODE (b->end) != JUMP_INSN
1064               || onlyjump_p (b->end)))
1065         tidy_fallthru_edge (s, b, c);
1066     }
1067 }
1068 \f
1069 /* Helper function for split_edge.  Return true in case edge BB2 to BB1
1070    is back edge of syntactic loop.  */
1071
1072 static bool
1073 back_edge_of_syntactic_loop_p (bb1, bb2)
1074         basic_block bb1, bb2;
1075 {
1076   rtx insn;
1077   int count = 0;
1078
1079   if (bb1->index > bb2->index)
1080     return false;
1081
1082   if (bb1->index == bb2->index)
1083     return true;
1084
1085   for (insn = bb1->end; insn != bb2->head && count >= 0;
1086        insn = NEXT_INSN (insn))
1087     if (GET_CODE (insn) == NOTE)
1088       {
1089         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1090           count++;
1091         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
1092           count--;
1093       }
1094
1095   return count >= 0;
1096 }
1097
1098 /* Split a (typically critical) edge.  Return the new block.
1099    Abort on abnormal edges.
1100
1101    ??? The code generally expects to be called on critical edges.
1102    The case of a block ending in an unconditional jump to a
1103    block with multiple predecessors is not handled optimally.  */
1104
1105 basic_block
1106 split_edge (edge_in)
1107      edge edge_in;
1108 {
1109   basic_block bb;
1110   edge edge_out;
1111   rtx before;
1112
1113   /* Abnormal edges cannot be split.  */
1114   if ((edge_in->flags & EDGE_ABNORMAL) != 0)
1115     abort ();
1116
1117   /* We are going to place the new block in front of edge destination.
1118      Avoid existence of fallthru predecesors.  */
1119   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1120     {
1121       edge e;
1122       for (e = edge_in->dest->pred; e; e = e->pred_next)
1123         if (e->flags & EDGE_FALLTHRU)
1124           break;
1125
1126       if (e)
1127         force_nonfallthru (e);
1128     }
1129
1130   /* Create the basic block note.
1131
1132      Where we place the note can have a noticable impact on the generated
1133      code.  Consider this cfg:
1134
1135                         E
1136                         |
1137                         0
1138                        / \
1139                    +->1-->2--->E
1140                    |  |
1141                    +--+
1142
1143       If we need to insert an insn on the edge from block 0 to block 1,
1144       we want to ensure the instructions we insert are outside of any
1145       loop notes that physically sit between block 0 and block 1.  Otherwise
1146       we confuse the loop optimizer into thinking the loop is a phony.  */
1147
1148   if (edge_in->dest != EXIT_BLOCK_PTR
1149       && PREV_INSN (edge_in->dest->head)
1150       && GET_CODE (PREV_INSN (edge_in->dest->head)) == NOTE
1151       && NOTE_LINE_NUMBER (PREV_INSN (edge_in->dest->head)) == NOTE_INSN_LOOP_BEG
1152       && !back_edge_of_syntactic_loop_p (edge_in->dest, edge_in->src))
1153     before = PREV_INSN (edge_in->dest->head);
1154   else if (edge_in->dest != EXIT_BLOCK_PTR)
1155     before = edge_in->dest->head;
1156   else
1157     before = NULL_RTX;
1158
1159   bb = create_basic_block (edge_in->dest == EXIT_BLOCK_PTR ? n_basic_blocks
1160                            : edge_in->dest->index, before, NULL);
1161   bb->count = edge_in->count;
1162   bb->frequency = EDGE_FREQUENCY (edge_in);
1163
1164   /* ??? This info is likely going to be out of date very soon.  */
1165   if (edge_in->dest->global_live_at_start)
1166     {
1167       bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1168       bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1169       COPY_REG_SET (bb->global_live_at_start, edge_in->dest->global_live_at_start);
1170       COPY_REG_SET (bb->global_live_at_end, edge_in->dest->global_live_at_start);
1171     }
1172
1173   edge_out = make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
1174
1175   /* For non-fallthry edges, we must adjust the predecessor's
1176      jump instruction to target our new block.  */
1177   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1178     {
1179       if (!redirect_edge_and_branch (edge_in, bb))
1180         abort ();
1181     }
1182   else
1183     redirect_edge_succ (edge_in, bb);
1184
1185   return bb;
1186 }
1187
1188 /* Queue instructions for insertion on an edge between two basic blocks.
1189    The new instructions and basic blocks (if any) will not appear in the
1190    CFG until commit_edge_insertions is called.  */
1191
1192 void
1193 insert_insn_on_edge (pattern, e)
1194      rtx pattern;
1195      edge e;
1196 {
1197   /* We cannot insert instructions on an abnormal critical edge.
1198      It will be easier to find the culprit if we die now.  */
1199   if ((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
1200     abort ();
1201
1202   if (e->insns == NULL_RTX)
1203     start_sequence ();
1204   else
1205     push_to_sequence (e->insns);
1206
1207   emit_insn (pattern);
1208
1209   e->insns = get_insns ();
1210   end_sequence ();
1211 }
1212
1213 /* Update the CFG for the instructions queued on edge E.  */
1214
1215 static void
1216 commit_one_edge_insertion (e)
1217      edge e;
1218 {
1219   rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1220   basic_block bb;
1221
1222   /* Pull the insns off the edge now since the edge might go away.  */
1223   insns = e->insns;
1224   e->insns = NULL_RTX;
1225
1226   /* Figure out where to put these things.  If the destination has
1227      one predecessor, insert there.  Except for the exit block.  */
1228   if (e->dest->pred->pred_next == NULL
1229       && e->dest != EXIT_BLOCK_PTR)
1230     {
1231       bb = e->dest;
1232
1233       /* Get the location correct wrt a code label, and "nice" wrt
1234          a basic block note, and before everything else.  */
1235       tmp = bb->head;
1236       if (GET_CODE (tmp) == CODE_LABEL)
1237         tmp = NEXT_INSN (tmp);
1238       if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1239         tmp = NEXT_INSN (tmp);
1240       if (tmp == bb->head)
1241         before = tmp;
1242       else
1243         after = PREV_INSN (tmp);
1244     }
1245
1246   /* If the source has one successor and the edge is not abnormal,
1247      insert there.  Except for the entry block.  */
1248   else if ((e->flags & EDGE_ABNORMAL) == 0
1249            && e->src->succ->succ_next == NULL
1250            && e->src != ENTRY_BLOCK_PTR)
1251     {
1252       bb = e->src;
1253       /* It is possible to have a non-simple jump here.  Consider a target
1254          where some forms of unconditional jumps clobber a register.  This
1255          happens on the fr30 for example.
1256
1257          We know this block has a single successor, so we can just emit
1258          the queued insns before the jump.  */
1259       if (GET_CODE (bb->end) == JUMP_INSN)
1260         {
1261           before = bb->end;
1262           while (GET_CODE (PREV_INSN (before)) == NOTE
1263                  && NOTE_LINE_NUMBER (PREV_INSN (before)) == NOTE_INSN_LOOP_BEG)
1264             before = PREV_INSN (before);
1265         }
1266       else
1267         {
1268           /* We'd better be fallthru, or we've lost track of what's what.  */
1269           if ((e->flags & EDGE_FALLTHRU) == 0)
1270             abort ();
1271
1272           after = bb->end;
1273         }
1274     }
1275
1276   /* Otherwise we must split the edge.  */
1277   else
1278     {
1279       bb = split_edge (e);
1280       after = bb->end;
1281     }
1282
1283   /* Now that we've found the spot, do the insertion.  */
1284
1285   if (before)
1286     {
1287       emit_insns_before (insns, before);
1288       last = prev_nonnote_insn (before);
1289     }
1290   else
1291     last = emit_insns_after (insns, after);
1292
1293   if (returnjump_p (last))
1294     {
1295       /* ??? Remove all outgoing edges from BB and add one for EXIT.
1296          This is not currently a problem because this only happens
1297          for the (single) epilogue, which already has a fallthru edge
1298          to EXIT.  */
1299
1300       e = bb->succ;
1301       if (e->dest != EXIT_BLOCK_PTR
1302           || e->succ_next != NULL
1303           || (e->flags & EDGE_FALLTHRU) == 0)
1304         abort ();
1305       e->flags &= ~EDGE_FALLTHRU;
1306
1307       emit_barrier_after (last);
1308
1309       if (before)
1310         delete_insn (before);
1311     }
1312   else if (GET_CODE (last) == JUMP_INSN)
1313     abort ();
1314   find_sub_basic_blocks (bb);
1315 }
1316
1317 /* Update the CFG for all queued instructions.  */
1318
1319 void
1320 commit_edge_insertions ()
1321 {
1322   int i;
1323   basic_block bb;
1324
1325 #ifdef ENABLE_CHECKING
1326   verify_flow_info ();
1327 #endif
1328
1329   i = -1;
1330   bb = ENTRY_BLOCK_PTR;
1331   while (1)
1332     {
1333       edge e, next;
1334
1335       for (e = bb->succ; e; e = next)
1336         {
1337           next = e->succ_next;
1338           if (e->insns)
1339             commit_one_edge_insertion (e);
1340         }
1341
1342       if (++i >= n_basic_blocks)
1343         break;
1344       bb = BASIC_BLOCK (i);
1345     }
1346 }
1347 \f
1348 /* Print out one basic block with live information at start and end.  */
1349
1350 void
1351 dump_bb (bb, outf)
1352      basic_block bb;
1353      FILE *outf;
1354 {
1355   rtx insn;
1356   rtx last;
1357   edge e;
1358
1359   fprintf (outf, ";; Basic block %d, loop depth %d, count ",
1360            bb->index, bb->loop_depth);
1361   fprintf (outf, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) bb->count);
1362   putc ('\n', outf);
1363
1364   fputs (";; Predecessors: ", outf);
1365   for (e = bb->pred; e; e = e->pred_next)
1366     dump_edge_info (outf, e, 0);
1367   putc ('\n', outf);
1368
1369   fputs (";; Registers live at start:", outf);
1370   dump_regset (bb->global_live_at_start, outf);
1371   putc ('\n', outf);
1372
1373   for (insn = bb->head, last = NEXT_INSN (bb->end);
1374        insn != last;
1375        insn = NEXT_INSN (insn))
1376     print_rtl_single (outf, insn);
1377
1378   fputs (";; Registers live at end:", outf);
1379   dump_regset (bb->global_live_at_end, outf);
1380   putc ('\n', outf);
1381
1382   fputs (";; Successors: ", outf);
1383   for (e = bb->succ; e; e = e->succ_next)
1384     dump_edge_info (outf, e, 1);
1385   putc ('\n', outf);
1386 }
1387
1388 void
1389 debug_bb (bb)
1390      basic_block bb;
1391 {
1392   dump_bb (bb, stderr);
1393 }
1394
1395 void
1396 debug_bb_n (n)
1397      int n;
1398 {
1399   dump_bb (BASIC_BLOCK (n), stderr);
1400 }
1401 \f
1402 /* Like print_rtl, but also print out live information for the start of each
1403    basic block.  */
1404
1405 void
1406 print_rtl_with_bb (outf, rtx_first)
1407      FILE *outf;
1408      rtx rtx_first;
1409 {
1410   register rtx tmp_rtx;
1411
1412   if (rtx_first == 0)
1413     fprintf (outf, "(nil)\n");
1414   else
1415     {
1416       int i;
1417       enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
1418       int max_uid = get_max_uid ();
1419       basic_block *start = (basic_block *)
1420         xcalloc (max_uid, sizeof (basic_block));
1421       basic_block *end = (basic_block *)
1422         xcalloc (max_uid, sizeof (basic_block));
1423       enum bb_state *in_bb_p = (enum bb_state *)
1424         xcalloc (max_uid, sizeof (enum bb_state));
1425
1426       for (i = n_basic_blocks - 1; i >= 0; i--)
1427         {
1428           basic_block bb = BASIC_BLOCK (i);
1429           rtx x;
1430
1431           start[INSN_UID (bb->head)] = bb;
1432           end[INSN_UID (bb->end)] = bb;
1433           for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x))
1434             {
1435               enum bb_state state = IN_MULTIPLE_BB;
1436               if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1437                 state = IN_ONE_BB;
1438               in_bb_p[INSN_UID (x)] = state;
1439
1440               if (x == bb->end)
1441                 break;
1442             }
1443         }
1444
1445       for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1446         {
1447           int did_output;
1448           basic_block bb;
1449
1450           if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
1451             {
1452               fprintf (outf, ";; Start of basic block %d, registers live:",
1453                        bb->index);
1454               dump_regset (bb->global_live_at_start, outf);
1455               putc ('\n', outf);
1456             }
1457
1458           if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1459               && GET_CODE (tmp_rtx) != NOTE
1460               && GET_CODE (tmp_rtx) != BARRIER)
1461             fprintf (outf, ";; Insn is not within a basic block\n");
1462           else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1463             fprintf (outf, ";; Insn is in multiple basic blocks\n");
1464
1465           did_output = print_rtl_single (outf, tmp_rtx);
1466
1467           if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
1468             {
1469               fprintf (outf, ";; End of basic block %d, registers live:\n",
1470                        bb->index);
1471               dump_regset (bb->global_live_at_end, outf);
1472               putc ('\n', outf);
1473             }
1474
1475           if (did_output)
1476             putc ('\n', outf);
1477         }
1478
1479       free (start);
1480       free (end);
1481       free (in_bb_p);
1482     }
1483
1484   if (current_function_epilogue_delay_list != 0)
1485     {
1486       fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1487       for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
1488            tmp_rtx = XEXP (tmp_rtx, 1))
1489         print_rtl_single (outf, XEXP (tmp_rtx, 0));
1490     }
1491 }
1492 \f
1493 /* Verify the CFG consistency.  This function check some CFG invariants and
1494    aborts when something is wrong.  Hope that this function will help to
1495    convert many optimization passes to preserve CFG consistent.
1496
1497    Currently it does following checks:
1498
1499    - test head/end pointers
1500    - overlapping of basic blocks
1501    - edge list correctness
1502    - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
1503    - tails of basic blocks (ensure that boundary is necesary)
1504    - scans body of the basic block for JUMP_INSN, CODE_LABEL
1505      and NOTE_INSN_BASIC_BLOCK
1506    - check that all insns are in the basic blocks
1507    (except the switch handling code, barriers and notes)
1508    - check that all returns are followed by barriers
1509
1510    In future it can be extended check a lot of other stuff as well
1511    (reachability of basic blocks, life information, etc. etc.).  */
1512
1513 void
1514 verify_flow_info ()
1515 {
1516   const int max_uid = get_max_uid ();
1517   const rtx rtx_first = get_insns ();
1518   rtx last_head = get_last_insn ();
1519   basic_block *bb_info, *last_visited;
1520   size_t *edge_checksum;
1521   rtx x;
1522   int i, last_bb_num_seen, num_bb_notes, err = 0;
1523
1524   bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
1525   last_visited = (basic_block *) xcalloc (n_basic_blocks + 2,
1526                                           sizeof (basic_block));
1527   edge_checksum = (size_t *) xcalloc (n_basic_blocks + 2, sizeof (size_t));
1528
1529   for (i = n_basic_blocks - 1; i >= 0; i--)
1530     {
1531       basic_block bb = BASIC_BLOCK (i);
1532       rtx head = bb->head;
1533       rtx end = bb->end;
1534
1535       /* Verify the end of the basic block is in the INSN chain.  */
1536       for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
1537         if (x == end)
1538           break;
1539       if (!x)
1540         {
1541           error ("End insn %d for block %d not found in the insn stream.",
1542                  INSN_UID (end), bb->index);
1543           err = 1;
1544         }
1545
1546       /* Work backwards from the end to the head of the basic block
1547          to verify the head is in the RTL chain.  */
1548       for (; x != NULL_RTX; x = PREV_INSN (x))
1549         {
1550           /* While walking over the insn chain, verify insns appear
1551              in only one basic block and initialize the BB_INFO array
1552              used by other passes.  */
1553           if (bb_info[INSN_UID (x)] != NULL)
1554             {
1555               error ("Insn %d is in multiple basic blocks (%d and %d)",
1556                      INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
1557               err = 1;
1558             }
1559           bb_info[INSN_UID (x)] = bb;
1560
1561           if (x == head)
1562             break;
1563         }
1564       if (!x)
1565         {
1566           error ("Head insn %d for block %d not found in the insn stream.",
1567                  INSN_UID (head), bb->index);
1568           err = 1;
1569         }
1570
1571       last_head = x;
1572     }
1573
1574   /* Now check the basic blocks (boundaries etc.) */
1575   for (i = n_basic_blocks - 1; i >= 0; i--)
1576     {
1577       basic_block bb = BASIC_BLOCK (i);
1578       int has_fallthru = 0;
1579       edge e;
1580
1581       e = bb->succ;
1582       while (e)
1583         {
1584           if (last_visited [e->dest->index + 2] == bb)
1585             {
1586               error ("verify_flow_info: Duplicate edge %i->%i",
1587                      e->src->index, e->dest->index);
1588               err = 1;
1589             }
1590           last_visited [e->dest->index + 2] = bb;
1591
1592           if (e->flags & EDGE_FALLTHRU)
1593             has_fallthru = 1;
1594
1595           if ((e->flags & EDGE_FALLTHRU)
1596               && e->src != ENTRY_BLOCK_PTR
1597               && e->dest != EXIT_BLOCK_PTR)
1598             {
1599               rtx insn;
1600               if (e->src->index + 1 != e->dest->index)
1601                 {
1602                     error ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
1603                            e->src->index, e->dest->index);
1604                     err = 1;
1605                 }
1606               else
1607                 for (insn = NEXT_INSN (e->src->end); insn != e->dest->head;
1608                      insn = NEXT_INSN (insn))
1609                   if (GET_CODE (insn) == BARRIER || INSN_P (insn))
1610                     {
1611                       error ("verify_flow_info: Incorrect fallthru %i->%i",
1612                              e->src->index, e->dest->index);
1613                       fatal_insn ("Wrong insn in the fallthru edge", insn);
1614                       err = 1;
1615                     }
1616             }
1617           if (e->src != bb)
1618             {
1619               error ("verify_flow_info: Basic block %d succ edge is corrupted",
1620                      bb->index);
1621               fprintf (stderr, "Predecessor: ");
1622               dump_edge_info (stderr, e, 0);
1623               fprintf (stderr, "\nSuccessor: ");
1624               dump_edge_info (stderr, e, 1);
1625               fprintf (stderr, "\n");
1626               err = 1;
1627             }
1628           edge_checksum[e->dest->index + 2] += (size_t) e;
1629           e = e->succ_next;
1630         }
1631       if (!has_fallthru)
1632         {
1633           rtx insn = bb->end;
1634
1635           /* Ensure existence of barrier in BB with no fallthru edges.  */
1636           for (insn = bb->end; GET_CODE (insn) != BARRIER;
1637                insn = NEXT_INSN (insn))
1638             if (!insn
1639                 || (GET_CODE (insn) == NOTE
1640                     && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK))
1641                 {
1642                   error ("Missing barrier after block %i", bb->index);
1643                   err = 1;
1644                 }
1645         }
1646
1647       e = bb->pred;
1648       while (e)
1649         {
1650           if (e->dest != bb)
1651             {
1652               error ("Basic block %d pred edge is corrupted", bb->index);
1653               fputs ("Predecessor: ", stderr);
1654               dump_edge_info (stderr, e, 0);
1655               fputs ("\nSuccessor: ", stderr);
1656               dump_edge_info (stderr, e, 1);
1657               fputc ('\n', stderr);
1658               err = 1;
1659             }
1660           edge_checksum[e->dest->index + 2] -= (size_t) e;
1661           e = e->pred_next;
1662         }
1663        for (x = bb->head; x != NEXT_INSN (bb->end); x = NEXT_INSN (x))
1664          if (basic_block_for_insn && BLOCK_FOR_INSN (x) != bb)
1665            {
1666              debug_rtx (x);
1667              if (! BLOCK_FOR_INSN (x))
1668                error ("Insn %d is inside basic block %d but block_for_insn is NULL",
1669                       INSN_UID (x), bb->index);
1670              else
1671                error ("Insn %d is inside basic block %d but block_for_insn is %i",
1672                       INSN_UID (x), bb->index, BLOCK_FOR_INSN (x)->index);
1673              err = 1;
1674            }
1675
1676       /* OK pointers are correct.  Now check the header of basic
1677          block.  It ought to contain optional CODE_LABEL followed
1678          by NOTE_BASIC_BLOCK.  */
1679       x = bb->head;
1680       if (GET_CODE (x) == CODE_LABEL)
1681         {
1682           if (bb->end == x)
1683             {
1684               error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
1685                      bb->index);
1686               err = 1;
1687             }
1688           x = NEXT_INSN (x);
1689         }
1690       if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
1691         {
1692           error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
1693                  bb->index);
1694           err = 1;
1695         }
1696
1697       if (bb->end == x)
1698         {
1699           /* Do checks for empty blocks here */
1700         }
1701       else
1702         {
1703           x = NEXT_INSN (x);
1704           while (x)
1705             {
1706               if (NOTE_INSN_BASIC_BLOCK_P (x))
1707                 {
1708                   error ("NOTE_INSN_BASIC_BLOCK %d in the middle of basic block %d",
1709                          INSN_UID (x), bb->index);
1710                   err = 1;
1711                 }
1712
1713               if (x == bb->end)
1714                 break;
1715
1716               if (GET_CODE (x) == JUMP_INSN
1717                   || GET_CODE (x) == CODE_LABEL
1718                   || GET_CODE (x) == BARRIER)
1719                 {
1720                   error ("In basic block %d:", bb->index);
1721                   fatal_insn ("Flow control insn inside a basic block", x);
1722                 }
1723
1724               x = NEXT_INSN (x);
1725             }
1726         }
1727     }
1728
1729   /* Complete edge checksumming for ENTRY and EXIT.  */
1730   {
1731     edge e;
1732     for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
1733       edge_checksum[e->dest->index + 2] += (size_t) e;
1734     for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
1735       edge_checksum[e->dest->index + 2] -= (size_t) e;
1736   }
1737
1738   for (i = -2; i < n_basic_blocks; ++i)
1739     if (edge_checksum[i + 2])
1740       {
1741         error ("Basic block %i edge lists are corrupted", i);
1742         err = 1;
1743       }
1744
1745   last_bb_num_seen = -1;
1746   num_bb_notes = 0;
1747   x = rtx_first;
1748   while (x)
1749     {
1750       if (NOTE_INSN_BASIC_BLOCK_P (x))
1751         {
1752           basic_block bb = NOTE_BASIC_BLOCK (x);
1753           num_bb_notes++;
1754           if (bb->index != last_bb_num_seen + 1)
1755             internal_error ("Basic blocks not numbered consecutively.");
1756
1757           last_bb_num_seen = bb->index;
1758         }
1759
1760       if (!bb_info[INSN_UID (x)])
1761         {
1762           switch (GET_CODE (x))
1763             {
1764             case BARRIER:
1765             case NOTE:
1766               break;
1767
1768             case CODE_LABEL:
1769               /* An addr_vec is placed outside any block block.  */
1770               if (NEXT_INSN (x)
1771                   && GET_CODE (NEXT_INSN (x)) == JUMP_INSN
1772                   && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
1773                       || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
1774                 {
1775                   x = NEXT_INSN (x);
1776                 }
1777
1778               /* But in any case, non-deletable labels can appear anywhere.  */
1779               break;
1780
1781             default:
1782               fatal_insn ("Insn outside basic block", x);
1783             }
1784         }
1785
1786       if (INSN_P (x)
1787           && GET_CODE (x) == JUMP_INSN
1788           && returnjump_p (x) && ! condjump_p (x)
1789           && ! (NEXT_INSN (x) && GET_CODE (NEXT_INSN (x)) == BARRIER))
1790             fatal_insn ("Return not followed by barrier", x);
1791
1792       x = NEXT_INSN (x);
1793     }
1794
1795   if (num_bb_notes != n_basic_blocks)
1796     internal_error
1797       ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
1798        num_bb_notes, n_basic_blocks);
1799
1800   if (err)
1801     internal_error ("verify_flow_info failed.");
1802
1803   /* Clean up.  */
1804   free (bb_info);
1805   free (last_visited);
1806   free (edge_checksum);
1807 }
1808 \f
1809 /* Assume that the preceeding pass has possibly eliminated jump instructions
1810    or converted the unconditional jumps.  Eliminate the edges from CFG.
1811    Return true if any edges are eliminated.  */
1812
1813 bool
1814 purge_dead_edges (bb)
1815      basic_block bb;
1816 {
1817   edge e, next;
1818   rtx insn = bb->end;
1819   bool purged = false;
1820
1821   if (GET_CODE (insn) == JUMP_INSN && !simplejump_p (insn))
1822     return false;
1823   if (GET_CODE (insn) == JUMP_INSN)
1824     {
1825       rtx note;
1826       edge b,f;
1827       /* We do care only about conditional jumps and simplejumps.  */
1828       if (!any_condjump_p (insn)
1829           && !returnjump_p (insn)
1830           && !simplejump_p (insn))
1831         return false;
1832       for (e = bb->succ; e; e = next)
1833         {
1834           next = e->succ_next;
1835
1836           /* Check purposes we can have edge.  */
1837           if ((e->flags & EDGE_FALLTHRU)
1838               && any_condjump_p (insn))
1839             continue;
1840           if (e->dest != EXIT_BLOCK_PTR
1841               && e->dest->head == JUMP_LABEL (insn))
1842             continue;
1843           if (e->dest == EXIT_BLOCK_PTR
1844               && returnjump_p (insn))
1845             continue;
1846           purged = true;
1847           remove_edge (e);
1848         }
1849       if (!bb->succ || !purged)
1850         return false;
1851       if (rtl_dump_file)
1852         fprintf (rtl_dump_file, "Purged edges from bb %i\n", bb->index);
1853       if (!optimize)
1854         return purged;
1855
1856       /* Redistribute probabilities.  */
1857       if (!bb->succ->succ_next)
1858         {
1859           bb->succ->probability = REG_BR_PROB_BASE;
1860           bb->succ->count = bb->count;
1861         }
1862       else
1863         {
1864           note = find_reg_note (insn, REG_BR_PROB, NULL);
1865           if (!note)
1866             return purged;
1867           b = BRANCH_EDGE (bb);
1868           f = FALLTHRU_EDGE (bb);
1869           b->probability = INTVAL (XEXP (note, 0));
1870           f->probability = REG_BR_PROB_BASE - b->probability;
1871           b->count = bb->count * b->probability / REG_BR_PROB_BASE;
1872           f->count = bb->count * f->probability / REG_BR_PROB_BASE;
1873         }
1874       return purged;
1875     }
1876
1877   /* Cleanup abnormal edges caused by throwing insns that have been
1878      eliminated.  */
1879   if (! can_throw_internal (bb->end))
1880     for (e = bb->succ; e; e = next)
1881       {
1882         next = e->succ_next;
1883         if (e->flags & EDGE_EH)
1884           {
1885             remove_edge (e);
1886             purged = true;
1887           }
1888       }
1889
1890   /* If we don't see a jump insn, we don't know exactly why the block would
1891      have been broken at this point.  Look for a simple, non-fallthru edge,
1892      as these are only created by conditional branches.  If we find such an
1893      edge we know that there used to be a jump here and can then safely
1894      remove all non-fallthru edges.  */
1895   for (e = bb->succ; e && (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU));
1896        e = e->succ_next);
1897   if (!e)
1898     return purged;
1899   for (e = bb->succ; e; e = next)
1900     {
1901       next = e->succ_next;
1902       if (!(e->flags & EDGE_FALLTHRU))
1903         remove_edge (e), purged = true;
1904     }
1905   if (!bb->succ || bb->succ->succ_next)
1906     abort ();
1907   bb->succ->probability = REG_BR_PROB_BASE;
1908   bb->succ->count = bb->count;
1909
1910   if (rtl_dump_file)
1911     fprintf (rtl_dump_file, "Purged non-fallthru edges from bb %i\n",
1912              bb->index);
1913   return purged;
1914 }
1915
1916 /* Search all basic blocks for potentionally dead edges and purge them.
1917
1918    Return true ifif some edge has been elliminated.
1919  */
1920
1921 bool
1922 purge_all_dead_edges ()
1923 {
1924   int i, purged = false;
1925   for (i = 0; i < n_basic_blocks; i++)
1926     purged |= purge_dead_edges (BASIC_BLOCK (i));
1927   return purged;
1928 }