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.
5 This file is part of GCC.
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
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
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
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.
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
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
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
51 - CFG updating after constant propagation
52 purge_dead_edges, purge_all_dead_edges
59 #include "hard-reg-set.h"
60 #include "basic-block.h"
71 /* Stubs in case we haven't got a return insn. */
74 #define gen_return() NULL_RTX
77 /* The obstack on which the flow graph components are allocated. */
79 struct obstack flow_obstack;
80 static char *flow_firstobj;
82 /* Number of basic blocks in the current function. */
86 /* Number of edges in the current function. */
90 /* First edge in the deleted edges chain. */
92 edge first_deleted_edge;
94 /* The basic block array. */
96 varray_type basic_block_info;
98 /* The special entry and exit blocks. */
100 struct basic_block_def entry_exit_blocks[2]
103 NULL, /* head_tree */
107 NULL, /* local_set */
108 NULL, /* cond_local_set */
109 NULL, /* global_live_at_start */
110 NULL, /* global_live_at_end */
112 ENTRY_BLOCK, /* index */
121 NULL, /* head_tree */
125 NULL, /* local_set */
126 NULL, /* cond_local_set */
127 NULL, /* global_live_at_start */
128 NULL, /* global_live_at_end */
130 EXIT_BLOCK, /* index */
138 /* The basic block structure for every insn, indexed by uid. */
140 varray_type basic_block_for_insn;
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. */
146 rtx label_value_list;
147 rtx tail_recursion_label_list;
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));
158 /* Called once at intialization time. */
163 static int initialized;
165 first_deleted_edge = 0;
170 gcc_obstack_init (&flow_obstack);
171 flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
176 obstack_free (&flow_obstack, flow_firstobj);
177 flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
181 /* Free the memory associated with the edge structures. */
188 for (i = 0; i < n_basic_blocks; ++i)
190 basic_block bb = BASIC_BLOCK (i);
193 remove_edge (bb->succ);
196 while (ENTRY_BLOCK_PTR->succ)
197 remove_edge (ENTRY_BLOCK_PTR->succ);
203 /* Return true if NOTE is not one of the ones that must be kept paired,
204 so that we may simply delete them. */
207 can_delete_note_p (note)
210 return (NOTE_LINE_NUMBER (note) == NOTE_INSN_DELETED
211 || NOTE_LINE_NUMBER (note) == NOTE_INSN_BASIC_BLOCK);
214 /* True if a given label can be deleted. */
217 can_delete_label_p (label)
222 if (LABEL_PRESERVE_P (label))
225 for (x = forced_labels; x; x = XEXP (x, 1))
226 if (label == XEXP (x, 0))
228 for (x = label_value_list; x; x = XEXP (x, 1))
229 if (label == XEXP (x, 0))
231 for (x = exception_handler_labels; x; x = XEXP (x, 1))
232 if (label == XEXP (x, 0))
235 /* User declared labels must be preserved. */
236 if (LABEL_NAME (label) != 0)
242 /* Delete INSN by patching it out. Return the next insn. */
245 flow_delete_insn (insn)
248 rtx prev = PREV_INSN (insn);
249 rtx next = NEXT_INSN (insn);
252 PREV_INSN (insn) = NULL_RTX;
253 NEXT_INSN (insn) = NULL_RTX;
254 INSN_DELETED_P (insn) = 1;
257 NEXT_INSN (prev) = next;
259 PREV_INSN (next) = prev;
261 set_last_insn (prev);
263 if (GET_CODE (insn) == CODE_LABEL)
264 remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
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
270 && GET_CODE (JUMP_LABEL (insn)) == CODE_LABEL)
271 LABEL_NUSES (JUMP_LABEL (insn))--;
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))--;
278 if (GET_CODE (insn) == JUMP_INSN
279 && (GET_CODE (PATTERN (insn)) == ADDR_VEC
280 || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
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);
287 for (i = 0; i < len; i++)
288 LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))--;
294 /* Unlink a chain of insns between START and FINISH, leaving notes
295 that must be paired. */
298 flow_delete_insn_chain (start, finish)
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. */
309 next = NEXT_INSN (start);
310 if (GET_CODE (start) == NOTE && !can_delete_note_p (start))
312 else if (GET_CODE (start) == CODE_LABEL
313 && ! can_delete_label_p (start))
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;
321 next = flow_delete_insn (start);
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
339 create_basic_block_structure (index, head, end, bb_note)
341 rtx head, end, bb_note;
346 && ! RTX_INTEGRATED_P (bb_note)
347 && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
350 /* If we found an existing note, thread it back onto the chain. */
354 if (GET_CODE (head) == CODE_LABEL)
358 after = PREV_INSN (head);
362 if (after != bb_note && NEXT_INSN (after) != bb_note)
363 reorder_insns (bb_note, bb_note, after);
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. */
372 bb = (basic_block) obstack_alloc (&flow_obstack, sizeof (*bb));
373 memset (bb, 0, sizeof (*bb));
377 head = end = bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK,
380 else if (GET_CODE (head) == CODE_LABEL && end)
382 bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
388 bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
393 NOTE_BASIC_BLOCK (bb_note) = bb;
396 /* Always include the bb note in the block. */
397 if (NEXT_INSN (end) == bb_note)
403 BASIC_BLOCK (index) = bb;
404 if (basic_block_for_insn)
405 update_bb_for_insn (bb);
407 /* Tag the block so that we know it has been used when considering
408 other basic block notes. */
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
421 create_basic_block (index, head, end)
428 /* Place the new block just after the block being split. */
429 VARRAY_GROW (basic_block_info, ++n_basic_blocks);
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)
436 basic_block tmp = BASIC_BLOCK (i - 1);
437 BASIC_BLOCK (i) = tmp;
441 bb = create_basic_block_structure (index, head, end, NULL);
446 /* Remove block B from the basic block array and compact behind it. */
452 int i, n = n_basic_blocks;
454 for (i = b->index; i + 1 < n; ++i)
456 basic_block x = BASIC_BLOCK (i + 1);
461 /* Invalidate data to make bughunting easier. */
462 memset (b, 0, sizeof (*b));
464 basic_block_info->num_elements--;
468 /* Delete the insns in a (non-live) block. We physically delete every
469 non-deleted-note insn, and update the flow graph appropriately.
471 Return nonzero if we deleted an exception handler. */
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. */
477 flow_delete_block (b)
480 int deleted_handler = 0;
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.
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. */
492 never_reached_warning (insn);
494 if (GET_CODE (insn) == CODE_LABEL)
495 maybe_remove_eh_handler (insn);
497 /* Include any jump table following the basic block. */
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))
507 /* Include any barrier that may follow the basic block. */
508 tmp = next_nonnote_insn (end);
509 if (tmp && GET_CODE (tmp) == BARRIER)
512 /* Selectively delete the entire chain. */
513 flow_delete_insn_chain (insn, end);
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. */
518 while (b->pred != NULL)
519 remove_edge (b->pred);
520 while (b->succ != NULL)
521 remove_edge (b->succ);
527 /* Remove the basic block from the array, and compact behind it. */
530 return deleted_handler;
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. */
537 compute_bb_for_insn (max)
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");
546 for (i = 0; i < n_basic_blocks; ++i)
548 basic_block bb = BASIC_BLOCK (i);
555 int uid = INSN_UID (insn);
557 VARRAY_BB (basic_block_for_insn, uid) = bb;
560 insn = NEXT_INSN (insn);
565 /* Release the basic_block_for_insn array. */
570 if (basic_block_for_insn)
571 VARRAY_FREE (basic_block_for_insn);
572 basic_block_for_insn = 0;
575 /* Update insns block within BB. */
578 update_bb_for_insn (bb)
583 if (! basic_block_for_insn)
586 for (insn = bb->head; ; insn = NEXT_INSN (insn))
588 set_block_for_insn (insn, bb);
595 /* Record INSN's block as BB. */
598 set_block_for_insn (insn, bb)
602 size_t uid = INSN_UID (insn);
603 if (uid >= basic_block_for_insn->num_elements)
607 /* Add one-eighth the size so we don't keep calling xrealloc. */
608 new_size = uid + (uid + 7) / 8;
610 VARRAY_GROW (basic_block_for_insn, new_size);
612 VARRAY_BB (basic_block_for_insn, uid) = bb;
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. */
622 set_block_for_new_insns (insn, bb)
626 set_block_for_insn (insn, bb);
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
631 for (insn = PREV_INSN (insn); insn != NULL_RTX; insn = PREV_INSN (insn))
633 if (GET_CODE (insn) == NOTE)
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);
643 /* Create an edge connecting SRC and DST with FLAGS optionally using
644 edge cache CACHE. Return the new edge, NULL if already exist. */
647 cached_make_edge (edge_cache, src, dst, flags)
649 basic_block src, dst;
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);
661 /* Make sure we don't add duplicate edges. */
662 switch (use_edge_cache)
665 /* Quick test for non-existance of the edge. */
666 if (! TEST_BIT (edge_cache[src->index], dst->index))
669 /* The edge exists; early exit if no work to do. */
675 for (e = src->succ; e; e = e->succ_next)
684 if (first_deleted_edge)
686 e = first_deleted_edge;
687 first_deleted_edge = e->succ_next;
691 e = (edge) obstack_alloc (&flow_obstack, sizeof (*e));
692 memset (e, 0, sizeof (*e));
696 e->succ_next = src->succ;
697 e->pred_next = dst->pred;
706 SET_BIT (edge_cache[src->index], dst->index);
711 /* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
712 created edge or NULL if already exist. */
715 make_edge (src, dest, flags)
716 basic_block src, dest;
719 return cached_make_edge (NULL, src, dest, flags);
722 /* Create an edge connecting SRC to DEST and set probability by knowling
723 that it is the single edge leaving SRC. */
726 make_single_succ_edge (src, dest, flags)
727 basic_block src, dest;
730 edge e = make_edge (src, dest, flags);
732 e->probability = REG_BR_PROB_BASE;
733 e->count = src->count;
737 /* This function will remove an edge from the flow graph. */
743 edge last_pred = NULL;
744 edge last_succ = NULL;
746 basic_block src, dest;
749 for (tmp = src->succ; tmp && tmp != e; tmp = tmp->succ_next)
755 last_succ->succ_next = e->succ_next;
757 src->succ = e->succ_next;
759 for (tmp = dest->pred; tmp && tmp != e; tmp = tmp->pred_next)
765 last_pred->pred_next = e->pred_next;
767 dest->pred = e->pred_next;
770 memset (e, 0, sizeof (*e));
771 e->succ_next = first_deleted_edge;
772 first_deleted_edge = e;
775 /* Redirect an edge's successor from one block to another. */
778 redirect_edge_succ (e, new_succ)
780 basic_block new_succ;
784 /* Disconnect the edge from the old successor block. */
785 for (pe = &e->dest->pred; *pe != e; pe = &(*pe)->pred_next)
787 *pe = (*pe)->pred_next;
789 /* Reconnect the edge to the new successor block. */
790 e->pred_next = new_succ->pred;
795 /* Like previous but avoid possible dupplicate edge. */
798 redirect_edge_succ_nodup (e, new_succ)
800 basic_block new_succ;
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)
809 s->flags |= e->flags;
810 s->probability += e->probability;
811 s->count += e->count;
816 redirect_edge_succ (e, new_succ);
820 /* Redirect an edge's predecessor from one block to another. */
823 redirect_edge_pred (e, new_pred)
825 basic_block new_pred;
829 /* Disconnect the edge from the old predecessor block. */
830 for (pe = &e->src->succ; *pe != e; pe = &(*pe)->succ_next)
832 *pe = (*pe)->succ_next;
834 /* Reconnect the edge to the new predecessor block. */
835 e->succ_next = new_pred->succ;
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. */
846 split_block (bb, insn)
854 /* There is no point splitting the block after its end. */
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;
865 /* Redirect the outgoing edges. */
866 new_bb->succ = bb->succ;
868 for (e = new_bb->succ; e; e = e->succ_next)
871 new_edge = make_single_succ_edge (bb, new_bb, EDGE_FALLTHRU);
873 if (bb->global_live_at_start)
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);
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);
893 /* Blocks A and B are to be merged into a single block A. The insns
894 are already contiguous, hence `nomove'. */
897 merge_blocks_nomove (a, b)
901 rtx b_head, b_end, a_end;
902 rtx del_first = NULL_RTX, del_last = NULL_RTX;
905 /* If there was a CODE_LABEL beginning B, delete it. */
908 if (GET_CODE (b_head) == CODE_LABEL)
910 /* Detect basic blocks with nothing but a label. This can happen
911 in particular at the end of a function. */
914 del_first = del_last = b_head;
915 b_head = NEXT_INSN (b_head);
918 /* Delete the basic block note. */
919 if (NOTE_INSN_BASIC_BLOCK_P (b_head))
926 b_head = NEXT_INSN (b_head);
929 /* If there was a jump out of A, delete it. */
931 if (GET_CODE (a_end) == JUMP_INSN)
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
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))
949 prev = prev_nonnote_insn (prev);
956 a_end = PREV_INSN (del_first);
958 else if (GET_CODE (NEXT_INSN (a_end)) == BARRIER)
959 del_first = NEXT_INSN (a_end);
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);
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. */
970 remove_edge (a->succ);
972 /* Adjust the edges out of B for the new owner. */
973 for (e = b->succ; e; e = e->succ_next)
977 /* B hasn't quite yet ceased to exist. Attempt to prevent mishap. */
978 b->pred = b->succ = NULL;
980 /* Reassociate the insns of B with A. */
984 if (basic_block_for_insn)
986 BLOCK_FOR_INSN (x) = a;
990 BLOCK_FOR_INSN (x) = a;
1000 /* Return label in the head of basic block. Create one if it doesn't exist. */
1006 if (block == EXIT_BLOCK_PTR)
1008 if (GET_CODE (block->head) != CODE_LABEL)
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);
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.
1021 The parameters and return values are equivalent to redirect_edge_and_branch.
1025 try_redirect_by_replacing_jump (e, target)
1029 basic_block src = e->src;
1030 rtx insn = src->end, kill_from;
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)
1039 if (tmp || !onlyjump_p (insn))
1042 /* Avoid removing branch with side effects. */
1043 set = single_set (insn);
1044 if (!set || side_effects_p (set))
1047 /* In case we zap a conditional jump, we'll need to kill
1048 the cc0 setter too. */
1051 if (reg_mentioned_p (cc0_rtx, PATTERN (insn)))
1052 kill_from = PREV_INSN (insn);
1055 /* See if we can create the fallthru edge. */
1056 if (can_fallthru (src, target))
1058 src->end = PREV_INSN (kill_from);
1060 fprintf (rtl_dump_file, "Removing jump %i.\n", INSN_UID (insn));
1063 /* Selectivly unlink whole insn chain. */
1064 flow_delete_insn_chain (kill_from, PREV_INSN (target->head));
1066 /* If this already is simplejump, redirect it. */
1067 else if (simplejump_p (insn))
1069 if (e->dest == target)
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);
1076 /* Or replace possibly complicated jump insn by simple jump insn. */
1079 rtx target_label = block_label (target);
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)++;
1086 fprintf (rtl_dump_file, "Replacing insn %i by jump %i\n",
1087 INSN_UID (insn), INSN_UID (src->end));
1089 flow_delete_insn_chain (kill_from, insn);
1091 barrier = next_nonnote_insn (src->end);
1092 if (!barrier || GET_CODE (barrier) != BARRIER)
1093 emit_barrier_after (src->end);
1096 /* Keep only one edge out and set proper flags. */
1097 while (src->succ->succ_next)
1098 remove_edge (src->succ);
1101 e->flags = EDGE_FALLTHRU;
1104 e->probability = REG_BR_PROB_BASE;
1105 e->count = src->count;
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)
1112 rtx prev = PREV_INSN (e->src->end);
1113 flow_delete_insn (e->src->end);
1117 if (e->dest != target)
1118 redirect_edge_succ (e, target);
1122 /* Return last loop_beg note appearing after INSN, before start of next
1123 basic block. Return INSN if there are no such notes.
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. */
1131 last_loop_beg_note (insn)
1135 insn = NEXT_INSN (insn);
1136 while (insn && GET_CODE (insn) == NOTE
1137 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK)
1139 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1141 insn = NEXT_INSN (insn);
1146 /* Attempt to change code to redirect edge E to TARGET.
1147 Don't do that on expense of adding new instructions or reordering
1150 Function can be also called with edge destionation equivalent to the
1151 TARGET. Then it should try the simplifications and do nothing if
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
1159 redirect_edge_and_branch (e, target)
1164 rtx old_label = e->dest->head;
1165 basic_block src = e->src;
1166 rtx insn = src->end;
1168 if (e->flags & EDGE_COMPLEX)
1171 if (try_redirect_by_replacing_jump (e, target))
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
1176 else if (e->dest == target)
1179 /* We can only redirect non-fallthru edges of jump insn. */
1180 if (e->flags & EDGE_FALLTHRU)
1182 if (GET_CODE (insn) != JUMP_INSN)
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))
1194 rtx new_label = block_label (target);
1196 if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
1197 vec = XVEC (PATTERN (tmp), 0);
1199 vec = XVEC (PATTERN (tmp), 1);
1201 for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
1202 if (XEXP (RTVEC_ELT (vec, j), 0) == old_label)
1204 RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (Pmode, new_label);
1205 --LABEL_NUSES (old_label);
1206 ++LABEL_NUSES (new_label);
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)
1216 XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (VOIDmode,
1218 --LABEL_NUSES (old_label);
1219 ++LABEL_NUSES (new_label);
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
1227 if (computed_jump_p (insn))
1230 /* A return instruction can't be redirected. */
1231 if (returnjump_p (insn))
1234 /* If the insn doesn't go where we think, we're confused. */
1235 if (JUMP_LABEL (insn) != old_label)
1237 redirect_jump (insn, block_label (target), 0);
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);
1248 /* Like force_nonfallthru bellow, but additionally performs redirection
1249 Used by redirect_edge_and_branch_force. */
1252 force_nonfallthru_and_redirect (e, target)
1256 basic_block jump_block, new_bb = NULL;
1260 if (e->flags & EDGE_ABNORMAL)
1262 if (!(e->flags & EDGE_FALLTHRU))
1264 if (e->src->succ->succ_next)
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;
1273 if (target->global_live_at_start)
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);
1286 new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
1287 new_edge->probability = e->probability;
1288 new_edge->count = e->count;
1290 /* Redirect old edge. */
1291 redirect_edge_pred (e, jump_block);
1292 e->probability = REG_BR_PROB_BASE;
1294 new_bb = jump_block;
1297 jump_block = e->src;
1298 e->flags &= ~EDGE_FALLTHRU;
1299 if (target == EXIT_BLOCK_PTR)
1302 emit_jump_insn_after (gen_return (), jump_block->end);
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)++;
1313 emit_barrier_after (jump_block->end);
1314 redirect_edge_succ_nodup (e, target);
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. */
1323 force_nonfallthru (e)
1326 return force_nonfallthru_and_redirect (e, e->dest);
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. */
1334 redirect_edge_and_branch_force (e, target)
1340 if (redirect_edge_and_branch (e, target))
1342 if (e->dest == target)
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);
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. */
1355 tidy_fallthru_edge (e, b, c)
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.
1365 We can also wind up with a sequence of undeletable labels between
1366 one block and the next.
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. */
1371 if (next_real_insn (b->end) != next_real_insn (PREV_INSN (c->head)))
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
1378 if (GET_CODE (q) == JUMP_INSN
1380 && (any_uncondjump_p (q)
1381 || (b->succ == e && e->succ_next == NULL)))
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)))
1393 NOTE_LINE_NUMBER (q) = NOTE_INSN_DELETED;
1394 NOTE_SOURCE_FILE (q) = 0;
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)
1409 /* Selectively unlink the sequence. */
1410 if (q != PREV_INSN (c->head))
1411 flow_delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
1413 e->flags |= EDGE_FALLTHRU;
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. */
1422 tidy_fallthru_edges ()
1426 for (i = 1; i < n_basic_blocks; ++i)
1428 basic_block b = BASIC_BLOCK (i - 1);
1429 basic_block c = BASIC_BLOCK (i);
1432 /* We care about simple conditional or unconditional jumps with
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).
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
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);
1454 /* Helper function for split_edge. Return true in case edge BB2 to BB1
1455 is back edge of syntactic loop. */
1458 back_edge_of_syntactic_loop_p (bb1, bb2)
1459 basic_block bb1, bb2;
1464 if (bb1->index > bb2->index)
1467 if (bb1->index == bb2->index)
1470 for (insn = bb1->end; insn != bb2->head && count >= 0;
1471 insn = NEXT_INSN (insn))
1472 if (GET_CODE (insn) == NOTE)
1474 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1476 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
1483 /* Split a (typically critical) edge. Return the new block.
1484 Abort on abnormal edges.
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. */
1491 split_edge (edge_in)
1498 /* Abnormal edges cannot be split. */
1499 if ((edge_in->flags & EDGE_ABNORMAL) != 0)
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)
1507 for (e = edge_in->dest->pred; e; e = e->pred_next)
1508 if (e->flags & EDGE_FALLTHRU)
1512 force_nonfallthru (e);
1515 /* Create the basic block note.
1517 Where we place the note can have a noticable impact on the generated
1518 code. Consider this cfg:
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. */
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;
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);
1549 /* ??? This info is likely going to be out of date very soon. */
1550 if (edge_in->dest->global_live_at_start)
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);
1558 edge_out = make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
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)
1564 if (!redirect_edge_and_branch (edge_in, bb))
1568 redirect_edge_succ (edge_in, bb);
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. */
1578 insert_insn_on_edge (pattern, e)
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))
1587 if (e->insns == NULL_RTX)
1590 push_to_sequence (e->insns);
1592 emit_insn (pattern);
1594 e->insns = get_insns ();
1598 /* Update the CFG for the instructions queued on edge E. */
1601 commit_one_edge_insertion (e)
1604 rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1607 /* Pull the insns off the edge now since the edge might go away. */
1609 e->insns = NULL_RTX;
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)
1618 /* Get the location correct wrt a code label, and "nice" wrt
1619 a basic block note, and before everything else. */
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)
1628 after = PREV_INSN (tmp);
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)
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.
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)
1647 while (GET_CODE (PREV_INSN (before)) == NOTE
1648 && NOTE_LINE_NUMBER (PREV_INSN (before)) == NOTE_INSN_LOOP_BEG)
1649 before = PREV_INSN (before);
1653 /* We'd better be fallthru, or we've lost track of what's what. */
1654 if ((e->flags & EDGE_FALLTHRU) == 0)
1661 /* Otherwise we must split the edge. */
1664 bb = split_edge (e);
1668 /* Now that we've found the spot, do the insertion. */
1672 emit_insns_before (insns, before);
1673 last = prev_nonnote_insn (before);
1676 last = emit_insns_after (insns, after);
1678 if (returnjump_p (last))
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
1686 if (e->dest != EXIT_BLOCK_PTR
1687 || e->succ_next != NULL
1688 || (e->flags & EDGE_FALLTHRU) == 0)
1690 e->flags &= ~EDGE_FALLTHRU;
1692 emit_barrier_after (last);
1695 flow_delete_insn (before);
1697 else if (GET_CODE (last) == JUMP_INSN)
1699 find_sub_basic_blocks (bb);
1702 /* Update the CFG for all queued instructions. */
1705 commit_edge_insertions ()
1710 #ifdef ENABLE_CHECKING
1711 verify_flow_info ();
1715 bb = ENTRY_BLOCK_PTR;
1720 for (e = bb->succ; e; e = next)
1722 next = e->succ_next;
1724 commit_one_edge_insertion (e);
1727 if (++i >= n_basic_blocks)
1729 bb = BASIC_BLOCK (i);
1734 dump_flow_info (file)
1738 static const char * const reg_class_names[] = REG_CLASS_NAMES;
1740 fprintf (file, "%d registers.\n", max_regno);
1741 for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
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));
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)
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]);
1771 fprintf (file, "; pref %s, else %s",
1772 reg_class_names[(int) class],
1773 reg_class_names[(int) altclass]);
1775 if (REG_POINTER (regno_reg_rtx[i]))
1776 fprintf (file, "; pointer");
1777 fprintf (file, ".\n");
1780 fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks, n_edges);
1781 for (i = 0; i < n_basic_blocks; i++)
1783 register basic_block bb = BASIC_BLOCK (i);
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);
1791 fprintf (file, "Predecessors: ");
1792 for (e = bb->pred; e; e = e->pred_next)
1793 dump_edge_info (file, e, 0);
1795 fprintf (file, "\nSuccessors: ");
1796 for (e = bb->succ; e; e = e->succ_next)
1797 dump_edge_info (file, e, 1);
1799 fprintf (file, "\nRegisters live at start:");
1800 dump_regset (bb->global_live_at_start, file);
1802 fprintf (file, "\nRegisters live at end:");
1803 dump_regset (bb->global_live_at_end, file);
1814 dump_flow_info (stderr);
1818 dump_edge_info (file, e, do_succ)
1823 basic_block side = (do_succ ? e->dest : e->src);
1825 if (side == ENTRY_BLOCK_PTR)
1826 fputs (" ENTRY", file);
1827 else if (side == EXIT_BLOCK_PTR)
1828 fputs (" EXIT", file);
1830 fprintf (file, " %d", side->index);
1833 fprintf (file, " [%.1f%%] ", e->probability * 100.0 / REG_BR_PROB_BASE);
1837 fprintf (file, " count:");
1838 fprintf (file, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) e->count);
1843 static const char * const bitnames[] = {
1844 "fallthru", "ab", "abcall", "eh", "fake", "dfs_back"
1847 int i, flags = e->flags;
1851 for (i = 0; flags; i++)
1852 if (flags & (1 << i))
1858 if (i < (int) ARRAY_SIZE (bitnames))
1859 fputs (bitnames[i], file);
1861 fprintf (file, "%d", i);
1868 /* Print out one basic block with live information at start and end. */
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);
1884 fputs (";; Predecessors: ", outf);
1885 for (e = bb->pred; e; e = e->pred_next)
1886 dump_edge_info (outf, e, 0);
1889 fputs (";; Registers live at start:", outf);
1890 dump_regset (bb->global_live_at_start, outf);
1893 for (insn = bb->head, last = NEXT_INSN (bb->end);
1895 insn = NEXT_INSN (insn))
1896 print_rtl_single (outf, insn);
1898 fputs (";; Registers live at end:", outf);
1899 dump_regset (bb->global_live_at_end, outf);
1902 fputs (";; Successors: ", outf);
1903 for (e = bb->succ; e; e = e->succ_next)
1904 dump_edge_info (outf, e, 1);
1912 dump_bb (bb, stderr);
1919 dump_bb (BASIC_BLOCK (n), stderr);
1922 /* Like print_rtl, but also print out live information for the start of each
1926 print_rtl_with_bb (outf, rtx_first)
1930 register rtx tmp_rtx;
1933 fprintf (outf, "(nil)\n");
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));
1946 for (i = n_basic_blocks - 1; i >= 0; i--)
1948 basic_block bb = BASIC_BLOCK (i);
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))
1955 enum bb_state state = IN_MULTIPLE_BB;
1956 if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1958 in_bb_p[INSN_UID (x)] = state;
1965 for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1970 if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
1972 fprintf (outf, ";; Start of basic block %d, registers live:",
1974 dump_regset (bb->global_live_at_start, outf);
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");
1985 did_output = print_rtl_single (outf, tmp_rtx);
1987 if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
1989 fprintf (outf, ";; End of basic block %d, registers live:\n",
1991 dump_regset (bb->global_live_at_end, outf);
2004 if (current_function_epilogue_delay_list != 0)
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));
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.
2017 Currently it does following checks:
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
2030 In future it can be extended check a lot of other stuff as well
2031 (reachability of basic blocks, life information, etc. etc.). */
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;
2042 int i, last_bb_num_seen, num_bb_notes, err = 0;
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));
2049 for (i = n_basic_blocks - 1; i >= 0; i--)
2051 basic_block bb = BASIC_BLOCK (i);
2052 rtx head = bb->head;
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))
2061 error ("End insn %d for block %d not found in the insn stream.",
2062 INSN_UID (end), bb->index);
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))
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)
2075 error ("Insn %d is in multiple basic blocks (%d and %d)",
2076 INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
2079 bb_info[INSN_UID (x)] = bb;
2086 error ("Head insn %d for block %d not found in the insn stream.",
2087 INSN_UID (head), bb->index);
2094 /* Now check the basic blocks (boundaries etc.) */
2095 for (i = n_basic_blocks - 1; i >= 0; i--)
2097 basic_block bb = BASIC_BLOCK (i);
2098 int has_fallthru = 0;
2104 if (last_visited [e->dest->index + 2] == bb)
2106 error ("verify_flow_info: Duplicate edge %i->%i",
2107 e->src->index, e->dest->index);
2110 last_visited [e->dest->index + 2] = bb;
2112 if (e->flags & EDGE_FALLTHRU)
2115 if ((e->flags & EDGE_FALLTHRU)
2116 && e->src != ENTRY_BLOCK_PTR
2117 && e->dest != EXIT_BLOCK_PTR)
2120 if (e->src->index + 1 != e->dest->index)
2122 error ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
2123 e->src->index, e->dest->index);
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))
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);
2139 error ("verify_flow_info: Basic block %d succ edge is corrupted",
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");
2148 edge_checksum[e->dest->index + 2] += (size_t) e;
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))
2159 || (GET_CODE (insn) == NOTE
2160 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK))
2162 error ("Missing barrier after block %i", bb->index);
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);
2180 edge_checksum[e->dest->index + 2] -= (size_t) e;
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)
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);
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);
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. */
2200 if (GET_CODE (x) == CODE_LABEL)
2204 error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2210 if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
2212 error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2219 /* Do checks for empty blocks here */
2226 if (NOTE_INSN_BASIC_BLOCK_P (x))
2228 error ("NOTE_INSN_BASIC_BLOCK %d in the middle of basic block %d",
2229 INSN_UID (x), bb->index);
2236 if (GET_CODE (x) == JUMP_INSN
2237 || GET_CODE (x) == CODE_LABEL
2238 || GET_CODE (x) == BARRIER)
2240 error ("In basic block %d:", bb->index);
2241 fatal_insn ("Flow control insn inside a basic block", x);
2249 /* Complete edge checksumming for ENTRY and EXIT. */
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;
2258 for (i = -2; i < n_basic_blocks; ++i)
2259 if (edge_checksum[i + 2])
2261 error ("Basic block %i edge lists are corrupted", i);
2265 last_bb_num_seen = -1;
2270 if (NOTE_INSN_BASIC_BLOCK_P (x))
2272 basic_block bb = NOTE_BASIC_BLOCK (x);
2274 if (bb->index != last_bb_num_seen + 1)
2275 internal_error ("Basic blocks not numbered consecutively.");
2277 last_bb_num_seen = bb->index;
2280 if (!bb_info[INSN_UID (x)])
2282 switch (GET_CODE (x))
2289 /* An addr_vec is placed outside any block block. */
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))
2298 /* But in any case, non-deletable labels can appear anywhere. */
2302 fatal_insn ("Insn outside basic block", 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);
2315 if (num_bb_notes != n_basic_blocks)
2317 ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2318 num_bb_notes, n_basic_blocks);
2321 internal_error ("verify_flow_info failed.");
2325 free (last_visited);
2326 free (edge_checksum);
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. */
2334 purge_dead_edges (bb)
2339 bool purged = false;
2341 if (GET_CODE (insn) == JUMP_INSN && !simplejump_p (insn))
2343 if (GET_CODE (insn) == JUMP_INSN)
2347 /* We do care only about conditional jumps and simplejumps. */
2348 if (!any_condjump_p (insn)
2349 && !returnjump_p (insn)
2350 && !simplejump_p (insn))
2352 for (e = bb->succ; e; e = next)
2354 next = e->succ_next;
2356 /* Check purposes we can have edge. */
2357 if ((e->flags & EDGE_FALLTHRU)
2358 && any_condjump_p (insn))
2360 if (e->dest != EXIT_BLOCK_PTR
2361 && e->dest->head == JUMP_LABEL (insn))
2363 if (e->dest == EXIT_BLOCK_PTR
2364 && returnjump_p (insn))
2369 if (!bb->succ || !purged)
2372 fprintf (rtl_dump_file, "Purged edges from bb %i\n", bb->index);
2376 /* Redistribute probabilities. */
2377 if (!bb->succ->succ_next)
2379 bb->succ->probability = REG_BR_PROB_BASE;
2380 bb->succ->count = bb->count;
2384 note = find_reg_note (insn, REG_BR_PROB, NULL);
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;
2397 /* Cleanup abnormal edges caused by throwing insns that have been
2399 if (! can_throw_internal (bb->end))
2400 for (e = bb->succ; e; e = next)
2402 next = e->succ_next;
2403 if (e->flags & EDGE_EH)
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));
2419 for (e = bb->succ; e; e = next)
2421 next = e->succ_next;
2422 if (!(e->flags & EDGE_FALLTHRU))
2423 remove_edge (e), purged = true;
2425 if (!bb->succ || bb->succ->succ_next)
2427 bb->succ->probability = REG_BR_PROB_BASE;
2428 bb->succ->count = bb->count;
2431 fprintf (rtl_dump_file, "Purged non-fallthru edges from bb %i\n",
2436 /* Search all basic blocks for potentionally dead edges and purge them.
2438 Return true ifif some edge has been elliminated.
2442 purge_all_dead_edges ()
2444 int i, purged = false;
2445 for (i = 0; i < n_basic_blocks; i++)
2446 purged |= purge_dead_edges (BASIC_BLOCK (i));