OSDN Git Service

* basic-block.h (flow_delete_insn, flow_delete_insn_chain): Kill.
[pf3gnuchains/gcc-fork.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          delete_insn, 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 delete_insn (insn)
246      rtx insn;
247 {
248   rtx next = NEXT_INSN (insn);
249   rtx note;
250   bool really_delete = true;
251
252   if (GET_CODE (insn) == CODE_LABEL)
253     {
254       /* Some labels can't be directly removed from the INSN chain, as they
255          might be references via variables, constant pool etc. 
256          Convert them to the special NOTE_INSN_DELETED_LABEL note.  */
257       if (! can_delete_label_p (insn))
258         {
259           const char *name = LABEL_NAME (insn);
260
261           really_delete = false;
262           PUT_CODE (insn, NOTE);
263           NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED_LABEL;
264           NOTE_SOURCE_FILE (insn) = name;
265         }
266       remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
267     }
268
269   if (really_delete)
270     {
271       remove_insn (insn);
272       INSN_DELETED_P (insn) = 1;
273     }
274
275   /* If deleting a jump, decrement the use count of the label.  Deleting
276      the label itself should happen in the normal course of block merging.  */
277   if (GET_CODE (insn) == JUMP_INSN
278       && JUMP_LABEL (insn)
279       && GET_CODE (JUMP_LABEL (insn)) == CODE_LABEL)
280     LABEL_NUSES (JUMP_LABEL (insn))--;
281
282   /* Also if deleting an insn that references a label.  */
283   else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX
284            && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
285     LABEL_NUSES (XEXP (note, 0))--;
286
287   if (GET_CODE (insn) == JUMP_INSN
288       && (GET_CODE (PATTERN (insn)) == ADDR_VEC
289           || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
290     {
291       rtx pat = PATTERN (insn);
292       int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
293       int len = XVECLEN (pat, diff_vec_p);
294       int i;
295
296       for (i = 0; i < len; i++)
297         LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))--;
298     }
299
300   return next;
301 }
302
303 /* Unlink a chain of insns between START and FINISH, leaving notes
304    that must be paired.  */
305
306 void
307 delete_insn_chain (start, finish)
308      rtx start, finish;
309 {
310   /* Unchain the insns one by one.  It would be quicker to delete all
311      of these with a single unchaining, rather than one at a time, but
312      we need to keep the NOTE's.  */
313
314   rtx next;
315
316   while (1)
317     {
318       next = NEXT_INSN (start);
319       if (GET_CODE (start) == NOTE && !can_delete_note_p (start))
320         ;
321       else
322         next = delete_insn (start);
323
324       if (start == finish)
325         break;
326       start = next;
327     }
328 }
329 \f
330 /* Create a new basic block consisting of the instructions between
331    HEAD and END inclusive.  This function is designed to allow fast
332    BB construction - reuses the note and basic block struct
333    in BB_NOTE, if any and do not grow BASIC_BLOCK chain and should
334    be used directly only by CFG construction code.
335    END can be NULL in to create new empty basic block before HEAD.
336    Both END and HEAD can be NULL to create basic block at the end of
337    INSN chain.  */
338
339 basic_block
340 create_basic_block_structure (index, head, end, bb_note)
341      int index;
342      rtx head, end, bb_note;
343 {
344   basic_block bb;
345
346   if (bb_note
347       && ! RTX_INTEGRATED_P (bb_note)
348       && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
349       && bb->aux == NULL)
350     {
351       /* If we found an existing note, thread it back onto the chain.  */
352
353       rtx after;
354
355       if (GET_CODE (head) == CODE_LABEL)
356         after = head;
357       else
358         {
359           after = PREV_INSN (head);
360           head = bb_note;
361         }
362
363       if (after != bb_note && NEXT_INSN (after) != bb_note)
364         reorder_insns (bb_note, bb_note, after);
365     }
366   else
367     {
368       /* Otherwise we must create a note and a basic block structure.
369          Since we allow basic block structs in rtl, give the struct
370          the same lifetime by allocating it off the function obstack
371          rather than using malloc.  */
372
373       bb = (basic_block) obstack_alloc (&flow_obstack, sizeof (*bb));
374       memset (bb, 0, sizeof (*bb));
375
376       if (!head && !end)
377         {
378           head = end = bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK,
379                                                   get_last_insn ());
380         }
381       else if (GET_CODE (head) == CODE_LABEL && end)
382         {
383           bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
384           if (head == end)
385             end = bb_note;
386         }
387       else
388         {
389           bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
390           head = bb_note;
391           if (!end)
392             end = head;
393         }
394       NOTE_BASIC_BLOCK (bb_note) = bb;
395     }
396
397   /* Always include the bb note in the block.  */
398   if (NEXT_INSN (end) == bb_note)
399     end = bb_note;
400
401   bb->head = head;
402   bb->end = end;
403   bb->index = index;
404   BASIC_BLOCK (index) = bb;
405   if (basic_block_for_insn)
406     update_bb_for_insn (bb);
407
408   /* Tag the block so that we know it has been used when considering
409      other basic block notes.  */
410   bb->aux = bb;
411
412   return bb;
413 }
414
415 /* Create new basic block consisting of instructions in between HEAD and
416    END and place it to the BB chain at possition INDEX.
417    END can be NULL in to create new empty basic block before HEAD.
418    Both END and HEAD can be NULL to create basic block at the end of
419    INSN chain.  */
420
421 basic_block
422 create_basic_block (index, head, end)
423      int index;
424      rtx head, end;
425 {
426   basic_block bb;
427   int i;
428
429   /* Place the new block just after the block being split.  */
430   VARRAY_GROW (basic_block_info, ++n_basic_blocks);
431
432   /* Some parts of the compiler expect blocks to be number in
433      sequential order so insert the new block immediately after the
434      block being split..  */
435   for (i = n_basic_blocks - 1; i > index; --i)
436     {
437       basic_block tmp = BASIC_BLOCK (i - 1);
438       BASIC_BLOCK (i) = tmp;
439       tmp->index = i;
440     }
441
442   bb = create_basic_block_structure (index, head, end, NULL);
443   bb->aux = NULL;
444   return bb;
445 }
446
447 /* Remove block B from the basic block array and compact behind it.  */
448
449 void
450 expunge_block (b)
451      basic_block b;
452 {
453   int i, n = n_basic_blocks;
454
455   for (i = b->index; i + 1 < n; ++i)
456     {
457       basic_block x = BASIC_BLOCK (i + 1);
458       BASIC_BLOCK (i) = x;
459       x->index = i;
460     }
461
462   /* Invalidate data to make bughunting easier.  */
463   memset (b, 0, sizeof (*b));
464   b->index = -3;
465   basic_block_info->num_elements--;
466   n_basic_blocks--;
467 }
468
469 /* Delete the insns in a (non-live) block.  We physically delete every
470    non-deleted-note insn, and update the flow graph appropriately.
471
472    Return nonzero if we deleted an exception handler.  */
473
474 /* ??? Preserving all such notes strikes me as wrong.  It would be nice
475    to post-process the stream to remove empty blocks, loops, ranges, etc.  */
476
477 int
478 flow_delete_block (b)
479      basic_block b;
480 {
481   int deleted_handler = 0;
482   rtx insn, end, tmp;
483
484   /* If the head of this block is a CODE_LABEL, then it might be the
485      label for an exception handler which can't be reached.
486
487      We need to remove the label from the exception_handler_label list
488      and remove the associated NOTE_INSN_EH_REGION_BEG and
489      NOTE_INSN_EH_REGION_END notes.  */
490
491   insn = b->head;
492
493   never_reached_warning (insn);
494
495   if (GET_CODE (insn) == CODE_LABEL)
496     maybe_remove_eh_handler (insn);
497
498   /* Include any jump table following the basic block.  */
499   end = b->end;
500   if (GET_CODE (end) == JUMP_INSN
501       && (tmp = JUMP_LABEL (end)) != NULL_RTX
502       && (tmp = NEXT_INSN (tmp)) != NULL_RTX
503       && GET_CODE (tmp) == JUMP_INSN
504       && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
505           || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
506     end = tmp;
507
508   /* Include any barrier that may follow the basic block.  */
509   tmp = next_nonnote_insn (end);
510   if (tmp && GET_CODE (tmp) == BARRIER)
511     end = tmp;
512
513   /* Selectively delete the entire chain.  */
514   b->head = NULL;
515   delete_insn_chain (insn, end);
516
517   /* Remove the edges into and out of this block.  Note that there may
518      indeed be edges in, if we are removing an unreachable loop.  */
519   while (b->pred != NULL)
520     remove_edge (b->pred);
521   while (b->succ != NULL)
522     remove_edge (b->succ);
523
524   b->pred = NULL;
525   b->succ = NULL;
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   /* Normally there should only be one successor of A and that is B, but
962      partway though the merge of blocks for conditional_execution we'll
963      be merging a TEST block with THEN and ELSE successors.  Free the
964      whole lot of them and hope the caller knows what they're doing.  */
965   while (a->succ)
966     remove_edge (a->succ);
967
968   /* Adjust the edges out of B for the new owner.  */
969   for (e = b->succ; e; e = e->succ_next)
970     e->src = a;
971   a->succ = b->succ;
972
973   /* B hasn't quite yet ceased to exist.  Attempt to prevent mishap.  */
974   b->pred = b->succ = NULL;
975
976   expunge_block (b);
977
978   /* Delete everything marked above as well as crap that might be
979      hanging out between the two blocks.  */
980   delete_insn_chain (del_first, del_last);
981
982   /* Reassociate the insns of B with A.  */
983   if (!b_empty)
984     {
985       rtx x = a_end;
986       if (basic_block_for_insn)
987         {
988           BLOCK_FOR_INSN (x) = a;
989           while (x != b_end)
990             {
991               x = NEXT_INSN (x);
992               BLOCK_FOR_INSN (x) = a;
993             }
994         }
995       a_end = b_end;
996     }
997   a->end = a_end;
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       if (rtl_dump_file)
1059         fprintf (rtl_dump_file, "Removing jump %i.\n", INSN_UID (insn));
1060       fallthru = 1;
1061
1062       /* Selectivly unlink whole insn chain.  */
1063       delete_insn_chain (kill_from, PREV_INSN (target->head));
1064     }
1065   /* If this already is simplejump, redirect it.  */
1066   else if (simplejump_p (insn))
1067     {
1068       if (e->dest == target)
1069         return false;
1070       if (rtl_dump_file)
1071         fprintf (rtl_dump_file, "Redirecting jump %i from %i to %i.\n",
1072                  INSN_UID (insn), e->dest->index, target->index);
1073       redirect_jump (insn, block_label (target), 0);
1074     }
1075   /* Or replace possibly complicated jump insn by simple jump insn.  */
1076   else
1077     {
1078       rtx target_label = block_label (target);
1079       rtx barrier;
1080
1081       emit_jump_insn_after (gen_jump (target_label), kill_from);
1082       JUMP_LABEL (src->end) = target_label;
1083       LABEL_NUSES (target_label)++;
1084       if (rtl_dump_file)
1085         fprintf (rtl_dump_file, "Replacing insn %i by jump %i\n",
1086                  INSN_UID (insn), INSN_UID (src->end));
1087
1088       delete_insn_chain (kill_from, insn);
1089
1090       barrier = next_nonnote_insn (src->end);
1091       if (!barrier || GET_CODE (barrier) != BARRIER)
1092         emit_barrier_after (src->end);
1093     }
1094
1095   /* Keep only one edge out and set proper flags.  */
1096   while (src->succ->succ_next)
1097     remove_edge (src->succ);
1098   e = src->succ;
1099   if (fallthru)
1100     e->flags = EDGE_FALLTHRU;
1101   else
1102     e->flags = 0;
1103   e->probability = REG_BR_PROB_BASE;
1104   e->count = src->count;
1105
1106   /* We don't want a block to end on a line-number note since that has
1107      the potential of changing the code between -g and not -g.  */
1108   while (GET_CODE (e->src->end) == NOTE
1109          && NOTE_LINE_NUMBER (e->src->end) >= 0)
1110     delete_insn (e->src->end);
1111
1112   if (e->dest != target)
1113     redirect_edge_succ (e, target);
1114   return true;
1115 }
1116
1117 /* Return last loop_beg note appearing after INSN, before start of next
1118    basic block.  Return INSN if there are no such notes.
1119
1120    When emmiting jump to redirect an fallthru edge, it should always
1121    appear after the LOOP_BEG notes, as loop optimizer expect loop to
1122    eighter start by fallthru edge or jump following the LOOP_BEG note
1123    jumping to the loop exit test.  */
1124
1125 static rtx
1126 last_loop_beg_note (insn)
1127      rtx insn;
1128 {
1129   rtx last = insn;
1130   insn = NEXT_INSN (insn);
1131   while (insn && GET_CODE (insn) == NOTE
1132          && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK)
1133     {
1134       if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1135         last = insn;
1136       insn = NEXT_INSN (insn);
1137     }
1138   return last;
1139 }
1140
1141 /* Attempt to change code to redirect edge E to TARGET.
1142    Don't do that on expense of adding new instructions or reordering
1143    basic blocks.
1144
1145    Function can be also called with edge destionation equivalent to the
1146    TARGET.  Then it should try the simplifications and do nothing if
1147    none is possible.
1148
1149    Return true if transformation suceeded.  We still return flase in case
1150    E already destinated TARGET and we didn't managed to simplify instruction
1151    stream.  */
1152
1153 bool
1154 redirect_edge_and_branch (e, target)
1155      edge e;
1156      basic_block target;
1157 {
1158   rtx tmp;
1159   rtx old_label = e->dest->head;
1160   basic_block src = e->src;
1161   rtx insn = src->end;
1162
1163   if (e->flags & EDGE_COMPLEX)
1164     return false;
1165
1166   if (try_redirect_by_replacing_jump (e, target))
1167     return true;
1168   /* Do this fast path late, as we want above code to simplify for cases
1169      where called on single edge leaving basic block containing nontrivial
1170      jump insn.  */
1171   else if (e->dest == target)
1172     return false;
1173
1174   /* We can only redirect non-fallthru edges of jump insn.  */
1175   if (e->flags & EDGE_FALLTHRU)
1176     return false;
1177   if (GET_CODE (insn) != JUMP_INSN)
1178     return false;
1179
1180   /* Recognize a tablejump and adjust all matching cases.  */
1181   if ((tmp = JUMP_LABEL (insn)) != NULL_RTX
1182       && (tmp = NEXT_INSN (tmp)) != NULL_RTX
1183       && GET_CODE (tmp) == JUMP_INSN
1184       && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
1185           || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
1186     {
1187       rtvec vec;
1188       int j;
1189       rtx new_label = block_label (target);
1190
1191       if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
1192         vec = XVEC (PATTERN (tmp), 0);
1193       else
1194         vec = XVEC (PATTERN (tmp), 1);
1195
1196       for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
1197         if (XEXP (RTVEC_ELT (vec, j), 0) == old_label)
1198           {
1199             RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (Pmode, new_label);
1200             --LABEL_NUSES (old_label);
1201             ++LABEL_NUSES (new_label);
1202           }
1203
1204       /* Handle casesi dispatch insns */
1205       if ((tmp = single_set (insn)) != NULL
1206           && SET_DEST (tmp) == pc_rtx
1207           && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
1208           && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF
1209           && XEXP (XEXP (SET_SRC (tmp), 2), 0) == old_label)
1210         {
1211           XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (VOIDmode,
1212                                                        new_label);
1213           --LABEL_NUSES (old_label);
1214           ++LABEL_NUSES (new_label);
1215         }
1216     }
1217   else
1218     {
1219       /* ?? We may play the games with moving the named labels from
1220          one basic block to the other in case only one computed_jump is
1221          available.  */
1222       if (computed_jump_p (insn))
1223         return false;
1224
1225       /* A return instruction can't be redirected.  */
1226       if (returnjump_p (insn))
1227         return false;
1228
1229       /* If the insn doesn't go where we think, we're confused.  */
1230       if (JUMP_LABEL (insn) != old_label)
1231         abort ();
1232       redirect_jump (insn, block_label (target), 0);
1233     }
1234
1235   if (rtl_dump_file)
1236     fprintf (rtl_dump_file, "Edge %i->%i redirected to %i\n",
1237              e->src->index, e->dest->index, target->index);
1238   if (e->dest != target)
1239     redirect_edge_succ_nodup (e, target);
1240   return true;
1241 }
1242
1243 /* Like force_nonfallthru bellow, but additionally performs redirection
1244    Used by redirect_edge_and_branch_force.  */
1245
1246 static basic_block
1247 force_nonfallthru_and_redirect (e, target)
1248      edge e;
1249      basic_block target;
1250 {
1251   basic_block jump_block, new_bb = NULL;
1252   rtx note;
1253   edge new_edge;
1254
1255   if (e->flags & EDGE_ABNORMAL)
1256     abort ();
1257   if (!(e->flags & EDGE_FALLTHRU))
1258     abort ();
1259   if (e->src->succ->succ_next)
1260     {
1261       /* Create the new structures.  */
1262       note = last_loop_beg_note (e->src->end);
1263       jump_block = create_basic_block (e->src->index + 1, NEXT_INSN (note), NULL);
1264       jump_block->count = e->count;
1265       jump_block->frequency = EDGE_FREQUENCY (e);
1266       jump_block->loop_depth = target->loop_depth;
1267
1268       if (target->global_live_at_start)
1269         {
1270           jump_block->global_live_at_start =
1271             OBSTACK_ALLOC_REG_SET (&flow_obstack);
1272           jump_block->global_live_at_end =
1273             OBSTACK_ALLOC_REG_SET (&flow_obstack);
1274           COPY_REG_SET (jump_block->global_live_at_start,
1275                         target->global_live_at_start);
1276           COPY_REG_SET (jump_block->global_live_at_end,
1277                         target->global_live_at_start);
1278         }
1279
1280       /* Wire edge in.  */
1281       new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
1282       new_edge->probability = e->probability;
1283       new_edge->count = e->count;
1284
1285       /* Redirect old edge.  */
1286       redirect_edge_pred (e, jump_block);
1287       e->probability = REG_BR_PROB_BASE;
1288
1289       new_bb = jump_block;
1290     }
1291   else
1292     jump_block = e->src;
1293   e->flags &= ~EDGE_FALLTHRU;
1294   if (target == EXIT_BLOCK_PTR)
1295     {
1296       if (HAVE_return)
1297         emit_jump_insn_after (gen_return (), jump_block->end);
1298       else
1299         abort ();
1300     }
1301   else
1302     {
1303       rtx label = block_label (target);
1304       emit_jump_insn_after (gen_jump (label), jump_block->end);
1305       JUMP_LABEL (jump_block->end) = label;
1306       LABEL_NUSES (label)++;
1307     }
1308   emit_barrier_after (jump_block->end);
1309   redirect_edge_succ_nodup (e, target);
1310
1311   return new_bb;
1312 }
1313
1314 /* Edge E is assumed to be fallthru edge.  Emit needed jump instruction
1315    (and possibly create new basic block) to make edge non-fallthru.
1316    Return newly created BB or NULL if none.  */
1317 basic_block
1318 force_nonfallthru (e)
1319      edge e;
1320 {
1321   return force_nonfallthru_and_redirect (e, e->dest);
1322 }
1323
1324 /* Redirect edge even at the expense of creating new jump insn or
1325    basic block.  Return new basic block if created, NULL otherwise.
1326    Abort if converison is impossible.  */
1327
1328 basic_block
1329 redirect_edge_and_branch_force (e, target)
1330      edge e;
1331      basic_block target;
1332 {
1333   basic_block new_bb;
1334
1335   if (redirect_edge_and_branch (e, target))
1336     return NULL;
1337   if (e->dest == target)
1338     return NULL;
1339
1340   /* In case the edge redirection failed, try to force it to be non-fallthru
1341      and redirect newly created simplejump.  */
1342   new_bb = force_nonfallthru_and_redirect (e, target);
1343   return new_bb;
1344 }
1345
1346 /* The given edge should potentially be a fallthru edge.  If that is in
1347    fact true, delete the jump and barriers that are in the way.  */
1348
1349 void
1350 tidy_fallthru_edge (e, b, c)
1351      edge e;
1352      basic_block b, c;
1353 {
1354   rtx q;
1355
1356   /* ??? In a late-running flow pass, other folks may have deleted basic
1357      blocks by nopping out blocks, leaving multiple BARRIERs between here
1358      and the target label. They ought to be chastized and fixed.
1359
1360      We can also wind up with a sequence of undeletable labels between
1361      one block and the next.
1362
1363      So search through a sequence of barriers, labels, and notes for
1364      the head of block C and assert that we really do fall through.  */
1365
1366   if (next_real_insn (b->end) != next_real_insn (PREV_INSN (c->head)))
1367     return;
1368
1369   /* Remove what will soon cease being the jump insn from the source block.
1370      If block B consisted only of this single jump, turn it into a deleted
1371      note.  */
1372   q = b->end;
1373   if (GET_CODE (q) == JUMP_INSN
1374       && onlyjump_p (q)
1375       && (any_uncondjump_p (q)
1376           || (b->succ == e && e->succ_next == NULL)))
1377     {
1378 #ifdef HAVE_cc0
1379       /* If this was a conditional jump, we need to also delete
1380          the insn that set cc0.  */
1381       if (any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1382         q = PREV_INSN (q);
1383 #endif
1384
1385       q = PREV_INSN (q);
1386
1387       /* We don't want a block to end on a line-number note since that has
1388          the potential of changing the code between -g and not -g.  */
1389       while (GET_CODE (q) == NOTE && NOTE_LINE_NUMBER (q) >= 0)
1390         q = PREV_INSN (q);
1391     }
1392
1393   /* Selectively unlink the sequence.  */
1394   if (q != PREV_INSN (c->head))
1395     delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
1396
1397   e->flags |= EDGE_FALLTHRU;
1398 }
1399
1400 /* Fix up edges that now fall through, or rather should now fall through
1401    but previously required a jump around now deleted blocks.  Simplify
1402    the search by only examining blocks numerically adjacent, since this
1403    is how find_basic_blocks created them.  */
1404
1405 void
1406 tidy_fallthru_edges ()
1407 {
1408   int i;
1409
1410   for (i = 1; i < n_basic_blocks; ++i)
1411     {
1412       basic_block b = BASIC_BLOCK (i - 1);
1413       basic_block c = BASIC_BLOCK (i);
1414       edge s;
1415
1416       /* We care about simple conditional or unconditional jumps with
1417          a single successor.
1418
1419          If we had a conditional branch to the next instruction when
1420          find_basic_blocks was called, then there will only be one
1421          out edge for the block which ended with the conditional
1422          branch (since we do not create duplicate edges).
1423
1424          Furthermore, the edge will be marked as a fallthru because we
1425          merge the flags for the duplicate edges.  So we do not want to
1426          check that the edge is not a FALLTHRU edge.  */
1427       if ((s = b->succ) != NULL
1428           && ! (s->flags & EDGE_COMPLEX)
1429           && s->succ_next == NULL
1430           && s->dest == c
1431           /* If the jump insn has side effects, we can't tidy the edge.  */
1432           && (GET_CODE (b->end) != JUMP_INSN
1433               || onlyjump_p (b->end)))
1434         tidy_fallthru_edge (s, b, c);
1435     }
1436 }
1437 \f
1438 /* Helper function for split_edge.  Return true in case edge BB2 to BB1
1439    is back edge of syntactic loop.  */
1440
1441 static bool
1442 back_edge_of_syntactic_loop_p (bb1, bb2)
1443         basic_block bb1, bb2;
1444 {
1445   rtx insn;
1446   int count = 0;
1447
1448   if (bb1->index > bb2->index)
1449     return false;
1450
1451   if (bb1->index == bb2->index)
1452     return true;
1453
1454   for (insn = bb1->end; insn != bb2->head && count >= 0;
1455        insn = NEXT_INSN (insn))
1456     if (GET_CODE (insn) == NOTE)
1457       {
1458         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1459           count++;
1460         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
1461           count--;
1462       }
1463
1464   return count >= 0;
1465 }
1466
1467 /* Split a (typically critical) edge.  Return the new block.
1468    Abort on abnormal edges.
1469
1470    ??? The code generally expects to be called on critical edges.
1471    The case of a block ending in an unconditional jump to a
1472    block with multiple predecessors is not handled optimally.  */
1473
1474 basic_block
1475 split_edge (edge_in)
1476      edge edge_in;
1477 {
1478   basic_block bb;
1479   edge edge_out;
1480   rtx before;
1481
1482   /* Abnormal edges cannot be split.  */
1483   if ((edge_in->flags & EDGE_ABNORMAL) != 0)
1484     abort ();
1485
1486   /* We are going to place the new block in front of edge destination.
1487      Avoid existence of fallthru predecesors.  */
1488   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1489     {
1490       edge e;
1491       for (e = edge_in->dest->pred; e; e = e->pred_next)
1492         if (e->flags & EDGE_FALLTHRU)
1493           break;
1494
1495       if (e)
1496         force_nonfallthru (e);
1497     }
1498
1499   /* Create the basic block note.
1500
1501      Where we place the note can have a noticable impact on the generated
1502      code.  Consider this cfg:
1503
1504                         E
1505                         |
1506                         0
1507                        / \
1508                    +->1-->2--->E
1509                    |  |
1510                    +--+
1511
1512       If we need to insert an insn on the edge from block 0 to block 1,
1513       we want to ensure the instructions we insert are outside of any
1514       loop notes that physically sit between block 0 and block 1.  Otherwise
1515       we confuse the loop optimizer into thinking the loop is a phony.  */
1516
1517   if (edge_in->dest != EXIT_BLOCK_PTR
1518       && PREV_INSN (edge_in->dest->head)
1519       && GET_CODE (PREV_INSN (edge_in->dest->head)) == NOTE
1520       && NOTE_LINE_NUMBER (PREV_INSN (edge_in->dest->head)) == NOTE_INSN_LOOP_BEG
1521       && !back_edge_of_syntactic_loop_p (edge_in->dest, edge_in->src))
1522     before = PREV_INSN (edge_in->dest->head);
1523   else if (edge_in->dest != EXIT_BLOCK_PTR)
1524     before = edge_in->dest->head;
1525   else
1526     before = NULL_RTX;
1527
1528   bb = create_basic_block (edge_in->dest == EXIT_BLOCK_PTR ? n_basic_blocks
1529                            : edge_in->dest->index, before, NULL);
1530   bb->count = edge_in->count;
1531   bb->frequency = EDGE_FREQUENCY (edge_in);
1532
1533   /* ??? This info is likely going to be out of date very soon.  */
1534   if (edge_in->dest->global_live_at_start)
1535     {
1536       bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1537       bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1538       COPY_REG_SET (bb->global_live_at_start, edge_in->dest->global_live_at_start);
1539       COPY_REG_SET (bb->global_live_at_end, edge_in->dest->global_live_at_start);
1540     }
1541
1542   edge_out = make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
1543
1544   /* For non-fallthry edges, we must adjust the predecessor's
1545      jump instruction to target our new block.  */
1546   if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1547     {
1548       if (!redirect_edge_and_branch (edge_in, bb))
1549         abort ();
1550     }
1551   else
1552     redirect_edge_succ (edge_in, bb);
1553
1554   return bb;
1555 }
1556
1557 /* Queue instructions for insertion on an edge between two basic blocks.
1558    The new instructions and basic blocks (if any) will not appear in the
1559    CFG until commit_edge_insertions is called.  */
1560
1561 void
1562 insert_insn_on_edge (pattern, e)
1563      rtx pattern;
1564      edge e;
1565 {
1566   /* We cannot insert instructions on an abnormal critical edge.
1567      It will be easier to find the culprit if we die now.  */
1568   if ((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
1569     abort ();
1570
1571   if (e->insns == NULL_RTX)
1572     start_sequence ();
1573   else
1574     push_to_sequence (e->insns);
1575
1576   emit_insn (pattern);
1577
1578   e->insns = get_insns ();
1579   end_sequence ();
1580 }
1581
1582 /* Update the CFG for the instructions queued on edge E.  */
1583
1584 static void
1585 commit_one_edge_insertion (e)
1586      edge e;
1587 {
1588   rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1589   basic_block bb;
1590
1591   /* Pull the insns off the edge now since the edge might go away.  */
1592   insns = e->insns;
1593   e->insns = NULL_RTX;
1594
1595   /* Figure out where to put these things.  If the destination has
1596      one predecessor, insert there.  Except for the exit block.  */
1597   if (e->dest->pred->pred_next == NULL
1598       && e->dest != EXIT_BLOCK_PTR)
1599     {
1600       bb = e->dest;
1601
1602       /* Get the location correct wrt a code label, and "nice" wrt
1603          a basic block note, and before everything else.  */
1604       tmp = bb->head;
1605       if (GET_CODE (tmp) == CODE_LABEL)
1606         tmp = NEXT_INSN (tmp);
1607       if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1608         tmp = NEXT_INSN (tmp);
1609       if (tmp == bb->head)
1610         before = tmp;
1611       else
1612         after = PREV_INSN (tmp);
1613     }
1614
1615   /* If the source has one successor and the edge is not abnormal,
1616      insert there.  Except for the entry block.  */
1617   else if ((e->flags & EDGE_ABNORMAL) == 0
1618            && e->src->succ->succ_next == NULL
1619            && e->src != ENTRY_BLOCK_PTR)
1620     {
1621       bb = e->src;
1622       /* It is possible to have a non-simple jump here.  Consider a target
1623          where some forms of unconditional jumps clobber a register.  This
1624          happens on the fr30 for example.
1625
1626          We know this block has a single successor, so we can just emit
1627          the queued insns before the jump.  */
1628       if (GET_CODE (bb->end) == JUMP_INSN)
1629         {
1630           before = bb->end;
1631           while (GET_CODE (PREV_INSN (before)) == NOTE
1632                  && NOTE_LINE_NUMBER (PREV_INSN (before)) == NOTE_INSN_LOOP_BEG)
1633             before = PREV_INSN (before);
1634         }
1635       else
1636         {
1637           /* We'd better be fallthru, or we've lost track of what's what.  */
1638           if ((e->flags & EDGE_FALLTHRU) == 0)
1639             abort ();
1640
1641           after = bb->end;
1642         }
1643     }
1644
1645   /* Otherwise we must split the edge.  */
1646   else
1647     {
1648       bb = split_edge (e);
1649       after = bb->end;
1650     }
1651
1652   /* Now that we've found the spot, do the insertion.  */
1653
1654   if (before)
1655     {
1656       emit_insns_before (insns, before);
1657       last = prev_nonnote_insn (before);
1658     }
1659   else
1660     last = emit_insns_after (insns, after);
1661
1662   if (returnjump_p (last))
1663     {
1664       /* ??? Remove all outgoing edges from BB and add one for EXIT.
1665          This is not currently a problem because this only happens
1666          for the (single) epilogue, which already has a fallthru edge
1667          to EXIT.  */
1668
1669       e = bb->succ;
1670       if (e->dest != EXIT_BLOCK_PTR
1671           || e->succ_next != NULL
1672           || (e->flags & EDGE_FALLTHRU) == 0)
1673         abort ();
1674       e->flags &= ~EDGE_FALLTHRU;
1675
1676       emit_barrier_after (last);
1677
1678       if (before)
1679         delete_insn (before);
1680     }
1681   else if (GET_CODE (last) == JUMP_INSN)
1682     abort ();
1683   find_sub_basic_blocks (bb);
1684 }
1685
1686 /* Update the CFG for all queued instructions.  */
1687
1688 void
1689 commit_edge_insertions ()
1690 {
1691   int i;
1692   basic_block bb;
1693
1694 #ifdef ENABLE_CHECKING
1695   verify_flow_info ();
1696 #endif
1697
1698   i = -1;
1699   bb = ENTRY_BLOCK_PTR;
1700   while (1)
1701     {
1702       edge e, next;
1703
1704       for (e = bb->succ; e; e = next)
1705         {
1706           next = e->succ_next;
1707           if (e->insns)
1708             commit_one_edge_insertion (e);
1709         }
1710
1711       if (++i >= n_basic_blocks)
1712         break;
1713       bb = BASIC_BLOCK (i);
1714     }
1715 }
1716 \f
1717 void
1718 dump_flow_info (file)
1719      FILE *file;
1720 {
1721   register int i;
1722   static const char * const reg_class_names[] = REG_CLASS_NAMES;
1723
1724   fprintf (file, "%d registers.\n", max_regno);
1725   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
1726     if (REG_N_REFS (i))
1727       {
1728         enum reg_class class, altclass;
1729         fprintf (file, "\nRegister %d used %d times across %d insns",
1730                  i, REG_N_REFS (i), REG_LIVE_LENGTH (i));
1731         if (REG_BASIC_BLOCK (i) >= 0)
1732           fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
1733         if (REG_N_SETS (i))
1734           fprintf (file, "; set %d time%s", REG_N_SETS (i),
1735                    (REG_N_SETS (i) == 1) ? "" : "s");
1736         if (REG_USERVAR_P (regno_reg_rtx[i]))
1737           fprintf (file, "; user var");
1738         if (REG_N_DEATHS (i) != 1)
1739           fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
1740         if (REG_N_CALLS_CROSSED (i) == 1)
1741           fprintf (file, "; crosses 1 call");
1742         else if (REG_N_CALLS_CROSSED (i))
1743           fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
1744         if (PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD)
1745           fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i));
1746         class = reg_preferred_class (i);
1747         altclass = reg_alternate_class (i);
1748         if (class != GENERAL_REGS || altclass != ALL_REGS)
1749           {
1750             if (altclass == ALL_REGS || class == ALL_REGS)
1751               fprintf (file, "; pref %s", reg_class_names[(int) class]);
1752             else if (altclass == NO_REGS)
1753               fprintf (file, "; %s or none", reg_class_names[(int) class]);
1754             else
1755               fprintf (file, "; pref %s, else %s",
1756                        reg_class_names[(int) class],
1757                        reg_class_names[(int) altclass]);
1758           }
1759         if (REG_POINTER (regno_reg_rtx[i]))
1760           fprintf (file, "; pointer");
1761         fprintf (file, ".\n");
1762       }
1763
1764   fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks, n_edges);
1765   for (i = 0; i < n_basic_blocks; i++)
1766     {
1767       register basic_block bb = BASIC_BLOCK (i);
1768       register edge e;
1769
1770       fprintf (file, "\nBasic block %d: first insn %d, last %d, loop_depth %d, count ",
1771                i, INSN_UID (bb->head), INSN_UID (bb->end), bb->loop_depth);
1772       fprintf (file, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) bb->count);
1773       fprintf (file, ", freq %i.\n", bb->frequency);
1774
1775       fprintf (file, "Predecessors: ");
1776       for (e = bb->pred; e; e = e->pred_next)
1777         dump_edge_info (file, e, 0);
1778
1779       fprintf (file, "\nSuccessors: ");
1780       for (e = bb->succ; e; e = e->succ_next)
1781         dump_edge_info (file, e, 1);
1782
1783       fprintf (file, "\nRegisters live at start:");
1784       dump_regset (bb->global_live_at_start, file);
1785
1786       fprintf (file, "\nRegisters live at end:");
1787       dump_regset (bb->global_live_at_end, file);
1788
1789       putc ('\n', file);
1790     }
1791
1792   putc ('\n', file);
1793 }
1794
1795 void
1796 debug_flow_info ()
1797 {
1798   dump_flow_info (stderr);
1799 }
1800
1801 void
1802 dump_edge_info (file, e, do_succ)
1803      FILE *file;
1804      edge e;
1805      int do_succ;
1806 {
1807   basic_block side = (do_succ ? e->dest : e->src);
1808
1809   if (side == ENTRY_BLOCK_PTR)
1810     fputs (" ENTRY", file);
1811   else if (side == EXIT_BLOCK_PTR)
1812     fputs (" EXIT", file);
1813   else
1814     fprintf (file, " %d", side->index);
1815
1816   if (e->probability)
1817     fprintf (file, " [%.1f%%] ", e->probability * 100.0 / REG_BR_PROB_BASE);
1818
1819   if (e->count)
1820     {
1821       fprintf (file, " count:");
1822       fprintf (file, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) e->count);
1823     }
1824
1825   if (e->flags)
1826     {
1827       static const char * const bitnames[] = {
1828         "fallthru", "ab", "abcall", "eh", "fake", "dfs_back"
1829       };
1830       int comma = 0;
1831       int i, flags = e->flags;
1832
1833       fputc (' ', file);
1834       fputc ('(', file);
1835       for (i = 0; flags; i++)
1836         if (flags & (1 << i))
1837           {
1838             flags &= ~(1 << i);
1839
1840             if (comma)
1841               fputc (',', file);
1842             if (i < (int) ARRAY_SIZE (bitnames))
1843               fputs (bitnames[i], file);
1844             else
1845               fprintf (file, "%d", i);
1846             comma = 1;
1847           }
1848       fputc (')', file);
1849     }
1850 }
1851 \f
1852 /* Print out one basic block with live information at start and end.  */
1853
1854 void
1855 dump_bb (bb, outf)
1856      basic_block bb;
1857      FILE *outf;
1858 {
1859   rtx insn;
1860   rtx last;
1861   edge e;
1862
1863   fprintf (outf, ";; Basic block %d, loop depth %d, count ",
1864            bb->index, bb->loop_depth);
1865   fprintf (outf, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) bb->count);
1866   putc ('\n', outf);
1867
1868   fputs (";; Predecessors: ", outf);
1869   for (e = bb->pred; e; e = e->pred_next)
1870     dump_edge_info (outf, e, 0);
1871   putc ('\n', outf);
1872
1873   fputs (";; Registers live at start:", outf);
1874   dump_regset (bb->global_live_at_start, outf);
1875   putc ('\n', outf);
1876
1877   for (insn = bb->head, last = NEXT_INSN (bb->end);
1878        insn != last;
1879        insn = NEXT_INSN (insn))
1880     print_rtl_single (outf, insn);
1881
1882   fputs (";; Registers live at end:", outf);
1883   dump_regset (bb->global_live_at_end, outf);
1884   putc ('\n', outf);
1885
1886   fputs (";; Successors: ", outf);
1887   for (e = bb->succ; e; e = e->succ_next)
1888     dump_edge_info (outf, e, 1);
1889   putc ('\n', outf);
1890 }
1891
1892 void
1893 debug_bb (bb)
1894      basic_block bb;
1895 {
1896   dump_bb (bb, stderr);
1897 }
1898
1899 void
1900 debug_bb_n (n)
1901      int n;
1902 {
1903   dump_bb (BASIC_BLOCK (n), stderr);
1904 }
1905
1906 /* Like print_rtl, but also print out live information for the start of each
1907    basic block.  */
1908
1909 void
1910 print_rtl_with_bb (outf, rtx_first)
1911      FILE *outf;
1912      rtx rtx_first;
1913 {
1914   register rtx tmp_rtx;
1915
1916   if (rtx_first == 0)
1917     fprintf (outf, "(nil)\n");
1918   else
1919     {
1920       int i;
1921       enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
1922       int max_uid = get_max_uid ();
1923       basic_block *start = (basic_block *)
1924         xcalloc (max_uid, sizeof (basic_block));
1925       basic_block *end = (basic_block *)
1926         xcalloc (max_uid, sizeof (basic_block));
1927       enum bb_state *in_bb_p = (enum bb_state *)
1928         xcalloc (max_uid, sizeof (enum bb_state));
1929
1930       for (i = n_basic_blocks - 1; i >= 0; i--)
1931         {
1932           basic_block bb = BASIC_BLOCK (i);
1933           rtx x;
1934
1935           start[INSN_UID (bb->head)] = bb;
1936           end[INSN_UID (bb->end)] = bb;
1937           for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x))
1938             {
1939               enum bb_state state = IN_MULTIPLE_BB;
1940               if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1941                 state = IN_ONE_BB;
1942               in_bb_p[INSN_UID (x)] = state;
1943
1944               if (x == bb->end)
1945                 break;
1946             }
1947         }
1948
1949       for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1950         {
1951           int did_output;
1952           basic_block bb;
1953
1954           if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
1955             {
1956               fprintf (outf, ";; Start of basic block %d, registers live:",
1957                        bb->index);
1958               dump_regset (bb->global_live_at_start, outf);
1959               putc ('\n', outf);
1960             }
1961
1962           if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1963               && GET_CODE (tmp_rtx) != NOTE
1964               && GET_CODE (tmp_rtx) != BARRIER)
1965             fprintf (outf, ";; Insn is not within a basic block\n");
1966           else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1967             fprintf (outf, ";; Insn is in multiple basic blocks\n");
1968
1969           did_output = print_rtl_single (outf, tmp_rtx);
1970
1971           if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
1972             {
1973               fprintf (outf, ";; End of basic block %d, registers live:\n",
1974                        bb->index);
1975               dump_regset (bb->global_live_at_end, outf);
1976               putc ('\n', outf);
1977             }
1978
1979           if (did_output)
1980             putc ('\n', outf);
1981         }
1982
1983       free (start);
1984       free (end);
1985       free (in_bb_p);
1986     }
1987
1988   if (current_function_epilogue_delay_list != 0)
1989     {
1990       fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1991       for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
1992            tmp_rtx = XEXP (tmp_rtx, 1))
1993         print_rtl_single (outf, XEXP (tmp_rtx, 0));
1994     }
1995 }
1996 \f
1997 /* Verify the CFG consistency.  This function check some CFG invariants and
1998    aborts when something is wrong.  Hope that this function will help to
1999    convert many optimization passes to preserve CFG consistent.
2000
2001    Currently it does following checks:
2002
2003    - test head/end pointers
2004    - overlapping of basic blocks
2005    - edge list correctness
2006    - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
2007    - tails of basic blocks (ensure that boundary is necesary)
2008    - scans body of the basic block for JUMP_INSN, CODE_LABEL
2009      and NOTE_INSN_BASIC_BLOCK
2010    - check that all insns are in the basic blocks
2011    (except the switch handling code, barriers and notes)
2012    - check that all returns are followed by barriers
2013
2014    In future it can be extended check a lot of other stuff as well
2015    (reachability of basic blocks, life information, etc. etc.).  */
2016
2017 void
2018 verify_flow_info ()
2019 {
2020   const int max_uid = get_max_uid ();
2021   const rtx rtx_first = get_insns ();
2022   rtx last_head = get_last_insn ();
2023   basic_block *bb_info, *last_visited;
2024   size_t *edge_checksum;
2025   rtx x;
2026   int i, last_bb_num_seen, num_bb_notes, err = 0;
2027
2028   bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
2029   last_visited = (basic_block *) xcalloc (n_basic_blocks + 2,
2030                                           sizeof (basic_block));
2031   edge_checksum = (size_t *) xcalloc (n_basic_blocks + 2, sizeof (size_t));
2032
2033   for (i = n_basic_blocks - 1; i >= 0; i--)
2034     {
2035       basic_block bb = BASIC_BLOCK (i);
2036       rtx head = bb->head;
2037       rtx end = bb->end;
2038
2039       /* Verify the end of the basic block is in the INSN chain.  */
2040       for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
2041         if (x == end)
2042           break;
2043       if (!x)
2044         {
2045           error ("End insn %d for block %d not found in the insn stream.",
2046                  INSN_UID (end), bb->index);
2047           err = 1;
2048         }
2049
2050       /* Work backwards from the end to the head of the basic block
2051          to verify the head is in the RTL chain.  */
2052       for (; x != NULL_RTX; x = PREV_INSN (x))
2053         {
2054           /* While walking over the insn chain, verify insns appear
2055              in only one basic block and initialize the BB_INFO array
2056              used by other passes.  */
2057           if (bb_info[INSN_UID (x)] != NULL)
2058             {
2059               error ("Insn %d is in multiple basic blocks (%d and %d)",
2060                      INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
2061               err = 1;
2062             }
2063           bb_info[INSN_UID (x)] = bb;
2064
2065           if (x == head)
2066             break;
2067         }
2068       if (!x)
2069         {
2070           error ("Head insn %d for block %d not found in the insn stream.",
2071                  INSN_UID (head), bb->index);
2072           err = 1;
2073         }
2074
2075       last_head = x;
2076     }
2077
2078   /* Now check the basic blocks (boundaries etc.) */
2079   for (i = n_basic_blocks - 1; i >= 0; i--)
2080     {
2081       basic_block bb = BASIC_BLOCK (i);
2082       int has_fallthru = 0;
2083       edge e;
2084
2085       e = bb->succ;
2086       while (e)
2087         {
2088           if (last_visited [e->dest->index + 2] == bb)
2089             {
2090               error ("verify_flow_info: Duplicate edge %i->%i",
2091                      e->src->index, e->dest->index);
2092               err = 1;
2093             }
2094           last_visited [e->dest->index + 2] = bb;
2095
2096           if (e->flags & EDGE_FALLTHRU)
2097             has_fallthru = 1;
2098
2099           if ((e->flags & EDGE_FALLTHRU)
2100               && e->src != ENTRY_BLOCK_PTR
2101               && e->dest != EXIT_BLOCK_PTR)
2102             {
2103               rtx insn;
2104               if (e->src->index + 1 != e->dest->index)
2105                 {
2106                     error ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
2107                            e->src->index, e->dest->index);
2108                     err = 1;
2109                 }
2110               else
2111                 for (insn = NEXT_INSN (e->src->end); insn != e->dest->head;
2112                      insn = NEXT_INSN (insn))
2113                   if (GET_CODE (insn) == BARRIER || INSN_P (insn))
2114                     {
2115                       error ("verify_flow_info: Incorrect fallthru %i->%i",
2116                              e->src->index, e->dest->index);
2117                       fatal_insn ("Wrong insn in the fallthru edge", insn);
2118                       err = 1;
2119                     }
2120             }
2121           if (e->src != bb)
2122             {
2123               error ("verify_flow_info: Basic block %d succ edge is corrupted",
2124                      bb->index);
2125               fprintf (stderr, "Predecessor: ");
2126               dump_edge_info (stderr, e, 0);
2127               fprintf (stderr, "\nSuccessor: ");
2128               dump_edge_info (stderr, e, 1);
2129               fprintf (stderr, "\n");
2130               err = 1;
2131             }
2132           edge_checksum[e->dest->index + 2] += (size_t) e;
2133           e = e->succ_next;
2134         }
2135       if (!has_fallthru)
2136         {
2137           rtx insn = bb->end;
2138
2139           /* Ensure existence of barrier in BB with no fallthru edges.  */
2140           for (insn = bb->end; GET_CODE (insn) != BARRIER;
2141                insn = NEXT_INSN (insn))
2142             if (!insn
2143                 || (GET_CODE (insn) == NOTE
2144                     && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK))
2145                 {
2146                   error ("Missing barrier after block %i", bb->index);
2147                   err = 1;
2148                 }
2149         }
2150
2151       e = bb->pred;
2152       while (e)
2153         {
2154           if (e->dest != bb)
2155             {
2156               error ("Basic block %d pred edge is corrupted", bb->index);
2157               fputs ("Predecessor: ", stderr);
2158               dump_edge_info (stderr, e, 0);
2159               fputs ("\nSuccessor: ", stderr);
2160               dump_edge_info (stderr, e, 1);
2161               fputc ('\n', stderr);
2162               err = 1;
2163             }
2164           edge_checksum[e->dest->index + 2] -= (size_t) e;
2165           e = e->pred_next;
2166         }
2167        for (x = bb->head; x != NEXT_INSN (bb->end); x = NEXT_INSN (x))
2168          if (basic_block_for_insn && BLOCK_FOR_INSN (x) != bb)
2169            {
2170              debug_rtx (x);
2171              if (! BLOCK_FOR_INSN (x))
2172                error ("Insn %d is inside basic block %d but block_for_insn is NULL",
2173                       INSN_UID (x), bb->index);
2174              else
2175                error ("Insn %d is inside basic block %d but block_for_insn is %i",
2176                       INSN_UID (x), bb->index, BLOCK_FOR_INSN (x)->index);
2177              err = 1;
2178            }
2179
2180       /* OK pointers are correct.  Now check the header of basic
2181          block.  It ought to contain optional CODE_LABEL followed
2182          by NOTE_BASIC_BLOCK.  */
2183       x = bb->head;
2184       if (GET_CODE (x) == CODE_LABEL)
2185         {
2186           if (bb->end == x)
2187             {
2188               error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2189                      bb->index);
2190               err = 1;
2191             }
2192           x = NEXT_INSN (x);
2193         }
2194       if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
2195         {
2196           error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2197                  bb->index);
2198           err = 1;
2199         }
2200
2201       if (bb->end == x)
2202         {
2203           /* Do checks for empty blocks here */
2204         }
2205       else
2206         {
2207           x = NEXT_INSN (x);
2208           while (x)
2209             {
2210               if (NOTE_INSN_BASIC_BLOCK_P (x))
2211                 {
2212                   error ("NOTE_INSN_BASIC_BLOCK %d in the middle of basic block %d",
2213                          INSN_UID (x), bb->index);
2214                   err = 1;
2215                 }
2216
2217               if (x == bb->end)
2218                 break;
2219
2220               if (GET_CODE (x) == JUMP_INSN
2221                   || GET_CODE (x) == CODE_LABEL
2222                   || GET_CODE (x) == BARRIER)
2223                 {
2224                   error ("In basic block %d:", bb->index);
2225                   fatal_insn ("Flow control insn inside a basic block", x);
2226                 }
2227
2228               x = NEXT_INSN (x);
2229             }
2230         }
2231     }
2232
2233   /* Complete edge checksumming for ENTRY and EXIT.  */
2234   {
2235     edge e;
2236     for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2237       edge_checksum[e->dest->index + 2] += (size_t) e;
2238     for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
2239       edge_checksum[e->dest->index + 2] -= (size_t) e;
2240   }
2241
2242   for (i = -2; i < n_basic_blocks; ++i)
2243     if (edge_checksum[i + 2])
2244       {
2245         error ("Basic block %i edge lists are corrupted", i);
2246         err = 1;
2247       }
2248
2249   last_bb_num_seen = -1;
2250   num_bb_notes = 0;
2251   x = rtx_first;
2252   while (x)
2253     {
2254       if (NOTE_INSN_BASIC_BLOCK_P (x))
2255         {
2256           basic_block bb = NOTE_BASIC_BLOCK (x);
2257           num_bb_notes++;
2258           if (bb->index != last_bb_num_seen + 1)
2259             internal_error ("Basic blocks not numbered consecutively.");
2260
2261           last_bb_num_seen = bb->index;
2262         }
2263
2264       if (!bb_info[INSN_UID (x)])
2265         {
2266           switch (GET_CODE (x))
2267             {
2268             case BARRIER:
2269             case NOTE:
2270               break;
2271
2272             case CODE_LABEL:
2273               /* An addr_vec is placed outside any block block.  */
2274               if (NEXT_INSN (x)
2275                   && GET_CODE (NEXT_INSN (x)) == JUMP_INSN
2276                   && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
2277                       || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
2278                 {
2279                   x = NEXT_INSN (x);
2280                 }
2281
2282               /* But in any case, non-deletable labels can appear anywhere.  */
2283               break;
2284
2285             default:
2286               fatal_insn ("Insn outside basic block", x);
2287             }
2288         }
2289
2290       if (INSN_P (x)
2291           && GET_CODE (x) == JUMP_INSN
2292           && returnjump_p (x) && ! condjump_p (x)
2293           && ! (NEXT_INSN (x) && GET_CODE (NEXT_INSN (x)) == BARRIER))
2294             fatal_insn ("Return not followed by barrier", x);
2295
2296       x = NEXT_INSN (x);
2297     }
2298
2299   if (num_bb_notes != n_basic_blocks)
2300     internal_error
2301       ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2302        num_bb_notes, n_basic_blocks);
2303
2304   if (err)
2305     internal_error ("verify_flow_info failed.");
2306
2307   /* Clean up.  */
2308   free (bb_info);
2309   free (last_visited);
2310   free (edge_checksum);
2311 }
2312 \f
2313 /* Assume that the preceeding pass has possibly eliminated jump instructions
2314    or converted the unconditional jumps.  Eliminate the edges from CFG.
2315    Return true if any edges are eliminated.  */
2316
2317 bool
2318 purge_dead_edges (bb)
2319      basic_block bb;
2320 {
2321   edge e, next;
2322   rtx insn = bb->end;
2323   bool purged = false;
2324
2325   if (GET_CODE (insn) == JUMP_INSN && !simplejump_p (insn))
2326     return false;
2327   if (GET_CODE (insn) == JUMP_INSN)
2328     {
2329       rtx note;
2330       edge b,f;
2331       /* We do care only about conditional jumps and simplejumps.  */
2332       if (!any_condjump_p (insn)
2333           && !returnjump_p (insn)
2334           && !simplejump_p (insn))
2335         return false;
2336       for (e = bb->succ; e; e = next)
2337         {
2338           next = e->succ_next;
2339
2340           /* Check purposes we can have edge.  */
2341           if ((e->flags & EDGE_FALLTHRU)
2342               && any_condjump_p (insn))
2343             continue;
2344           if (e->dest != EXIT_BLOCK_PTR
2345               && e->dest->head == JUMP_LABEL (insn))
2346             continue;
2347           if (e->dest == EXIT_BLOCK_PTR
2348               && returnjump_p (insn))
2349             continue;
2350           purged = true;
2351           remove_edge (e);
2352         }
2353       if (!bb->succ || !purged)
2354         return false;
2355       if (rtl_dump_file)
2356         fprintf (rtl_dump_file, "Purged edges from bb %i\n", bb->index);
2357       if (!optimize)
2358         return purged;
2359
2360       /* Redistribute probabilities.  */
2361       if (!bb->succ->succ_next)
2362         {
2363           bb->succ->probability = REG_BR_PROB_BASE;
2364           bb->succ->count = bb->count;
2365         }
2366       else
2367         {
2368           note = find_reg_note (insn, REG_BR_PROB, NULL);
2369           if (!note)
2370             return purged;
2371           b = BRANCH_EDGE (bb);
2372           f = FALLTHRU_EDGE (bb);
2373           b->probability = INTVAL (XEXP (note, 0));
2374           f->probability = REG_BR_PROB_BASE - b->probability;
2375           b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2376           f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2377         }
2378       return purged;
2379     }
2380
2381   /* Cleanup abnormal edges caused by throwing insns that have been
2382      eliminated.  */
2383   if (! can_throw_internal (bb->end))
2384     for (e = bb->succ; e; e = next)
2385       {
2386         next = e->succ_next;
2387         if (e->flags & EDGE_EH)
2388           {
2389             remove_edge (e);
2390             purged = true;
2391           }
2392       }
2393
2394   /* If we don't see a jump insn, we don't know exactly why the block would
2395      have been broken at this point.  Look for a simple, non-fallthru edge,
2396      as these are only created by conditional branches.  If we find such an
2397      edge we know that there used to be a jump here and can then safely
2398      remove all non-fallthru edges.  */
2399   for (e = bb->succ; e && (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU));
2400        e = e->succ_next);
2401   if (!e)
2402     return purged;
2403   for (e = bb->succ; e; e = next)
2404     {
2405       next = e->succ_next;
2406       if (!(e->flags & EDGE_FALLTHRU))
2407         remove_edge (e), purged = true;
2408     }
2409   if (!bb->succ || bb->succ->succ_next)
2410     abort ();
2411   bb->succ->probability = REG_BR_PROB_BASE;
2412   bb->succ->count = bb->count;
2413
2414   if (rtl_dump_file)
2415     fprintf (rtl_dump_file, "Purged non-fallthru edges from bb %i\n",
2416              bb->index);
2417   return purged;
2418 }
2419
2420 /* Search all basic blocks for potentionally dead edges and purge them.
2421
2422    Return true ifif some edge has been elliminated.
2423  */
2424
2425 bool
2426 purge_all_dead_edges ()
2427 {
2428   int i, purged = false;
2429   for (i = 0; i < n_basic_blocks; i++)
2430     purged |= purge_dead_edges (BASIC_BLOCK (i));
2431   return purged;
2432 }