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"
70 /* The obstack on which the flow graph components are allocated. */
72 struct obstack flow_obstack;
73 static char *flow_firstobj;
75 /* Number of basic blocks in the current function. */
79 /* Number of edges in the current function. */
83 /* First edge in the deleted edges chain. */
85 edge first_deleted_edge;
87 /* The basic block array. */
89 varray_type basic_block_info;
91 /* The special entry and exit blocks. */
93 struct basic_block_def entry_exit_blocks[2]
100 NULL, /* local_set */
101 NULL, /* cond_local_set */
102 NULL, /* global_live_at_start */
103 NULL, /* global_live_at_end */
105 ENTRY_BLOCK, /* index */
114 NULL, /* head_tree */
118 NULL, /* local_set */
119 NULL, /* cond_local_set */
120 NULL, /* global_live_at_start */
121 NULL, /* global_live_at_end */
123 EXIT_BLOCK, /* index */
131 /* The basic block structure for every insn, indexed by uid. */
133 varray_type basic_block_for_insn;
135 /* The labels mentioned in non-jump rtl. Valid during find_basic_blocks. */
136 /* ??? Should probably be using LABEL_NUSES instead. It would take a
137 bit of surgery to be able to use or co-opt the routines in jump. */
139 rtx label_value_list;
140 rtx tail_recursion_label_list;
142 void debug_flow_info PARAMS ((void));
143 static int can_delete_note_p PARAMS ((rtx));
144 static int can_delete_label_p PARAMS ((rtx));
145 static void commit_one_edge_insertion PARAMS ((edge));
146 static bool try_redirect_by_replacing_jump PARAMS ((edge, basic_block));
147 static void expunge_block PARAMS ((basic_block));
148 static rtx last_loop_beg_note PARAMS ((rtx));
149 static bool back_edge_of_syntactic_loop_p PARAMS ((basic_block, basic_block));
150 static basic_block force_nonfallthru_and_redirect PARAMS ((edge, basic_block));
152 /* Called once at intialization time. */
157 static int initialized;
159 first_deleted_edge = 0;
164 gcc_obstack_init (&flow_obstack);
165 flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
170 obstack_free (&flow_obstack, flow_firstobj);
171 flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
175 /* Free the memory associated with the edge structures. */
182 for (i = 0; i < n_basic_blocks; ++i)
184 basic_block bb = BASIC_BLOCK (i);
187 remove_edge (bb->succ);
190 while (ENTRY_BLOCK_PTR->succ)
191 remove_edge (ENTRY_BLOCK_PTR->succ);
197 /* Return true if NOTE is not one of the ones that must be kept paired,
198 so that we may simply delete them. */
201 can_delete_note_p (note)
204 return (NOTE_LINE_NUMBER (note) == NOTE_INSN_DELETED
205 || NOTE_LINE_NUMBER (note) == NOTE_INSN_BASIC_BLOCK);
208 /* True if a given label can be deleted. */
211 can_delete_label_p (label)
216 if (LABEL_PRESERVE_P (label))
219 for (x = forced_labels; x; x = XEXP (x, 1))
220 if (label == XEXP (x, 0))
222 for (x = label_value_list; x; x = XEXP (x, 1))
223 if (label == XEXP (x, 0))
225 for (x = exception_handler_labels; x; x = XEXP (x, 1))
226 if (label == XEXP (x, 0))
229 /* User declared labels must be preserved. */
230 if (LABEL_NAME (label) != 0)
236 /* Delete INSN by patching it out. Return the next insn. */
239 flow_delete_insn (insn)
242 rtx prev = PREV_INSN (insn);
243 rtx next = NEXT_INSN (insn);
246 PREV_INSN (insn) = NULL_RTX;
247 NEXT_INSN (insn) = NULL_RTX;
248 INSN_DELETED_P (insn) = 1;
251 NEXT_INSN (prev) = next;
253 PREV_INSN (next) = prev;
255 set_last_insn (prev);
257 if (GET_CODE (insn) == CODE_LABEL)
258 remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
260 /* If deleting a jump, decrement the use count of the label. Deleting
261 the label itself should happen in the normal course of block merging. */
262 if (GET_CODE (insn) == JUMP_INSN
264 && GET_CODE (JUMP_LABEL (insn)) == CODE_LABEL)
265 LABEL_NUSES (JUMP_LABEL (insn))--;
267 /* Also if deleting an insn that references a label. */
268 else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX
269 && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
270 LABEL_NUSES (XEXP (note, 0))--;
272 if (GET_CODE (insn) == JUMP_INSN
273 && (GET_CODE (PATTERN (insn)) == ADDR_VEC
274 || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
276 rtx pat = PATTERN (insn);
277 int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
278 int len = XVECLEN (pat, diff_vec_p);
281 for (i = 0; i < len; i++)
282 LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))--;
288 /* Unlink a chain of insns between START and FINISH, leaving notes
289 that must be paired. */
292 flow_delete_insn_chain (start, finish)
295 /* Unchain the insns one by one. It would be quicker to delete all
296 of these with a single unchaining, rather than one at a time, but
297 we need to keep the NOTE's. */
303 next = NEXT_INSN (start);
304 if (GET_CODE (start) == NOTE && !can_delete_note_p (start))
306 else if (GET_CODE (start) == CODE_LABEL
307 && ! can_delete_label_p (start))
309 const char *name = LABEL_NAME (start);
310 PUT_CODE (start, NOTE);
311 NOTE_LINE_NUMBER (start) = NOTE_INSN_DELETED_LABEL;
312 NOTE_SOURCE_FILE (start) = name;
315 next = flow_delete_insn (start);
323 /* Create a new basic block consisting of the instructions between
324 HEAD and END inclusive. This function is designed to allow fast
325 BB construction - reuses the note and basic block struct
326 in BB_NOTE, if any and do not grow BASIC_BLOCK chain and should
327 be used directly only by CFG construction code.
328 END can be NULL in to create new empty basic block before HEAD.
329 Both END and HEAD can be NULL to create basic block at the end of
333 create_basic_block_structure (index, head, end, bb_note)
335 rtx head, end, bb_note;
340 && ! RTX_INTEGRATED_P (bb_note)
341 && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
344 /* If we found an existing note, thread it back onto the chain. */
348 if (GET_CODE (head) == CODE_LABEL)
352 after = PREV_INSN (head);
356 if (after != bb_note && NEXT_INSN (after) != bb_note)
357 reorder_insns (bb_note, bb_note, after);
361 /* Otherwise we must create a note and a basic block structure.
362 Since we allow basic block structs in rtl, give the struct
363 the same lifetime by allocating it off the function obstack
364 rather than using malloc. */
366 bb = (basic_block) obstack_alloc (&flow_obstack, sizeof (*bb));
367 memset (bb, 0, sizeof (*bb));
371 head = end = bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK,
374 else if (GET_CODE (head) == CODE_LABEL && end)
376 bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
382 bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
387 NOTE_BASIC_BLOCK (bb_note) = bb;
390 /* Always include the bb note in the block. */
391 if (NEXT_INSN (end) == bb_note)
397 BASIC_BLOCK (index) = bb;
398 if (basic_block_for_insn)
399 update_bb_for_insn (bb);
401 /* Tag the block so that we know it has been used when considering
402 other basic block notes. */
408 /* Create new basic block consisting of instructions in between HEAD and
409 END and place it to the BB chain at possition INDEX.
410 END can be NULL in to create new empty basic block before HEAD.
411 Both END and HEAD can be NULL to create basic block at the end of
415 create_basic_block (index, head, end)
422 /* Place the new block just after the block being split. */
423 VARRAY_GROW (basic_block_info, ++n_basic_blocks);
425 /* Some parts of the compiler expect blocks to be number in
426 sequential order so insert the new block immediately after the
427 block being split.. */
428 for (i = n_basic_blocks - 1; i > index; --i)
430 basic_block tmp = BASIC_BLOCK (i - 1);
431 BASIC_BLOCK (i) = tmp;
435 bb = create_basic_block_structure (index, head, end, NULL);
440 /* Remove block B from the basic block array and compact behind it. */
446 int i, n = n_basic_blocks;
448 for (i = b->index; i + 1 < n; ++i)
450 basic_block x = BASIC_BLOCK (i + 1);
455 basic_block_info->num_elements--;
459 /* Delete the insns in a (non-live) block. We physically delete every
460 non-deleted-note insn, and update the flow graph appropriately.
462 Return nonzero if we deleted an exception handler. */
464 /* ??? Preserving all such notes strikes me as wrong. It would be nice
465 to post-process the stream to remove empty blocks, loops, ranges, etc. */
468 flow_delete_block (b)
471 int deleted_handler = 0;
474 /* If the head of this block is a CODE_LABEL, then it might be the
475 label for an exception handler which can't be reached.
477 We need to remove the label from the exception_handler_label list
478 and remove the associated NOTE_INSN_EH_REGION_BEG and
479 NOTE_INSN_EH_REGION_END notes. */
483 never_reached_warning (insn);
485 if (GET_CODE (insn) == CODE_LABEL)
486 maybe_remove_eh_handler (insn);
488 /* Include any jump table following the basic block. */
490 if (GET_CODE (end) == JUMP_INSN
491 && (tmp = JUMP_LABEL (end)) != NULL_RTX
492 && (tmp = NEXT_INSN (tmp)) != NULL_RTX
493 && GET_CODE (tmp) == JUMP_INSN
494 && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
495 || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
498 /* Include any barrier that may follow the basic block. */
499 tmp = next_nonnote_insn (end);
500 if (tmp && GET_CODE (tmp) == BARRIER)
503 /* Selectively delete the entire chain. */
504 flow_delete_insn_chain (insn, end);
506 /* Remove the edges into and out of this block. Note that there may
507 indeed be edges in, if we are removing an unreachable loop. */
509 while (b->pred != NULL)
510 remove_edge (b->pred);
511 while (b->succ != NULL)
512 remove_edge (b->succ);
518 /* Remove the basic block from the array, and compact behind it. */
521 return deleted_handler;
524 /* Records the basic block struct in BB_FOR_INSN, for every instruction
525 indexed by INSN_UID. MAX is the size of the array. */
528 compute_bb_for_insn (max)
533 if (basic_block_for_insn)
534 VARRAY_FREE (basic_block_for_insn);
535 VARRAY_BB_INIT (basic_block_for_insn, max, "basic_block_for_insn");
537 for (i = 0; i < n_basic_blocks; ++i)
539 basic_block bb = BASIC_BLOCK (i);
546 int uid = INSN_UID (insn);
548 VARRAY_BB (basic_block_for_insn, uid) = bb;
551 insn = NEXT_INSN (insn);
556 /* Update insns block within BB. */
559 update_bb_for_insn (bb)
564 if (! basic_block_for_insn)
567 for (insn = bb->head; ; insn = NEXT_INSN (insn))
569 set_block_for_insn (insn, bb);
576 /* Record INSN's block as BB. */
579 set_block_for_insn (insn, bb)
583 size_t uid = INSN_UID (insn);
584 if (uid >= basic_block_for_insn->num_elements)
588 /* Add one-eighth the size so we don't keep calling xrealloc. */
589 new_size = uid + (uid + 7) / 8;
591 VARRAY_GROW (basic_block_for_insn, new_size);
593 VARRAY_BB (basic_block_for_insn, uid) = bb;
596 /* When a new insn has been inserted into an existing block, it will
597 sometimes emit more than a single insn. This routine will set the
598 block number for the specified insn, and look backwards in the insn
599 chain to see if there are any other uninitialized insns immediately
600 previous to this one, and set the block number for them too. */
603 set_block_for_new_insns (insn, bb)
607 set_block_for_insn (insn, bb);
609 /* Scan the previous instructions setting the block number until we find
610 an instruction that has the block number set, or we find a note
612 for (insn = PREV_INSN (insn); insn != NULL_RTX; insn = PREV_INSN (insn))
614 if (GET_CODE (insn) == NOTE)
616 if ((unsigned) INSN_UID (insn) >= basic_block_for_insn->num_elements
617 || BLOCK_FOR_INSN (insn) == 0)
618 set_block_for_insn (insn, bb);
624 /* Create an edge connecting SRC and DST with FLAGS optionally using
625 edge cache CACHE. Return the new edge, NULL if already exist. */
628 cached_make_edge (edge_cache, src, dst, flags)
630 basic_block src, dst;
636 /* Don't bother with edge cache for ENTRY or EXIT; there aren't that
637 many edges to them, and we didn't allocate memory for it. */
638 use_edge_cache = (edge_cache
639 && src != ENTRY_BLOCK_PTR
640 && dst != EXIT_BLOCK_PTR);
642 /* Make sure we don't add duplicate edges. */
643 switch (use_edge_cache)
646 /* Quick test for non-existance of the edge. */
647 if (! TEST_BIT (edge_cache[src->index], dst->index))
650 /* The edge exists; early exit if no work to do. */
656 for (e = src->succ; e; e = e->succ_next)
665 if (first_deleted_edge)
667 e = first_deleted_edge;
668 first_deleted_edge = e->succ_next;
672 e = (edge) obstack_alloc (&flow_obstack, sizeof (*e));
673 memset (e, 0, sizeof (*e));
677 e->succ_next = src->succ;
678 e->pred_next = dst->pred;
687 SET_BIT (edge_cache[src->index], dst->index);
692 /* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
693 created edge or NULL if already exist. */
696 make_edge (src, dest, flags)
697 basic_block src, dest;
700 return cached_make_edge (NULL, src, dest, flags);
703 /* Create an edge connecting SRC to DEST and set probability by knowling
704 that it is the single edge leaving SRC. */
707 make_single_succ_edge (src, dest, flags)
708 basic_block src, dest;
711 edge e = make_edge (src, dest, flags);
713 e->probability = REG_BR_PROB_BASE;
714 e->count = src->count;
718 /* This function will remove an edge from the flow graph. */
724 edge last_pred = NULL;
725 edge last_succ = NULL;
727 basic_block src, dest;
730 for (tmp = src->succ; tmp && tmp != e; tmp = tmp->succ_next)
736 last_succ->succ_next = e->succ_next;
738 src->succ = e->succ_next;
740 for (tmp = dest->pred; tmp && tmp != e; tmp = tmp->pred_next)
746 last_pred->pred_next = e->pred_next;
748 dest->pred = e->pred_next;
751 memset (e, 0, sizeof (*e));
752 e->succ_next = first_deleted_edge;
753 first_deleted_edge = e;
756 /* Redirect an edge's successor from one block to another. */
759 redirect_edge_succ (e, new_succ)
761 basic_block new_succ;
765 /* Disconnect the edge from the old successor block. */
766 for (pe = &e->dest->pred; *pe != e; pe = &(*pe)->pred_next)
768 *pe = (*pe)->pred_next;
770 /* Reconnect the edge to the new successor block. */
771 e->pred_next = new_succ->pred;
776 /* Like previous but avoid possible dupplicate edge. */
779 redirect_edge_succ_nodup (e, new_succ)
781 basic_block new_succ;
784 /* Check whether the edge is already present. */
785 for (s = e->src->succ; s; s = s->succ_next)
786 if (s->dest == new_succ && s != e)
790 s->flags |= e->flags;
791 s->probability += e->probability;
792 s->count += e->count;
797 redirect_edge_succ (e, new_succ);
801 /* Redirect an edge's predecessor from one block to another. */
804 redirect_edge_pred (e, new_pred)
806 basic_block new_pred;
810 /* Disconnect the edge from the old predecessor block. */
811 for (pe = &e->src->succ; *pe != e; pe = &(*pe)->succ_next)
813 *pe = (*pe)->succ_next;
815 /* Reconnect the edge to the new predecessor block. */
816 e->succ_next = new_pred->succ;
821 /* Split a block BB after insn INSN creating a new fallthru edge.
822 Return the new edge. Note that to keep other parts of the compiler happy,
823 this function renumbers all the basic blocks so that the new
824 one has a number one greater than the block split. */
827 split_block (bb, insn)
835 /* There is no point splitting the block after its end. */
839 /* Create the new basic block. */
840 new_bb = create_basic_block (bb->index + 1, NEXT_INSN (insn), bb->end);
841 new_bb->count = bb->count;
842 new_bb->frequency = bb->frequency;
843 new_bb->loop_depth = bb->loop_depth;
846 /* Redirect the outgoing edges. */
847 new_bb->succ = bb->succ;
849 for (e = new_bb->succ; e; e = e->succ_next)
852 new_edge = make_single_succ_edge (bb, new_bb, EDGE_FALLTHRU);
854 if (bb->global_live_at_start)
856 new_bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
857 new_bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
858 COPY_REG_SET (new_bb->global_live_at_end, bb->global_live_at_end);
860 /* We now have to calculate which registers are live at the end
861 of the split basic block and at the start of the new basic
862 block. Start with those registers that are known to be live
863 at the end of the original basic block and get
864 propagate_block to determine which registers are live. */
865 COPY_REG_SET (new_bb->global_live_at_start, bb->global_live_at_end);
866 propagate_block (new_bb, new_bb->global_live_at_start, NULL, NULL, 0);
867 COPY_REG_SET (bb->global_live_at_end,
868 new_bb->global_live_at_start);
874 /* Blocks A and B are to be merged into a single block A. The insns
875 are already contiguous, hence `nomove'. */
878 merge_blocks_nomove (a, b)
882 rtx b_head, b_end, a_end;
883 rtx del_first = NULL_RTX, del_last = NULL_RTX;
886 /* If there was a CODE_LABEL beginning B, delete it. */
889 if (GET_CODE (b_head) == CODE_LABEL)
891 /* Detect basic blocks with nothing but a label. This can happen
892 in particular at the end of a function. */
895 del_first = del_last = b_head;
896 b_head = NEXT_INSN (b_head);
899 /* Delete the basic block note. */
900 if (NOTE_INSN_BASIC_BLOCK_P (b_head))
907 b_head = NEXT_INSN (b_head);
910 /* If there was a jump out of A, delete it. */
912 if (GET_CODE (a_end) == JUMP_INSN)
916 for (prev = PREV_INSN (a_end); ; prev = PREV_INSN (prev))
917 if (GET_CODE (prev) != NOTE
918 || NOTE_LINE_NUMBER (prev) == NOTE_INSN_BASIC_BLOCK
925 /* If this was a conditional jump, we need to also delete
926 the insn that set cc0. */
927 if (only_sets_cc0_p (prev))
930 prev = prev_nonnote_insn (prev);
939 else if (GET_CODE (NEXT_INSN (a_end)) == BARRIER)
940 del_first = NEXT_INSN (a_end);
942 /* Delete everything marked above as well as crap that might be
943 hanging out between the two blocks. */
944 flow_delete_insn_chain (del_first, del_last);
946 /* Normally there should only be one successor of A and that is B, but
947 partway though the merge of blocks for conditional_execution we'll
948 be merging a TEST block with THEN and ELSE successors. Free the
949 whole lot of them and hope the caller knows what they're doing. */
951 remove_edge (a->succ);
953 /* Adjust the edges out of B for the new owner. */
954 for (e = b->succ; e; e = e->succ_next)
958 /* B hasn't quite yet ceased to exist. Attempt to prevent mishap. */
959 b->pred = b->succ = NULL;
961 /* Reassociate the insns of B with A. */
964 if (basic_block_for_insn)
966 BLOCK_FOR_INSN (b_head) = a;
967 while (b_head != b_end)
969 b_head = NEXT_INSN (b_head);
970 BLOCK_FOR_INSN (b_head) = a;
980 /* Return label in the head of basic block. Create one if it doesn't exist. */
986 if (block == EXIT_BLOCK_PTR)
988 if (GET_CODE (block->head) != CODE_LABEL)
990 block->head = emit_label_before (gen_label_rtx (), block->head);
991 if (basic_block_for_insn)
992 set_block_for_insn (block->head, block);
997 /* Attempt to perform edge redirection by replacing possibly complex jump
998 instruction by unconditional jump or removing jump completely.
999 This can apply only if all edges now point to the same block.
1001 The parameters and return values are equivalent to redirect_edge_and_branch.
1005 try_redirect_by_replacing_jump (e, target)
1009 basic_block src = e->src;
1010 rtx insn = src->end, kill_from;
1015 /* Verify that all targets will be TARGET. */
1016 for (tmp = src->succ; tmp; tmp = tmp->succ_next)
1017 if (tmp->dest != target && tmp != e)
1019 if (tmp || !onlyjump_p (insn))
1022 /* Avoid removing branch with side effects. */
1023 set = single_set (insn);
1024 if (!set || side_effects_p (set))
1027 /* In case we zap a conditional jump, we'll need to kill
1028 the cc0 setter too. */
1031 if (reg_mentioned_p (cc0_rtx, PATTERN (insn)))
1032 kill_from = PREV_INSN (insn);
1035 /* See if we can create the fallthru edge. */
1036 if (can_fallthru (src, target))
1038 src->end = PREV_INSN (kill_from);
1040 fprintf (rtl_dump_file, "Removing jump %i.\n", INSN_UID (insn));
1043 /* Selectivly unlink whole insn chain. */
1044 flow_delete_insn_chain (kill_from, PREV_INSN (target->head));
1046 /* If this already is simplejump, redirect it. */
1047 else if (simplejump_p (insn))
1049 if (e->dest == target)
1052 fprintf (rtl_dump_file, "Redirecting jump %i from %i to %i.\n",
1053 INSN_UID (insn), e->dest->index, target->index);
1054 redirect_jump (insn, block_label (target), 0);
1056 /* Or replace possibly complicated jump insn by simple jump insn. */
1059 rtx target_label = block_label (target);
1062 src->end = emit_jump_insn_before (gen_jump (target_label), kill_from);
1063 JUMP_LABEL (src->end) = target_label;
1064 LABEL_NUSES (target_label)++;
1065 if (basic_block_for_insn)
1066 set_block_for_new_insns (src->end, src);
1068 fprintf (rtl_dump_file, "Replacing insn %i by jump %i\n",
1069 INSN_UID (insn), INSN_UID (src->end));
1071 flow_delete_insn_chain (kill_from, insn);
1073 barrier = next_nonnote_insn (src->end);
1074 if (!barrier || GET_CODE (barrier) != BARRIER)
1075 emit_barrier_after (src->end);
1078 /* Keep only one edge out and set proper flags. */
1079 while (src->succ->succ_next)
1080 remove_edge (src->succ);
1083 e->flags = EDGE_FALLTHRU;
1086 e->probability = REG_BR_PROB_BASE;
1087 e->count = src->count;
1089 /* We don't want a block to end on a line-number note since that has
1090 the potential of changing the code between -g and not -g. */
1091 while (GET_CODE (e->src->end) == NOTE
1092 && NOTE_LINE_NUMBER (e->src->end) >= 0)
1094 rtx prev = PREV_INSN (e->src->end);
1095 flow_delete_insn (e->src->end);
1099 if (e->dest != target)
1100 redirect_edge_succ (e, target);
1104 /* Return last loop_beg note appearing after INSN, before start of next
1105 basic block. Return INSN if there are no such notes.
1107 When emmiting jump to redirect an fallthru edge, it should always
1108 appear after the LOOP_BEG notes, as loop optimizer expect loop to
1109 eighter start by fallthru edge or jump following the LOOP_BEG note
1110 jumping to the loop exit test. */
1113 last_loop_beg_note (insn)
1117 insn = NEXT_INSN (insn);
1118 while (insn && GET_CODE (insn) == NOTE
1119 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK)
1121 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1123 insn = NEXT_INSN (insn);
1128 /* Attempt to change code to redirect edge E to TARGET.
1129 Don't do that on expense of adding new instructions or reordering
1132 Function can be also called with edge destionation equivalent to the
1133 TARGET. Then it should try the simplifications and do nothing if
1136 Return true if transformation suceeded. We still return flase in case
1137 E already destinated TARGET and we didn't managed to simplify instruction
1141 redirect_edge_and_branch (e, target)
1146 rtx old_label = e->dest->head;
1147 basic_block src = e->src;
1148 rtx insn = src->end;
1150 if (e->flags & EDGE_COMPLEX)
1153 if (try_redirect_by_replacing_jump (e, target))
1155 /* Do this fast path late, as we want above code to simplify for cases
1156 where called on single edge leaving basic block containing nontrivial
1158 else if (e->dest == target)
1161 /* We can only redirect non-fallthru edges of jump insn. */
1162 if (e->flags & EDGE_FALLTHRU)
1164 if (GET_CODE (insn) != JUMP_INSN)
1167 /* Recognize a tablejump and adjust all matching cases. */
1168 if ((tmp = JUMP_LABEL (insn)) != NULL_RTX
1169 && (tmp = NEXT_INSN (tmp)) != NULL_RTX
1170 && GET_CODE (tmp) == JUMP_INSN
1171 && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
1172 || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
1176 rtx new_label = block_label (target);
1178 if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
1179 vec = XVEC (PATTERN (tmp), 0);
1181 vec = XVEC (PATTERN (tmp), 1);
1183 for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
1184 if (XEXP (RTVEC_ELT (vec, j), 0) == old_label)
1186 RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (Pmode, new_label);
1187 --LABEL_NUSES (old_label);
1188 ++LABEL_NUSES (new_label);
1191 /* Handle casesi dispatch insns */
1192 if ((tmp = single_set (insn)) != NULL
1193 && SET_DEST (tmp) == pc_rtx
1194 && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
1195 && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF
1196 && XEXP (XEXP (SET_SRC (tmp), 2), 0) == old_label)
1198 XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (VOIDmode,
1200 --LABEL_NUSES (old_label);
1201 ++LABEL_NUSES (new_label);
1206 /* ?? We may play the games with moving the named labels from
1207 one basic block to the other in case only one computed_jump is
1209 if (computed_jump_p (insn))
1212 /* A return instruction can't be redirected. */
1213 if (returnjump_p (insn))
1216 /* If the insn doesn't go where we think, we're confused. */
1217 if (JUMP_LABEL (insn) != old_label)
1219 redirect_jump (insn, block_label (target), 0);
1223 fprintf (rtl_dump_file, "Edge %i->%i redirected to %i\n",
1224 e->src->index, e->dest->index, target->index);
1225 if (e->dest != target)
1226 redirect_edge_succ_nodup (e, target);
1230 /* Like force_nonfallthru bellow, but additionally performs redirection
1231 Used by redirect_edge_and_branch_force. */
1234 force_nonfallthru_and_redirect (e, target)
1238 basic_block jump_block, new_bb = NULL;
1243 if (e->flags & EDGE_ABNORMAL)
1245 if (!(e->flags & EDGE_FALLTHRU))
1247 if (e->src->succ->succ_next)
1249 /* Create the new structures. */
1250 note = last_loop_beg_note (e->src->end);
1251 jump_block = create_basic_block (e->src->index + 1, NEXT_INSN (note), NULL);
1252 jump_block->count = e->count;
1253 jump_block->frequency = EDGE_FREQUENCY (e);
1254 jump_block->loop_depth = target->loop_depth;
1256 if (target->global_live_at_start)
1258 jump_block->global_live_at_start =
1259 OBSTACK_ALLOC_REG_SET (&flow_obstack);
1260 jump_block->global_live_at_end =
1261 OBSTACK_ALLOC_REG_SET (&flow_obstack);
1262 COPY_REG_SET (jump_block->global_live_at_start,
1263 target->global_live_at_start);
1264 COPY_REG_SET (jump_block->global_live_at_end,
1265 target->global_live_at_start);
1269 new_edge = make_edge (e->src, jump_block, EDGE_FALLTHRU);
1270 new_edge->probability = e->probability;
1271 new_edge->count = e->count;
1273 /* Redirect old edge. */
1274 redirect_edge_pred (e, jump_block);
1275 e->probability = REG_BR_PROB_BASE;
1277 new_bb = jump_block;
1280 jump_block = e->src;
1281 e->flags &= ~EDGE_FALLTHRU;
1282 label = block_label (target);
1283 jump_block->end = emit_jump_insn_after (gen_jump (label), jump_block->end);
1284 JUMP_LABEL (jump_block->end) = label;
1285 LABEL_NUSES (label)++;
1286 if (basic_block_for_insn)
1287 set_block_for_new_insns (jump_block->end, jump_block);
1288 emit_barrier_after (jump_block->end);
1289 redirect_edge_succ_nodup (e, target);
1294 /* Edge E is assumed to be fallthru edge. Emit needed jump instruction
1295 (and possibly create new basic block) to make edge non-fallthru.
1296 Return newly created BB or NULL if none. */
1298 force_nonfallthru (e)
1301 return force_nonfallthru_and_redirect (e, e->dest);
1304 /* Redirect edge even at the expense of creating new jump insn or
1305 basic block. Return new basic block if created, NULL otherwise.
1306 Abort if converison is impossible. */
1309 redirect_edge_and_branch_force (e, target)
1315 if (redirect_edge_and_branch (e, target))
1317 if (e->dest == target)
1320 /* In case the edge redirection failed, try to force it to be non-fallthru
1321 and redirect newly created simplejump. */
1322 new_bb = force_nonfallthru_and_redirect (e, target);
1326 /* The given edge should potentially be a fallthru edge. If that is in
1327 fact true, delete the jump and barriers that are in the way. */
1330 tidy_fallthru_edge (e, b, c)
1336 /* ??? In a late-running flow pass, other folks may have deleted basic
1337 blocks by nopping out blocks, leaving multiple BARRIERs between here
1338 and the target label. They ought to be chastized and fixed.
1340 We can also wind up with a sequence of undeletable labels between
1341 one block and the next.
1343 So search through a sequence of barriers, labels, and notes for
1344 the head of block C and assert that we really do fall through. */
1346 if (next_real_insn (b->end) != next_real_insn (PREV_INSN (c->head)))
1349 /* Remove what will soon cease being the jump insn from the source block.
1350 If block B consisted only of this single jump, turn it into a deleted
1353 if (GET_CODE (q) == JUMP_INSN
1355 && (any_uncondjump_p (q)
1356 || (b->succ == e && e->succ_next == NULL)))
1359 /* If this was a conditional jump, we need to also delete
1360 the insn that set cc0. */
1361 if (any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1368 NOTE_LINE_NUMBER (q) = NOTE_INSN_DELETED;
1369 NOTE_SOURCE_FILE (q) = 0;
1375 /* We don't want a block to end on a line-number note since that has
1376 the potential of changing the code between -g and not -g. */
1377 while (GET_CODE (q) == NOTE && NOTE_LINE_NUMBER (q) >= 0)
1384 /* Selectively unlink the sequence. */
1385 if (q != PREV_INSN (c->head))
1386 flow_delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
1388 e->flags |= EDGE_FALLTHRU;
1391 /* Fix up edges that now fall through, or rather should now fall through
1392 but previously required a jump around now deleted blocks. Simplify
1393 the search by only examining blocks numerically adjacent, since this
1394 is how find_basic_blocks created them. */
1397 tidy_fallthru_edges ()
1401 for (i = 1; i < n_basic_blocks; ++i)
1403 basic_block b = BASIC_BLOCK (i - 1);
1404 basic_block c = BASIC_BLOCK (i);
1407 /* We care about simple conditional or unconditional jumps with
1410 If we had a conditional branch to the next instruction when
1411 find_basic_blocks was called, then there will only be one
1412 out edge for the block which ended with the conditional
1413 branch (since we do not create duplicate edges).
1415 Furthermore, the edge will be marked as a fallthru because we
1416 merge the flags for the duplicate edges. So we do not want to
1417 check that the edge is not a FALLTHRU edge. */
1418 if ((s = b->succ) != NULL
1419 && ! (s->flags & EDGE_COMPLEX)
1420 && s->succ_next == NULL
1422 /* If the jump insn has side effects, we can't tidy the edge. */
1423 && (GET_CODE (b->end) != JUMP_INSN
1424 || onlyjump_p (b->end)))
1425 tidy_fallthru_edge (s, b, c);
1429 /* Helper function for split_edge. Return true in case edge BB2 to BB1
1430 is back edge of syntactic loop. */
1433 back_edge_of_syntactic_loop_p (bb1, bb2)
1434 basic_block bb1, bb2;
1439 if (bb1->index > bb2->index)
1442 if (bb1->index == bb2->index)
1445 for (insn = bb1->end; insn != bb2->head && count >= 0;
1446 insn = NEXT_INSN (insn))
1447 if (GET_CODE (insn) == NOTE)
1449 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1451 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
1458 /* Split a (typically critical) edge. Return the new block.
1459 Abort on abnormal edges.
1461 ??? The code generally expects to be called on critical edges.
1462 The case of a block ending in an unconditional jump to a
1463 block with multiple predecessors is not handled optimally. */
1466 split_edge (edge_in)
1473 /* Abnormal edges cannot be split. */
1474 if ((edge_in->flags & EDGE_ABNORMAL) != 0)
1477 /* We are going to place the new block in front of edge destination.
1478 Avoid existence of fallthru predecesors. */
1479 if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1482 for (e = edge_in->dest->pred; e; e = e->pred_next)
1483 if (e->flags & EDGE_FALLTHRU)
1487 force_nonfallthru (e);
1490 /* Create the basic block note.
1492 Where we place the note can have a noticable impact on the generated
1493 code. Consider this cfg:
1503 If we need to insert an insn on the edge from block 0 to block 1,
1504 we want to ensure the instructions we insert are outside of any
1505 loop notes that physically sit between block 0 and block 1. Otherwise
1506 we confuse the loop optimizer into thinking the loop is a phony. */
1508 if (edge_in->dest != EXIT_BLOCK_PTR
1509 && PREV_INSN (edge_in->dest->head)
1510 && GET_CODE (PREV_INSN (edge_in->dest->head)) == NOTE
1511 && NOTE_LINE_NUMBER (PREV_INSN (edge_in->dest->head)) == NOTE_INSN_LOOP_BEG
1512 && !back_edge_of_syntactic_loop_p (edge_in->dest, edge_in->src))
1513 before = PREV_INSN (edge_in->dest->head);
1514 else if (edge_in->dest != EXIT_BLOCK_PTR)
1515 before = edge_in->dest->head;
1519 bb = create_basic_block (edge_in->dest == EXIT_BLOCK_PTR ? n_basic_blocks
1520 : edge_in->dest->index, before, NULL);
1521 bb->count = edge_in->count;
1522 bb->frequency = EDGE_FREQUENCY (edge_in);
1524 /* ??? This info is likely going to be out of date very soon. */
1525 if (edge_in->dest->global_live_at_start)
1527 bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1528 bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1529 COPY_REG_SET (bb->global_live_at_start, edge_in->dest->global_live_at_start);
1530 COPY_REG_SET (bb->global_live_at_end, edge_in->dest->global_live_at_start);
1533 edge_out = make_single_succ_edge (bb, edge_in->dest, EDGE_FALLTHRU);
1535 /* For non-fallthry edges, we must adjust the predecessor's
1536 jump instruction to target our new block. */
1537 if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1539 if (!redirect_edge_and_branch (edge_in, bb))
1543 redirect_edge_succ (edge_in, bb);
1548 /* Queue instructions for insertion on an edge between two basic blocks.
1549 The new instructions and basic blocks (if any) will not appear in the
1550 CFG until commit_edge_insertions is called. */
1553 insert_insn_on_edge (pattern, e)
1557 /* We cannot insert instructions on an abnormal critical edge.
1558 It will be easier to find the culprit if we die now. */
1559 if ((e->flags & EDGE_ABNORMAL) && EDGE_CRITICAL_P (e))
1562 if (e->insns == NULL_RTX)
1565 push_to_sequence (e->insns);
1567 emit_insn (pattern);
1569 e->insns = get_insns ();
1573 /* Update the CFG for the instructions queued on edge E. */
1576 commit_one_edge_insertion (e)
1579 rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1582 /* Pull the insns off the edge now since the edge might go away. */
1584 e->insns = NULL_RTX;
1586 /* Figure out where to put these things. If the destination has
1587 one predecessor, insert there. Except for the exit block. */
1588 if (e->dest->pred->pred_next == NULL
1589 && e->dest != EXIT_BLOCK_PTR)
1593 /* Get the location correct wrt a code label, and "nice" wrt
1594 a basic block note, and before everything else. */
1596 if (GET_CODE (tmp) == CODE_LABEL)
1597 tmp = NEXT_INSN (tmp);
1598 if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1599 tmp = NEXT_INSN (tmp);
1600 if (tmp == bb->head)
1603 after = PREV_INSN (tmp);
1606 /* If the source has one successor and the edge is not abnormal,
1607 insert there. Except for the entry block. */
1608 else if ((e->flags & EDGE_ABNORMAL) == 0
1609 && e->src->succ->succ_next == NULL
1610 && e->src != ENTRY_BLOCK_PTR)
1613 /* It is possible to have a non-simple jump here. Consider a target
1614 where some forms of unconditional jumps clobber a register. This
1615 happens on the fr30 for example.
1617 We know this block has a single successor, so we can just emit
1618 the queued insns before the jump. */
1619 if (GET_CODE (bb->end) == JUMP_INSN)
1622 while (GET_CODE (PREV_INSN (before)) == NOTE
1623 && NOTE_LINE_NUMBER (PREV_INSN (before)) == NOTE_INSN_LOOP_BEG)
1624 before = PREV_INSN (before);
1628 /* We'd better be fallthru, or we've lost track of what's what. */
1629 if ((e->flags & EDGE_FALLTHRU) == 0)
1636 /* Otherwise we must split the edge. */
1639 bb = split_edge (e);
1643 /* Now that we've found the spot, do the insertion. */
1645 /* Set the new block number for these insns, if structure is allocated. */
1646 if (basic_block_for_insn)
1649 for (i = insns; i != NULL_RTX; i = NEXT_INSN (i))
1650 set_block_for_insn (i, bb);
1655 emit_insns_before (insns, before);
1656 if (before == bb->head)
1659 last = prev_nonnote_insn (before);
1663 last = emit_insns_after (insns, after);
1664 if (after == bb->end)
1668 if (returnjump_p (last))
1670 /* ??? Remove all outgoing edges from BB and add one for EXIT.
1671 This is not currently a problem because this only happens
1672 for the (single) epilogue, which already has a fallthru edge
1676 if (e->dest != EXIT_BLOCK_PTR
1677 || e->succ_next != NULL
1678 || (e->flags & EDGE_FALLTHRU) == 0)
1680 e->flags &= ~EDGE_FALLTHRU;
1682 emit_barrier_after (last);
1686 flow_delete_insn (before);
1688 else if (GET_CODE (last) == JUMP_INSN)
1690 find_sub_basic_blocks (bb);
1693 /* Update the CFG for all queued instructions. */
1696 commit_edge_insertions ()
1700 compute_bb_for_insn (get_max_uid ());
1702 #ifdef ENABLE_CHECKING
1703 verify_flow_info ();
1707 bb = ENTRY_BLOCK_PTR;
1712 for (e = bb->succ; e; e = next)
1714 next = e->succ_next;
1716 commit_one_edge_insertion (e);
1719 if (++i >= n_basic_blocks)
1721 bb = BASIC_BLOCK (i);
1726 dump_flow_info (file)
1730 static const char * const reg_class_names[] = REG_CLASS_NAMES;
1732 fprintf (file, "%d registers.\n", max_regno);
1733 for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
1736 enum reg_class class, altclass;
1737 fprintf (file, "\nRegister %d used %d times across %d insns",
1738 i, REG_N_REFS (i), REG_LIVE_LENGTH (i));
1739 if (REG_BASIC_BLOCK (i) >= 0)
1740 fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
1742 fprintf (file, "; set %d time%s", REG_N_SETS (i),
1743 (REG_N_SETS (i) == 1) ? "" : "s");
1744 if (REG_USERVAR_P (regno_reg_rtx[i]))
1745 fprintf (file, "; user var");
1746 if (REG_N_DEATHS (i) != 1)
1747 fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
1748 if (REG_N_CALLS_CROSSED (i) == 1)
1749 fprintf (file, "; crosses 1 call");
1750 else if (REG_N_CALLS_CROSSED (i))
1751 fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
1752 if (PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD)
1753 fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i));
1754 class = reg_preferred_class (i);
1755 altclass = reg_alternate_class (i);
1756 if (class != GENERAL_REGS || altclass != ALL_REGS)
1758 if (altclass == ALL_REGS || class == ALL_REGS)
1759 fprintf (file, "; pref %s", reg_class_names[(int) class]);
1760 else if (altclass == NO_REGS)
1761 fprintf (file, "; %s or none", reg_class_names[(int) class]);
1763 fprintf (file, "; pref %s, else %s",
1764 reg_class_names[(int) class],
1765 reg_class_names[(int) altclass]);
1767 if (REG_POINTER (regno_reg_rtx[i]))
1768 fprintf (file, "; pointer");
1769 fprintf (file, ".\n");
1772 fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks, n_edges);
1773 for (i = 0; i < n_basic_blocks; i++)
1775 register basic_block bb = BASIC_BLOCK (i);
1778 fprintf (file, "\nBasic block %d: first insn %d, last %d, loop_depth %d, count ",
1779 i, INSN_UID (bb->head), INSN_UID (bb->end), bb->loop_depth);
1780 fprintf (file, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) bb->count);
1781 fprintf (file, ", freq %i.\n", bb->frequency);
1783 fprintf (file, "Predecessors: ");
1784 for (e = bb->pred; e; e = e->pred_next)
1785 dump_edge_info (file, e, 0);
1787 fprintf (file, "\nSuccessors: ");
1788 for (e = bb->succ; e; e = e->succ_next)
1789 dump_edge_info (file, e, 1);
1791 fprintf (file, "\nRegisters live at start:");
1792 dump_regset (bb->global_live_at_start, file);
1794 fprintf (file, "\nRegisters live at end:");
1795 dump_regset (bb->global_live_at_end, file);
1806 dump_flow_info (stderr);
1810 dump_edge_info (file, e, do_succ)
1815 basic_block side = (do_succ ? e->dest : e->src);
1817 if (side == ENTRY_BLOCK_PTR)
1818 fputs (" ENTRY", file);
1819 else if (side == EXIT_BLOCK_PTR)
1820 fputs (" EXIT", file);
1822 fprintf (file, " %d", side->index);
1825 fprintf (file, " [%.1f%%] ", e->probability * 100.0 / REG_BR_PROB_BASE);
1829 fprintf (file, " count:");
1830 fprintf (file, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) e->count);
1835 static const char * const bitnames[] = {
1836 "fallthru", "ab", "abcall", "eh", "fake", "dfs_back"
1839 int i, flags = e->flags;
1843 for (i = 0; flags; i++)
1844 if (flags & (1 << i))
1850 if (i < (int) ARRAY_SIZE (bitnames))
1851 fputs (bitnames[i], file);
1853 fprintf (file, "%d", i);
1860 /* Print out one basic block with live information at start and end. */
1871 fprintf (outf, ";; Basic block %d, loop depth %d, count ",
1872 bb->index, bb->loop_depth);
1873 fprintf (outf, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) bb->count);
1876 fputs (";; Predecessors: ", outf);
1877 for (e = bb->pred; e; e = e->pred_next)
1878 dump_edge_info (outf, e, 0);
1881 fputs (";; Registers live at start:", outf);
1882 dump_regset (bb->global_live_at_start, outf);
1885 for (insn = bb->head, last = NEXT_INSN (bb->end);
1887 insn = NEXT_INSN (insn))
1888 print_rtl_single (outf, insn);
1890 fputs (";; Registers live at end:", outf);
1891 dump_regset (bb->global_live_at_end, outf);
1894 fputs (";; Successors: ", outf);
1895 for (e = bb->succ; e; e = e->succ_next)
1896 dump_edge_info (outf, e, 1);
1904 dump_bb (bb, stderr);
1911 dump_bb (BASIC_BLOCK (n), stderr);
1914 /* Like print_rtl, but also print out live information for the start of each
1918 print_rtl_with_bb (outf, rtx_first)
1922 register rtx tmp_rtx;
1925 fprintf (outf, "(nil)\n");
1929 enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
1930 int max_uid = get_max_uid ();
1931 basic_block *start = (basic_block *)
1932 xcalloc (max_uid, sizeof (basic_block));
1933 basic_block *end = (basic_block *)
1934 xcalloc (max_uid, sizeof (basic_block));
1935 enum bb_state *in_bb_p = (enum bb_state *)
1936 xcalloc (max_uid, sizeof (enum bb_state));
1938 for (i = n_basic_blocks - 1; i >= 0; i--)
1940 basic_block bb = BASIC_BLOCK (i);
1943 start[INSN_UID (bb->head)] = bb;
1944 end[INSN_UID (bb->end)] = bb;
1945 for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x))
1947 enum bb_state state = IN_MULTIPLE_BB;
1948 if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
1950 in_bb_p[INSN_UID (x)] = state;
1957 for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
1962 if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
1964 fprintf (outf, ";; Start of basic block %d, registers live:",
1966 dump_regset (bb->global_live_at_start, outf);
1970 if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
1971 && GET_CODE (tmp_rtx) != NOTE
1972 && GET_CODE (tmp_rtx) != BARRIER)
1973 fprintf (outf, ";; Insn is not within a basic block\n");
1974 else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
1975 fprintf (outf, ";; Insn is in multiple basic blocks\n");
1977 did_output = print_rtl_single (outf, tmp_rtx);
1979 if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
1981 fprintf (outf, ";; End of basic block %d, registers live:\n",
1983 dump_regset (bb->global_live_at_end, outf);
1996 if (current_function_epilogue_delay_list != 0)
1998 fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
1999 for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
2000 tmp_rtx = XEXP (tmp_rtx, 1))
2001 print_rtl_single (outf, XEXP (tmp_rtx, 0));
2005 /* Verify the CFG consistency. This function check some CFG invariants and
2006 aborts when something is wrong. Hope that this function will help to
2007 convert many optimization passes to preserve CFG consistent.
2009 Currently it does following checks:
2011 - test head/end pointers
2012 - overlapping of basic blocks
2013 - edge list correctness
2014 - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
2015 - tails of basic blocks (ensure that boundary is necesary)
2016 - scans body of the basic block for JUMP_INSN, CODE_LABEL
2017 and NOTE_INSN_BASIC_BLOCK
2018 - check that all insns are in the basic blocks
2019 (except the switch handling code, barriers and notes)
2020 - check that all returns are followed by barriers
2022 In future it can be extended check a lot of other stuff as well
2023 (reachability of basic blocks, life information, etc. etc.). */
2028 const int max_uid = get_max_uid ();
2029 const rtx rtx_first = get_insns ();
2030 rtx last_head = get_last_insn ();
2031 basic_block *bb_info, *last_visited;
2032 size_t *edge_checksum;
2034 int i, last_bb_num_seen, num_bb_notes, err = 0;
2036 bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
2037 last_visited = (basic_block *) xcalloc (n_basic_blocks + 2,
2038 sizeof (basic_block));
2039 edge_checksum = (size_t *) xcalloc (n_basic_blocks + 2, sizeof (size_t));
2041 for (i = n_basic_blocks - 1; i >= 0; i--)
2043 basic_block bb = BASIC_BLOCK (i);
2044 rtx head = bb->head;
2047 /* Verify the end of the basic block is in the INSN chain. */
2048 for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
2053 error ("End insn %d for block %d not found in the insn stream.",
2054 INSN_UID (end), bb->index);
2058 /* Work backwards from the end to the head of the basic block
2059 to verify the head is in the RTL chain. */
2060 for (; x != NULL_RTX; x = PREV_INSN (x))
2062 /* While walking over the insn chain, verify insns appear
2063 in only one basic block and initialize the BB_INFO array
2064 used by other passes. */
2065 if (bb_info[INSN_UID (x)] != NULL)
2067 error ("Insn %d is in multiple basic blocks (%d and %d)",
2068 INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
2071 bb_info[INSN_UID (x)] = bb;
2078 error ("Head insn %d for block %d not found in the insn stream.",
2079 INSN_UID (head), bb->index);
2086 /* Now check the basic blocks (boundaries etc.) */
2087 for (i = n_basic_blocks - 1; i >= 0; i--)
2089 basic_block bb = BASIC_BLOCK (i);
2090 int has_fallthru = 0;
2096 if (last_visited [e->dest->index + 2] == bb)
2098 error ("verify_flow_info: Duplicate edge %i->%i",
2099 e->src->index, e->dest->index);
2102 last_visited [e->dest->index + 2] = bb;
2104 if (e->flags & EDGE_FALLTHRU)
2107 if ((e->flags & EDGE_FALLTHRU)
2108 && e->src != ENTRY_BLOCK_PTR
2109 && e->dest != EXIT_BLOCK_PTR)
2112 if (e->src->index + 1 != e->dest->index)
2114 error ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
2115 e->src->index, e->dest->index);
2119 for (insn = NEXT_INSN (e->src->end); insn != e->dest->head;
2120 insn = NEXT_INSN (insn))
2121 if (GET_CODE (insn) == BARRIER || INSN_P (insn))
2123 error ("verify_flow_info: Incorrect fallthru %i->%i",
2124 e->src->index, e->dest->index);
2125 fatal_insn ("Wrong insn in the fallthru edge", insn);
2131 error ("verify_flow_info: Basic block %d succ edge is corrupted",
2133 fprintf (stderr, "Predecessor: ");
2134 dump_edge_info (stderr, e, 0);
2135 fprintf (stderr, "\nSuccessor: ");
2136 dump_edge_info (stderr, e, 1);
2137 fprintf (stderr, "\n");
2140 edge_checksum[e->dest->index + 2] += (size_t) e;
2147 /* Ensure existence of barrier in BB with no fallthru edges. */
2148 for (insn = bb->end; GET_CODE (insn) != BARRIER;
2149 insn = NEXT_INSN (insn))
2151 || (GET_CODE (insn) == NOTE
2152 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK))
2154 error ("Missing barrier after block %i", bb->index);
2164 error ("Basic block %d pred edge is corrupted", bb->index);
2165 fputs ("Predecessor: ", stderr);
2166 dump_edge_info (stderr, e, 0);
2167 fputs ("\nSuccessor: ", stderr);
2168 dump_edge_info (stderr, e, 1);
2169 fputc ('\n', stderr);
2172 edge_checksum[e->dest->index + 2] -= (size_t) e;
2176 /* OK pointers are correct. Now check the header of basic
2177 block. It ought to contain optional CODE_LABEL followed
2178 by NOTE_BASIC_BLOCK. */
2180 if (GET_CODE (x) == CODE_LABEL)
2184 error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2190 if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
2192 error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2199 /* Do checks for empty blocks here */
2206 if (NOTE_INSN_BASIC_BLOCK_P (x))
2208 error ("NOTE_INSN_BASIC_BLOCK %d in the middle of basic block %d",
2209 INSN_UID (x), bb->index);
2216 if (GET_CODE (x) == JUMP_INSN
2217 || GET_CODE (x) == CODE_LABEL
2218 || GET_CODE (x) == BARRIER)
2220 error ("In basic block %d:", bb->index);
2221 fatal_insn ("Flow control insn inside a basic block", x);
2229 /* Complete edge checksumming for ENTRY and EXIT. */
2232 for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2233 edge_checksum[e->dest->index + 2] += (size_t) e;
2234 for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
2235 edge_checksum[e->dest->index + 2] -= (size_t) e;
2238 for (i = -2; i < n_basic_blocks; ++i)
2239 if (edge_checksum[i + 2])
2241 error ("Basic block %i edge lists are corrupted", i);
2245 last_bb_num_seen = -1;
2250 if (NOTE_INSN_BASIC_BLOCK_P (x))
2252 basic_block bb = NOTE_BASIC_BLOCK (x);
2254 if (bb->index != last_bb_num_seen + 1)
2255 internal_error ("Basic blocks not numbered consecutively.");
2257 last_bb_num_seen = bb->index;
2260 if (!bb_info[INSN_UID (x)])
2262 switch (GET_CODE (x))
2269 /* An addr_vec is placed outside any block block. */
2271 && GET_CODE (NEXT_INSN (x)) == JUMP_INSN
2272 && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
2273 || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
2278 /* But in any case, non-deletable labels can appear anywhere. */
2282 fatal_insn ("Insn outside basic block", x);
2287 && GET_CODE (x) == JUMP_INSN
2288 && returnjump_p (x) && ! condjump_p (x)
2289 && ! (NEXT_INSN (x) && GET_CODE (NEXT_INSN (x)) == BARRIER))
2290 fatal_insn ("Return not followed by barrier", x);
2295 if (num_bb_notes != n_basic_blocks)
2297 ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2298 num_bb_notes, n_basic_blocks);
2301 internal_error ("verify_flow_info failed.");
2305 free (last_visited);
2306 free (edge_checksum);
2309 /* Assume that the preceeding pass has possibly eliminated jump instructions
2310 or converted the unconditional jumps. Eliminate the edges from CFG.
2311 Return true if any edges are eliminated. */
2314 purge_dead_edges (bb)
2319 bool purged = false;
2321 if (GET_CODE (insn) == JUMP_INSN && !simplejump_p (insn))
2323 if (GET_CODE (insn) == JUMP_INSN)
2327 /* We do care only about conditional jumps and simplejumps. */
2328 if (!any_condjump_p (insn)
2329 && !returnjump_p (insn)
2330 && !simplejump_p (insn))
2332 for (e = bb->succ; e; e = next)
2334 next = e->succ_next;
2336 /* Check purposes we can have edge. */
2337 if ((e->flags & EDGE_FALLTHRU)
2338 && any_condjump_p (insn))
2340 if (e->dest != EXIT_BLOCK_PTR
2341 && e->dest->head == JUMP_LABEL (insn))
2343 if (e->dest == EXIT_BLOCK_PTR
2344 && returnjump_p (insn))
2349 if (!bb->succ || !purged)
2352 fprintf (rtl_dump_file, "Purged edges from bb %i\n", bb->index);
2356 /* Redistribute probabilities. */
2357 if (!bb->succ->succ_next)
2359 bb->succ->probability = REG_BR_PROB_BASE;
2360 bb->succ->count = bb->count;
2364 note = find_reg_note (insn, REG_BR_PROB, NULL);
2367 b = BRANCH_EDGE (bb);
2368 f = FALLTHRU_EDGE (bb);
2369 b->probability = INTVAL (XEXP (note, 0));
2370 f->probability = REG_BR_PROB_BASE - b->probability;
2371 b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2372 f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2377 /* Cleanup abnormal edges caused by throwing insns that have been
2379 if (! can_throw_internal (bb->end))
2380 for (e = bb->succ; e; e = next)
2382 next = e->succ_next;
2383 if (e->flags & EDGE_EH)
2390 /* If we don't see a jump insn, we don't know exactly why the block would
2391 have been broken at this point. Look for a simple, non-fallthru edge,
2392 as these are only created by conditional branches. If we find such an
2393 edge we know that there used to be a jump here and can then safely
2394 remove all non-fallthru edges. */
2395 for (e = bb->succ; e && (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU));
2399 for (e = bb->succ; e; e = next)
2401 next = e->succ_next;
2402 if (!(e->flags & EDGE_FALLTHRU))
2403 remove_edge (e), purged = true;
2405 if (!bb->succ || bb->succ->succ_next)
2407 bb->succ->probability = REG_BR_PROB_BASE;
2408 bb->succ->count = bb->count;
2411 fprintf (rtl_dump_file, "Purged non-fallthru edges from bb %i\n",
2416 /* Search all basic blocks for potentionally dead edges and purge them.
2418 Return true ifif some edge has been elliminated.
2422 purge_all_dead_edges ()
2424 int i, purged = false;
2425 for (i = 0; i < n_basic_blocks; i++)
2426 purged |= purge_dead_edges (BASIC_BLOCK (i));