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