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
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));
151 /* Called once at intialization time. */
156 static int initialized;
158 first_deleted_edge = 0;
163 gcc_obstack_init (&flow_obstack);
164 flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
169 obstack_free (&flow_obstack, flow_firstobj);
170 flow_firstobj = (char *) obstack_alloc (&flow_obstack, 0);
174 /* Free the memory associated with the edge structures. */
181 for (i = 0; i < n_basic_blocks; ++i)
183 basic_block bb = BASIC_BLOCK (i);
186 remove_edge (bb->succ);
189 while (ENTRY_BLOCK_PTR->succ)
190 remove_edge (ENTRY_BLOCK_PTR->succ);
196 /* Return true if NOTE is not one of the ones that must be kept paired,
197 so that we may simply delete them. */
200 can_delete_note_p (note)
203 return (NOTE_LINE_NUMBER (note) == NOTE_INSN_DELETED
204 || NOTE_LINE_NUMBER (note) == NOTE_INSN_BASIC_BLOCK);
207 /* True if a given label can be deleted. */
210 can_delete_label_p (label)
215 if (LABEL_PRESERVE_P (label))
218 for (x = forced_labels; x; x = XEXP (x, 1))
219 if (label == XEXP (x, 0))
221 for (x = label_value_list; x; x = XEXP (x, 1))
222 if (label == XEXP (x, 0))
224 for (x = exception_handler_labels; x; x = XEXP (x, 1))
225 if (label == XEXP (x, 0))
228 /* User declared labels must be preserved. */
229 if (LABEL_NAME (label) != 0)
235 /* Delete INSN by patching it out. Return the next insn. */
238 flow_delete_insn (insn)
241 rtx prev = PREV_INSN (insn);
242 rtx next = NEXT_INSN (insn);
245 PREV_INSN (insn) = NULL_RTX;
246 NEXT_INSN (insn) = NULL_RTX;
247 INSN_DELETED_P (insn) = 1;
250 NEXT_INSN (prev) = next;
252 PREV_INSN (next) = prev;
254 set_last_insn (prev);
256 if (GET_CODE (insn) == CODE_LABEL)
257 remove_node_from_expr_list (insn, &nonlocal_goto_handler_labels);
259 /* If deleting a jump, decrement the use count of the label. Deleting
260 the label itself should happen in the normal course of block merging. */
261 if (GET_CODE (insn) == JUMP_INSN
263 && GET_CODE (JUMP_LABEL (insn)) == CODE_LABEL)
264 LABEL_NUSES (JUMP_LABEL (insn))--;
266 /* Also if deleting an insn that references a label. */
267 else if ((note = find_reg_note (insn, REG_LABEL, NULL_RTX)) != NULL_RTX
268 && GET_CODE (XEXP (note, 0)) == CODE_LABEL)
269 LABEL_NUSES (XEXP (note, 0))--;
271 if (GET_CODE (insn) == JUMP_INSN
272 && (GET_CODE (PATTERN (insn)) == ADDR_VEC
273 || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
275 rtx pat = PATTERN (insn);
276 int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
277 int len = XVECLEN (pat, diff_vec_p);
280 for (i = 0; i < len; i++)
281 LABEL_NUSES (XEXP (XVECEXP (pat, diff_vec_p, i), 0))--;
287 /* Unlink a chain of insns between START and FINISH, leaving notes
288 that must be paired. */
291 flow_delete_insn_chain (start, finish)
294 /* Unchain the insns one by one. It would be quicker to delete all
295 of these with a single unchaining, rather than one at a time, but
296 we need to keep the NOTE's. */
302 next = NEXT_INSN (start);
303 if (GET_CODE (start) == NOTE && !can_delete_note_p (start))
305 else if (GET_CODE (start) == CODE_LABEL
306 && ! can_delete_label_p (start))
308 const char *name = LABEL_NAME (start);
309 PUT_CODE (start, NOTE);
310 NOTE_LINE_NUMBER (start) = NOTE_INSN_DELETED_LABEL;
311 NOTE_SOURCE_FILE (start) = name;
314 next = flow_delete_insn (start);
322 /* Create a new basic block consisting of the instructions between
323 HEAD and END inclusive. Reuses the note and basic block struct
324 in BB_NOTE, if any. */
327 create_basic_block (index, head, end, bb_note)
329 rtx head, end, bb_note;
334 && ! RTX_INTEGRATED_P (bb_note)
335 && (bb = NOTE_BASIC_BLOCK (bb_note)) != NULL
338 /* If we found an existing note, thread it back onto the chain. */
342 if (GET_CODE (head) == CODE_LABEL)
346 after = PREV_INSN (head);
350 if (after != bb_note && NEXT_INSN (after) != bb_note)
351 reorder_insns (bb_note, bb_note, after);
355 /* Otherwise we must create a note and a basic block structure.
356 Since we allow basic block structs in rtl, give the struct
357 the same lifetime by allocating it off the function obstack
358 rather than using malloc. */
360 bb = (basic_block) obstack_alloc (&flow_obstack, sizeof (*bb));
361 memset (bb, 0, sizeof (*bb));
363 if (GET_CODE (head) == CODE_LABEL)
364 bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, head);
367 bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, head);
370 NOTE_BASIC_BLOCK (bb_note) = bb;
373 /* Always include the bb note in the block. */
374 if (NEXT_INSN (end) == bb_note)
380 BASIC_BLOCK (index) = bb;
382 /* Tag the block so that we know it has been used when considering
383 other basic block notes. */
387 /* Remove block B from the basic block array and compact behind it. */
393 int i, n = n_basic_blocks;
395 for (i = b->index; i + 1 < n; ++i)
397 basic_block x = BASIC_BLOCK (i + 1);
402 basic_block_info->num_elements--;
406 /* Delete the insns in a (non-live) block. We physically delete every
407 non-deleted-note insn, and update the flow graph appropriately.
409 Return nonzero if we deleted an exception handler. */
411 /* ??? Preserving all such notes strikes me as wrong. It would be nice
412 to post-process the stream to remove empty blocks, loops, ranges, etc. */
415 flow_delete_block (b)
418 int deleted_handler = 0;
421 /* If the head of this block is a CODE_LABEL, then it might be the
422 label for an exception handler which can't be reached.
424 We need to remove the label from the exception_handler_label list
425 and remove the associated NOTE_INSN_EH_REGION_BEG and
426 NOTE_INSN_EH_REGION_END notes. */
430 never_reached_warning (insn);
432 if (GET_CODE (insn) == CODE_LABEL)
433 maybe_remove_eh_handler (insn);
435 /* Include any jump table following the basic block. */
437 if (GET_CODE (end) == JUMP_INSN
438 && (tmp = JUMP_LABEL (end)) != NULL_RTX
439 && (tmp = NEXT_INSN (tmp)) != NULL_RTX
440 && GET_CODE (tmp) == JUMP_INSN
441 && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
442 || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
445 /* Include any barrier that may follow the basic block. */
446 tmp = next_nonnote_insn (end);
447 if (tmp && GET_CODE (tmp) == BARRIER)
450 /* Selectively delete the entire chain. */
451 flow_delete_insn_chain (insn, end);
453 /* Remove the edges into and out of this block. Note that there may
454 indeed be edges in, if we are removing an unreachable loop. */
456 while (b->pred != NULL)
457 remove_edge (b->pred);
458 while (b->succ != NULL)
459 remove_edge (b->succ);
465 /* Remove the basic block from the array, and compact behind it. */
468 return deleted_handler;
471 /* Records the basic block struct in BB_FOR_INSN, for every instruction
472 indexed by INSN_UID. MAX is the size of the array. */
475 compute_bb_for_insn (max)
480 if (basic_block_for_insn)
481 VARRAY_FREE (basic_block_for_insn);
482 VARRAY_BB_INIT (basic_block_for_insn, max, "basic_block_for_insn");
484 for (i = 0; i < n_basic_blocks; ++i)
486 basic_block bb = BASIC_BLOCK (i);
493 int uid = INSN_UID (insn);
495 VARRAY_BB (basic_block_for_insn, uid) = bb;
498 insn = NEXT_INSN (insn);
503 /* Update insns block within BB. */
506 update_bb_for_insn (bb)
511 if (! basic_block_for_insn)
514 for (insn = bb->head; ; insn = NEXT_INSN (insn))
516 set_block_for_insn (insn, bb);
523 /* Record INSN's block as BB. */
526 set_block_for_insn (insn, bb)
530 size_t uid = INSN_UID (insn);
531 if (uid >= basic_block_for_insn->num_elements)
535 /* Add one-eighth the size so we don't keep calling xrealloc. */
536 new_size = uid + (uid + 7) / 8;
538 VARRAY_GROW (basic_block_for_insn, new_size);
540 VARRAY_BB (basic_block_for_insn, uid) = bb;
543 /* When a new insn has been inserted into an existing block, it will
544 sometimes emit more than a single insn. This routine will set the
545 block number for the specified insn, and look backwards in the insn
546 chain to see if there are any other uninitialized insns immediately
547 previous to this one, and set the block number for them too. */
550 set_block_for_new_insns (insn, bb)
554 set_block_for_insn (insn, bb);
556 /* Scan the previous instructions setting the block number until we find
557 an instruction that has the block number set, or we find a note
559 for (insn = PREV_INSN (insn); insn != NULL_RTX; insn = PREV_INSN (insn))
561 if (GET_CODE (insn) == NOTE)
563 if ((unsigned) INSN_UID (insn) >= basic_block_for_insn->num_elements
564 || BLOCK_FOR_INSN (insn) == 0)
565 set_block_for_insn (insn, bb);
571 /* Create an edge connecting SRC and DST with FLAGS optionally using
572 edge cache CACHE. Return the new edge, NULL if already exist. */
574 cached_make_edge (edge_cache, src, dst, flags)
576 basic_block src, dst;
582 /* Don't bother with edge cache for ENTRY or EXIT; there aren't that
583 many edges to them, and we didn't allocate memory for it. */
584 use_edge_cache = (edge_cache
585 && src != ENTRY_BLOCK_PTR
586 && dst != EXIT_BLOCK_PTR);
588 /* Make sure we don't add duplicate edges. */
589 switch (use_edge_cache)
592 /* Quick test for non-existance of the edge. */
593 if (! TEST_BIT (edge_cache[src->index], dst->index))
596 /* The edge exists; early exit if no work to do. */
602 for (e = src->succ; e; e = e->succ_next)
611 if (first_deleted_edge)
613 e = first_deleted_edge;
614 first_deleted_edge = e->succ_next;
618 e = (edge) obstack_alloc (&flow_obstack, sizeof (*e));
619 memset (e, 0, sizeof (*e));
623 e->succ_next = src->succ;
624 e->pred_next = dst->pred;
633 SET_BIT (edge_cache[src->index], dst->index);
638 /* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
639 created edge or NULL if already exist. */
642 make_edge (src, dest, flags)
643 basic_block src, dest;
646 return cached_make_edge (NULL, src, dest, flags);
649 /* Create an edge connecting SRC to DEST and set probability by knowling
650 that it is the single edge leaving SRC. */
653 make_single_succ_edge (src, dest, flags)
654 basic_block src, dest;
657 edge e = make_edge (src, dest, flags);
659 e->probability = REG_BR_PROB_BASE;
660 e->count = src->count;
664 /* This function will remove an edge from the flow graph. */
670 edge last_pred = NULL;
671 edge last_succ = NULL;
673 basic_block src, dest;
676 for (tmp = src->succ; tmp && tmp != e; tmp = tmp->succ_next)
682 last_succ->succ_next = e->succ_next;
684 src->succ = e->succ_next;
686 for (tmp = dest->pred; tmp && tmp != e; tmp = tmp->pred_next)
692 last_pred->pred_next = e->pred_next;
694 dest->pred = e->pred_next;
697 memset (e, 0, sizeof (*e));
698 e->succ_next = first_deleted_edge;
699 first_deleted_edge = e;
702 /* Redirect an edge's successor from one block to another. */
705 redirect_edge_succ (e, new_succ)
707 basic_block new_succ;
711 /* Disconnect the edge from the old successor block. */
712 for (pe = &e->dest->pred; *pe != e; pe = &(*pe)->pred_next)
714 *pe = (*pe)->pred_next;
716 /* Reconnect the edge to the new successor block. */
717 e->pred_next = new_succ->pred;
722 /* Like previous but avoid possible dupplicate edge. */
725 redirect_edge_succ_nodup (e, new_succ)
727 basic_block new_succ;
730 /* Check whether the edge is already present. */
731 for (s = e->src->succ; s; s = s->succ_next)
732 if (s->dest == new_succ && s != e)
736 s->flags |= e->flags;
737 s->probability += e->probability;
738 s->count += e->count;
743 redirect_edge_succ (e, new_succ);
747 /* Redirect an edge's predecessor from one block to another. */
750 redirect_edge_pred (e, new_pred)
752 basic_block new_pred;
756 /* Disconnect the edge from the old predecessor block. */
757 for (pe = &e->src->succ; *pe != e; pe = &(*pe)->succ_next)
759 *pe = (*pe)->succ_next;
761 /* Reconnect the edge to the new predecessor block. */
762 e->succ_next = new_pred->succ;
767 /* Split a block BB after insn INSN creating a new fallthru edge.
768 Return the new edge. Note that to keep other parts of the compiler happy,
769 this function renumbers all the basic blocks so that the new
770 one has a number one greater than the block split. */
773 split_block (bb, insn)
783 /* There is no point splitting the block after its end. */
787 /* Create the new structures. */
788 new_bb = (basic_block) obstack_alloc (&flow_obstack, sizeof (*new_bb));
790 memset (new_bb, 0, sizeof (*new_bb));
792 new_bb->head = NEXT_INSN (insn);
793 new_bb->end = bb->end;
796 new_bb->succ = bb->succ;
799 new_bb->count = bb->count;
800 new_bb->frequency = bb->frequency;
801 new_bb->loop_depth = bb->loop_depth;
803 /* Redirect the src of the successor edges of bb to point to new_bb. */
804 for (e = new_bb->succ; e; e = e->succ_next)
807 new_edge = make_single_succ_edge (bb, new_bb, EDGE_FALLTHRU);
809 /* Place the new block just after the block being split. */
810 VARRAY_GROW (basic_block_info, ++n_basic_blocks);
812 /* Some parts of the compiler expect blocks to be number in
813 sequential order so insert the new block immediately after the
814 block being split.. */
816 for (i = n_basic_blocks - 1; i > j + 1; --i)
818 basic_block tmp = BASIC_BLOCK (i - 1);
819 BASIC_BLOCK (i) = tmp;
823 BASIC_BLOCK (i) = new_bb;
826 if (GET_CODE (new_bb->head) == CODE_LABEL)
828 /* Create the basic block note. */
829 bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK,
831 NOTE_BASIC_BLOCK (bb_note) = new_bb;
833 /* If the only thing in this new block was the label, make sure
834 the block note gets included. */
835 if (new_bb->head == new_bb->end)
836 new_bb->end = bb_note;
840 /* Create the basic block note. */
841 bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK,
843 NOTE_BASIC_BLOCK (bb_note) = new_bb;
844 new_bb->head = bb_note;
847 update_bb_for_insn (new_bb);
849 if (bb->global_live_at_start)
851 new_bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
852 new_bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
853 COPY_REG_SET (new_bb->global_live_at_end, bb->global_live_at_end);
855 /* We now have to calculate which registers are live at the end
856 of the split basic block and at the start of the new basic
857 block. Start with those registers that are known to be live
858 at the end of the original basic block and get
859 propagate_block to determine which registers are live. */
860 COPY_REG_SET (new_bb->global_live_at_start, bb->global_live_at_end);
861 propagate_block (new_bb, new_bb->global_live_at_start, NULL, NULL, 0);
862 COPY_REG_SET (bb->global_live_at_end,
863 new_bb->global_live_at_start);
869 /* Blocks A and B are to be merged into a single block A. The insns
870 are already contiguous, hence `nomove'. */
873 merge_blocks_nomove (a, b)
877 rtx b_head, b_end, a_end;
878 rtx del_first = NULL_RTX, del_last = NULL_RTX;
881 /* If there was a CODE_LABEL beginning B, delete it. */
884 if (GET_CODE (b_head) == CODE_LABEL)
886 /* Detect basic blocks with nothing but a label. This can happen
887 in particular at the end of a function. */
890 del_first = del_last = b_head;
891 b_head = NEXT_INSN (b_head);
894 /* Delete the basic block note. */
895 if (NOTE_INSN_BASIC_BLOCK_P (b_head))
902 b_head = NEXT_INSN (b_head);
905 /* If there was a jump out of A, delete it. */
907 if (GET_CODE (a_end) == JUMP_INSN)
911 for (prev = PREV_INSN (a_end); ; prev = PREV_INSN (prev))
912 if (GET_CODE (prev) != NOTE
913 || NOTE_LINE_NUMBER (prev) == NOTE_INSN_BASIC_BLOCK
920 /* If this was a conditional jump, we need to also delete
921 the insn that set cc0. */
922 if (only_sets_cc0_p (prev))
925 prev = prev_nonnote_insn (prev);
934 else if (GET_CODE (NEXT_INSN (a_end)) == BARRIER)
935 del_first = NEXT_INSN (a_end);
937 /* Delete everything marked above as well as crap that might be
938 hanging out between the two blocks. */
939 flow_delete_insn_chain (del_first, del_last);
941 /* Normally there should only be one successor of A and that is B, but
942 partway though the merge of blocks for conditional_execution we'll
943 be merging a TEST block with THEN and ELSE successors. Free the
944 whole lot of them and hope the caller knows what they're doing. */
946 remove_edge (a->succ);
948 /* Adjust the edges out of B for the new owner. */
949 for (e = b->succ; e; e = e->succ_next)
953 /* B hasn't quite yet ceased to exist. Attempt to prevent mishap. */
954 b->pred = b->succ = NULL;
956 /* Reassociate the insns of B with A. */
959 if (basic_block_for_insn)
961 BLOCK_FOR_INSN (b_head) = a;
962 while (b_head != b_end)
964 b_head = NEXT_INSN (b_head);
965 BLOCK_FOR_INSN (b_head) = a;
975 /* Return label in the head of basic block. Create one if it doesn't exist. */
981 if (block == EXIT_BLOCK_PTR)
983 if (GET_CODE (block->head) != CODE_LABEL)
985 block->head = emit_label_before (gen_label_rtx (), block->head);
986 if (basic_block_for_insn)
987 set_block_for_insn (block->head, block);
992 /* Attempt to perform edge redirection by replacing possibly complex jump
993 instruction by unconditional jump or removing jump completely.
994 This can apply only if all edges now point to the same block.
996 The parameters and return values are equivalent to redirect_edge_and_branch.
1000 try_redirect_by_replacing_jump (e, target)
1004 basic_block src = e->src;
1005 rtx insn = src->end, kill_from;
1010 /* Verify that all targets will be TARGET. */
1011 for (tmp = src->succ; tmp; tmp = tmp->succ_next)
1012 if (tmp->dest != target && tmp != e)
1014 if (tmp || !onlyjump_p (insn))
1017 /* Avoid removing branch with side effects. */
1018 set = single_set (insn);
1019 if (!set || side_effects_p (set))
1022 /* In case we zap a conditional jump, we'll need to kill
1023 the cc0 setter too. */
1026 if (reg_mentioned_p (cc0_rtx, PATTERN (insn)))
1027 kill_from = PREV_INSN (insn);
1030 /* See if we can create the fallthru edge. */
1031 if (can_fallthru (src, target))
1033 src->end = PREV_INSN (kill_from);
1035 fprintf (rtl_dump_file, "Removing jump %i.\n", INSN_UID (insn));
1038 /* Selectivly unlink whole insn chain. */
1039 flow_delete_insn_chain (kill_from, PREV_INSN (target->head));
1041 /* If this already is simplejump, redirect it. */
1042 else if (simplejump_p (insn))
1044 if (e->dest == target)
1047 fprintf (rtl_dump_file, "Redirecting jump %i from %i to %i.\n",
1048 INSN_UID (insn), e->dest->index, target->index);
1049 redirect_jump (insn, block_label (target), 0);
1051 /* Or replace possibly complicated jump insn by simple jump insn. */
1054 rtx target_label = block_label (target);
1057 src->end = emit_jump_insn_before (gen_jump (target_label), kill_from);
1058 JUMP_LABEL (src->end) = target_label;
1059 LABEL_NUSES (target_label)++;
1060 if (basic_block_for_insn)
1061 set_block_for_new_insns (src->end, src);
1063 fprintf (rtl_dump_file, "Replacing insn %i by jump %i\n",
1064 INSN_UID (insn), INSN_UID (src->end));
1066 flow_delete_insn_chain (kill_from, insn);
1068 barrier = next_nonnote_insn (src->end);
1069 if (!barrier || GET_CODE (barrier) != BARRIER)
1070 emit_barrier_after (src->end);
1073 /* Keep only one edge out and set proper flags. */
1074 while (src->succ->succ_next)
1075 remove_edge (src->succ);
1078 e->flags = EDGE_FALLTHRU;
1081 e->probability = REG_BR_PROB_BASE;
1082 e->count = src->count;
1084 /* We don't want a block to end on a line-number note since that has
1085 the potential of changing the code between -g and not -g. */
1086 while (GET_CODE (e->src->end) == NOTE
1087 && NOTE_LINE_NUMBER (e->src->end) >= 0)
1089 rtx prev = PREV_INSN (e->src->end);
1090 flow_delete_insn (e->src->end);
1094 if (e->dest != target)
1095 redirect_edge_succ (e, target);
1099 /* Return last loop_beg note appearing after INSN, before start of next
1100 basic block. Return INSN if there are no such notes.
1102 When emmiting jump to redirect an fallthru edge, it should always
1103 appear after the LOOP_BEG notes, as loop optimizer expect loop to
1104 eighter start by fallthru edge or jump following the LOOP_BEG note
1105 jumping to the loop exit test. */
1108 last_loop_beg_note (insn)
1112 insn = NEXT_INSN (insn);
1113 while (GET_CODE (insn) == NOTE
1114 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK)
1116 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1118 insn = NEXT_INSN (insn);
1123 /* Attempt to change code to redirect edge E to TARGET.
1124 Don't do that on expense of adding new instructions or reordering
1127 Function can be also called with edge destionation equivalent to the
1128 TARGET. Then it should try the simplifications and do nothing if
1131 Return true if transformation suceeded. We still return flase in case
1132 E already destinated TARGET and we didn't managed to simplify instruction
1136 redirect_edge_and_branch (e, target)
1141 rtx old_label = e->dest->head;
1142 basic_block src = e->src;
1143 rtx insn = src->end;
1145 if (e->flags & EDGE_COMPLEX)
1148 if (try_redirect_by_replacing_jump (e, target))
1150 /* Do this fast path late, as we want above code to simplify for cases
1151 where called on single edge leaving basic block containing nontrivial
1153 else if (e->dest == target)
1156 /* We can only redirect non-fallthru edges of jump insn. */
1157 if (e->flags & EDGE_FALLTHRU)
1159 if (GET_CODE (insn) != JUMP_INSN)
1162 /* Recognize a tablejump and adjust all matching cases. */
1163 if ((tmp = JUMP_LABEL (insn)) != NULL_RTX
1164 && (tmp = NEXT_INSN (tmp)) != NULL_RTX
1165 && GET_CODE (tmp) == JUMP_INSN
1166 && (GET_CODE (PATTERN (tmp)) == ADDR_VEC
1167 || GET_CODE (PATTERN (tmp)) == ADDR_DIFF_VEC))
1171 rtx new_label = block_label (target);
1173 if (GET_CODE (PATTERN (tmp)) == ADDR_VEC)
1174 vec = XVEC (PATTERN (tmp), 0);
1176 vec = XVEC (PATTERN (tmp), 1);
1178 for (j = GET_NUM_ELEM (vec) - 1; j >= 0; --j)
1179 if (XEXP (RTVEC_ELT (vec, j), 0) == old_label)
1181 RTVEC_ELT (vec, j) = gen_rtx_LABEL_REF (Pmode, new_label);
1182 --LABEL_NUSES (old_label);
1183 ++LABEL_NUSES (new_label);
1186 /* Handle casesi dispatch insns */
1187 if ((tmp = single_set (insn)) != NULL
1188 && SET_DEST (tmp) == pc_rtx
1189 && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE
1190 && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF
1191 && XEXP (XEXP (SET_SRC (tmp), 2), 0) == old_label)
1193 XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (VOIDmode,
1195 --LABEL_NUSES (old_label);
1196 ++LABEL_NUSES (new_label);
1201 /* ?? We may play the games with moving the named labels from
1202 one basic block to the other in case only one computed_jump is
1204 if (computed_jump_p (insn))
1207 /* A return instruction can't be redirected. */
1208 if (returnjump_p (insn))
1211 /* If the insn doesn't go where we think, we're confused. */
1212 if (JUMP_LABEL (insn) != old_label)
1214 redirect_jump (insn, block_label (target), 0);
1218 fprintf (rtl_dump_file, "Edge %i->%i redirected to %i\n",
1219 e->src->index, e->dest->index, target->index);
1220 if (e->dest != target)
1221 redirect_edge_succ_nodup (e, target);
1225 /* Redirect edge even at the expense of creating new jump insn or
1226 basic block. Return new basic block if created, NULL otherwise.
1227 Abort if converison is impossible. */
1230 redirect_edge_and_branch_force (e, target)
1240 if (redirect_edge_and_branch (e, target))
1242 if (e->dest == target)
1244 if (e->flags & EDGE_ABNORMAL)
1246 if (!(e->flags & EDGE_FALLTHRU))
1249 e->flags &= ~EDGE_FALLTHRU;
1250 label = block_label (target);
1251 /* Case of the fallthru block. */
1252 if (!e->src->succ->succ_next)
1254 e->src->end = emit_jump_insn_after (gen_jump (label),
1255 last_loop_beg_note (e->src->end));
1256 JUMP_LABEL (e->src->end) = label;
1257 LABEL_NUSES (label)++;
1258 if (basic_block_for_insn)
1259 set_block_for_new_insns (e->src->end, e->src);
1260 emit_barrier_after (e->src->end);
1262 fprintf (rtl_dump_file,
1263 "Emitting jump insn %i to redirect edge %i->%i to %i\n",
1264 INSN_UID (e->src->end), e->src->index, e->dest->index,
1266 redirect_edge_succ (e, target);
1269 /* Redirecting fallthru edge of the conditional needs extra work. */
1272 fprintf (rtl_dump_file,
1273 "Emitting jump insn %i in new BB to redirect edge %i->%i to %i\n",
1274 INSN_UID (e->src->end), e->src->index, e->dest->index,
1277 /* Create the new structures. */
1278 new_bb = (basic_block) obstack_alloc (&flow_obstack, sizeof (*new_bb));
1280 memset (new_bb, 0, sizeof (*new_bb));
1282 new_bb->end = new_bb->head = last_loop_beg_note (e->src->end);
1283 new_bb->succ = NULL;
1284 new_bb->pred = NULL;
1285 new_bb->count = e->count;
1286 new_bb->frequency = EDGE_FREQUENCY (e);
1287 new_bb->loop_depth = e->dest->loop_depth;
1289 if (target->global_live_at_start)
1291 new_bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1292 new_bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1293 COPY_REG_SET (new_bb->global_live_at_start,
1294 target->global_live_at_start);
1295 COPY_REG_SET (new_bb->global_live_at_end, new_bb->global_live_at_start);
1299 new_edge = make_edge (e->src, new_bb, EDGE_FALLTHRU);
1300 new_edge->probability = e->probability;
1301 new_edge->count = e->count;
1303 /* Redirect old edge. */
1304 redirect_edge_succ (e, target);
1305 redirect_edge_pred (e, new_bb);
1306 e->probability = REG_BR_PROB_BASE;
1308 /* Place the new block just after the block being split. */
1309 VARRAY_GROW (basic_block_info, ++n_basic_blocks);
1311 /* Some parts of the compiler expect blocks to be number in
1312 sequential order so insert the new block immediately after the
1313 block being split.. */
1314 j = new_edge->src->index;
1315 for (i = n_basic_blocks - 1; i > j + 1; --i)
1317 basic_block tmp = BASIC_BLOCK (i - 1);
1318 BASIC_BLOCK (i) = tmp;
1322 BASIC_BLOCK (i) = new_bb;
1325 /* Create the basic block note. */
1326 bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, new_bb->head);
1327 NOTE_BASIC_BLOCK (bb_note) = new_bb;
1328 new_bb->head = bb_note;
1330 new_bb->end = emit_jump_insn_after (gen_jump (label), new_bb->head);
1331 JUMP_LABEL (new_bb->end) = label;
1332 LABEL_NUSES (label)++;
1333 if (basic_block_for_insn)
1334 set_block_for_new_insns (new_bb->end, new_bb);
1335 emit_barrier_after (new_bb->end);
1339 /* The given edge should potentially be a fallthru edge. If that is in
1340 fact true, delete the jump and barriers that are in the way. */
1343 tidy_fallthru_edge (e, b, c)
1349 /* ??? In a late-running flow pass, other folks may have deleted basic
1350 blocks by nopping out blocks, leaving multiple BARRIERs between here
1351 and the target label. They ought to be chastized and fixed.
1353 We can also wind up with a sequence of undeletable labels between
1354 one block and the next.
1356 So search through a sequence of barriers, labels, and notes for
1357 the head of block C and assert that we really do fall through. */
1359 if (next_real_insn (b->end) != next_real_insn (PREV_INSN (c->head)))
1362 /* Remove what will soon cease being the jump insn from the source block.
1363 If block B consisted only of this single jump, turn it into a deleted
1366 if (GET_CODE (q) == JUMP_INSN
1368 && (any_uncondjump_p (q)
1369 || (b->succ == e && e->succ_next == NULL)))
1372 /* If this was a conditional jump, we need to also delete
1373 the insn that set cc0. */
1374 if (any_condjump_p (q) && only_sets_cc0_p (PREV_INSN (q)))
1381 NOTE_LINE_NUMBER (q) = NOTE_INSN_DELETED;
1382 NOTE_SOURCE_FILE (q) = 0;
1388 /* We don't want a block to end on a line-number note since that has
1389 the potential of changing the code between -g and not -g. */
1390 while (GET_CODE (q) == NOTE && NOTE_LINE_NUMBER (q) >= 0)
1397 /* Selectively unlink the sequence. */
1398 if (q != PREV_INSN (c->head))
1399 flow_delete_insn_chain (NEXT_INSN (q), PREV_INSN (c->head));
1401 e->flags |= EDGE_FALLTHRU;
1404 /* Fix up edges that now fall through, or rather should now fall through
1405 but previously required a jump around now deleted blocks. Simplify
1406 the search by only examining blocks numerically adjacent, since this
1407 is how find_basic_blocks created them. */
1410 tidy_fallthru_edges ()
1414 for (i = 1; i < n_basic_blocks; ++i)
1416 basic_block b = BASIC_BLOCK (i - 1);
1417 basic_block c = BASIC_BLOCK (i);
1420 /* We care about simple conditional or unconditional jumps with
1423 If we had a conditional branch to the next instruction when
1424 find_basic_blocks was called, then there will only be one
1425 out edge for the block which ended with the conditional
1426 branch (since we do not create duplicate edges).
1428 Furthermore, the edge will be marked as a fallthru because we
1429 merge the flags for the duplicate edges. So we do not want to
1430 check that the edge is not a FALLTHRU edge. */
1431 if ((s = b->succ) != NULL
1432 && ! (s->flags & EDGE_COMPLEX)
1433 && s->succ_next == NULL
1435 /* If the jump insn has side effects, we can't tidy the edge. */
1436 && (GET_CODE (b->end) != JUMP_INSN
1437 || onlyjump_p (b->end)))
1438 tidy_fallthru_edge (s, b, c);
1442 /* Helper function for split_edge. Return true in case edge BB2 to BB1
1443 is back edge of syntactic loop. */
1446 back_edge_of_syntactic_loop_p (bb1, bb2)
1447 basic_block bb1, bb2;
1452 if (bb1->index > bb2->index)
1455 if (bb1->index == bb2->index)
1458 for (insn = bb1->end; insn != bb2->head && count >= 0;
1459 insn = NEXT_INSN (insn))
1460 if (GET_CODE (insn) == NOTE)
1462 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
1464 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
1471 /* Split a (typically critical) edge. Return the new block.
1472 Abort on abnormal edges.
1474 ??? The code generally expects to be called on critical edges.
1475 The case of a block ending in an unconditional jump to a
1476 block with multiple predecessors is not handled optimally. */
1479 split_edge (edge_in)
1482 basic_block old_pred, bb, old_succ;
1487 /* Abnormal edges cannot be split. */
1488 if ((edge_in->flags & EDGE_ABNORMAL) != 0)
1491 old_pred = edge_in->src;
1492 old_succ = edge_in->dest;
1494 /* Create the new structures. */
1495 bb = (basic_block) obstack_alloc (&flow_obstack, sizeof (*bb));
1497 memset (bb, 0, sizeof (*bb));
1499 /* ??? This info is likely going to be out of date very soon. */
1500 if (old_succ->global_live_at_start)
1502 bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1503 bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1504 COPY_REG_SET (bb->global_live_at_start, old_succ->global_live_at_start);
1505 COPY_REG_SET (bb->global_live_at_end, old_succ->global_live_at_start);
1510 bb->count = edge_in->count;
1511 bb->frequency = EDGE_FREQUENCY (edge_in);
1513 edge_in->flags &= ~EDGE_CRITICAL;
1515 edge_out = make_single_succ_edge (bb, old_succ, EDGE_FALLTHRU);
1517 /* Tricky case -- if there existed a fallthru into the successor
1518 (and we're not it) we must add a new unconditional jump around
1519 the new block we're actually interested in.
1521 Further, if that edge is critical, this means a second new basic
1522 block must be created to hold it. In order to simplify correct
1523 insn placement, do this before we touch the existing basic block
1524 ordering for the block we were really wanting. */
1525 if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1528 for (e = edge_out->pred_next; e; e = e->pred_next)
1529 if (e->flags & EDGE_FALLTHRU)
1534 basic_block jump_block;
1537 if ((e->flags & EDGE_CRITICAL) == 0
1538 && e->src != ENTRY_BLOCK_PTR)
1540 /* Non critical -- we can simply add a jump to the end
1541 of the existing predecessor. */
1542 jump_block = e->src;
1546 /* We need a new block to hold the jump. The simplest
1547 way to do the bulk of the work here is to recursively
1549 jump_block = split_edge (e);
1550 e = jump_block->succ;
1553 /* Now add the jump insn ... */
1554 pos = emit_jump_insn_after (gen_jump (old_succ->head),
1555 last_loop_beg_note (jump_block->end));
1556 jump_block->end = pos;
1557 if (basic_block_for_insn)
1558 set_block_for_new_insns (pos, jump_block);
1559 emit_barrier_after (pos);
1561 /* ... let jump know that label is in use, ... */
1562 JUMP_LABEL (pos) = old_succ->head;
1563 ++LABEL_NUSES (old_succ->head);
1565 /* ... and clear fallthru on the outgoing edge. */
1566 e->flags &= ~EDGE_FALLTHRU;
1568 /* Continue splitting the interesting edge. */
1572 /* Place the new block just in front of the successor. */
1573 VARRAY_GROW (basic_block_info, ++n_basic_blocks);
1574 if (old_succ == EXIT_BLOCK_PTR)
1575 j = n_basic_blocks - 1;
1577 j = old_succ->index;
1578 for (i = n_basic_blocks - 1; i > j; --i)
1580 basic_block tmp = BASIC_BLOCK (i - 1);
1581 BASIC_BLOCK (i) = tmp;
1584 BASIC_BLOCK (i) = bb;
1587 /* Create the basic block note.
1589 Where we place the note can have a noticable impact on the generated
1590 code. Consider this cfg:
1600 If we need to insert an insn on the edge from block 0 to block 1,
1601 we want to ensure the instructions we insert are outside of any
1602 loop notes that physically sit between block 0 and block 1. Otherwise
1603 we confuse the loop optimizer into thinking the loop is a phony. */
1604 if (old_succ != EXIT_BLOCK_PTR
1605 && PREV_INSN (old_succ->head)
1606 && GET_CODE (PREV_INSN (old_succ->head)) == NOTE
1607 && NOTE_LINE_NUMBER (PREV_INSN (old_succ->head)) == NOTE_INSN_LOOP_BEG
1608 && !back_edge_of_syntactic_loop_p (old_succ, old_pred))
1609 bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK,
1610 PREV_INSN (old_succ->head));
1611 else if (old_succ != EXIT_BLOCK_PTR)
1612 bb_note = emit_note_before (NOTE_INSN_BASIC_BLOCK, old_succ->head);
1614 bb_note = emit_note_after (NOTE_INSN_BASIC_BLOCK, get_last_insn ());
1615 NOTE_BASIC_BLOCK (bb_note) = bb;
1616 bb->head = bb->end = bb_note;
1618 /* For non-fallthry edges, we must adjust the predecessor's
1619 jump instruction to target our new block. */
1620 if ((edge_in->flags & EDGE_FALLTHRU) == 0)
1622 if (!redirect_edge_and_branch (edge_in, bb))
1626 redirect_edge_succ (edge_in, bb);
1631 /* Queue instructions for insertion on an edge between two basic blocks.
1632 The new instructions and basic blocks (if any) will not appear in the
1633 CFG until commit_edge_insertions is called. */
1636 insert_insn_on_edge (pattern, e)
1640 /* We cannot insert instructions on an abnormal critical edge.
1641 It will be easier to find the culprit if we die now. */
1642 if ((e->flags & (EDGE_ABNORMAL|EDGE_CRITICAL))
1643 == (EDGE_ABNORMAL|EDGE_CRITICAL))
1646 if (e->insns == NULL_RTX)
1649 push_to_sequence (e->insns);
1651 emit_insn (pattern);
1653 e->insns = get_insns ();
1657 /* Update the CFG for the instructions queued on edge E. */
1660 commit_one_edge_insertion (e)
1663 rtx before = NULL_RTX, after = NULL_RTX, insns, tmp, last;
1666 /* Pull the insns off the edge now since the edge might go away. */
1668 e->insns = NULL_RTX;
1670 /* Figure out where to put these things. If the destination has
1671 one predecessor, insert there. Except for the exit block. */
1672 if (e->dest->pred->pred_next == NULL
1673 && e->dest != EXIT_BLOCK_PTR)
1677 /* Get the location correct wrt a code label, and "nice" wrt
1678 a basic block note, and before everything else. */
1680 if (GET_CODE (tmp) == CODE_LABEL)
1681 tmp = NEXT_INSN (tmp);
1682 if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1683 tmp = NEXT_INSN (tmp);
1684 if (tmp == bb->head)
1687 after = PREV_INSN (tmp);
1690 /* If the source has one successor and the edge is not abnormal,
1691 insert there. Except for the entry block. */
1692 else if ((e->flags & EDGE_ABNORMAL) == 0
1693 && e->src->succ->succ_next == NULL
1694 && e->src != ENTRY_BLOCK_PTR)
1697 /* It is possible to have a non-simple jump here. Consider a target
1698 where some forms of unconditional jumps clobber a register. This
1699 happens on the fr30 for example.
1701 We know this block has a single successor, so we can just emit
1702 the queued insns before the jump. */
1703 if (GET_CODE (bb->end) == JUMP_INSN)
1706 while (GET_CODE (PREV_INSN (before)) == NOTE
1707 && NOTE_LINE_NUMBER (PREV_INSN (before)) == NOTE_INSN_LOOP_BEG)
1708 before = PREV_INSN (before);
1712 /* We'd better be fallthru, or we've lost track of what's what. */
1713 if ((e->flags & EDGE_FALLTHRU) == 0)
1720 /* Otherwise we must split the edge. */
1723 bb = split_edge (e);
1727 /* Now that we've found the spot, do the insertion. */
1729 /* Set the new block number for these insns, if structure is allocated. */
1730 if (basic_block_for_insn)
1733 for (i = insns; i != NULL_RTX; i = NEXT_INSN (i))
1734 set_block_for_insn (i, bb);
1739 emit_insns_before (insns, before);
1740 if (before == bb->head)
1743 last = prev_nonnote_insn (before);
1747 last = emit_insns_after (insns, after);
1748 if (after == bb->end)
1752 if (returnjump_p (last))
1754 /* ??? Remove all outgoing edges from BB and add one for EXIT.
1755 This is not currently a problem because this only happens
1756 for the (single) epilogue, which already has a fallthru edge
1760 if (e->dest != EXIT_BLOCK_PTR
1761 || e->succ_next != NULL
1762 || (e->flags & EDGE_FALLTHRU) == 0)
1764 e->flags &= ~EDGE_FALLTHRU;
1766 emit_barrier_after (last);
1770 flow_delete_insn (before);
1772 else if (GET_CODE (last) == JUMP_INSN)
1774 find_sub_basic_blocks (bb);
1777 /* Update the CFG for all queued instructions. */
1780 commit_edge_insertions ()
1784 compute_bb_for_insn (get_max_uid ());
1786 #ifdef ENABLE_CHECKING
1787 verify_flow_info ();
1791 bb = ENTRY_BLOCK_PTR;
1796 for (e = bb->succ; e; e = next)
1798 next = e->succ_next;
1800 commit_one_edge_insertion (e);
1803 if (++i >= n_basic_blocks)
1805 bb = BASIC_BLOCK (i);
1810 dump_flow_info (file)
1814 static const char * const reg_class_names[] = REG_CLASS_NAMES;
1816 fprintf (file, "%d registers.\n", max_regno);
1817 for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
1820 enum reg_class class, altclass;
1821 fprintf (file, "\nRegister %d used %d times across %d insns",
1822 i, REG_N_REFS (i), REG_LIVE_LENGTH (i));
1823 if (REG_BASIC_BLOCK (i) >= 0)
1824 fprintf (file, " in block %d", REG_BASIC_BLOCK (i));
1826 fprintf (file, "; set %d time%s", REG_N_SETS (i),
1827 (REG_N_SETS (i) == 1) ? "" : "s");
1828 if (REG_USERVAR_P (regno_reg_rtx[i]))
1829 fprintf (file, "; user var");
1830 if (REG_N_DEATHS (i) != 1)
1831 fprintf (file, "; dies in %d places", REG_N_DEATHS (i));
1832 if (REG_N_CALLS_CROSSED (i) == 1)
1833 fprintf (file, "; crosses 1 call");
1834 else if (REG_N_CALLS_CROSSED (i))
1835 fprintf (file, "; crosses %d calls", REG_N_CALLS_CROSSED (i));
1836 if (PSEUDO_REGNO_BYTES (i) != UNITS_PER_WORD)
1837 fprintf (file, "; %d bytes", PSEUDO_REGNO_BYTES (i));
1838 class = reg_preferred_class (i);
1839 altclass = reg_alternate_class (i);
1840 if (class != GENERAL_REGS || altclass != ALL_REGS)
1842 if (altclass == ALL_REGS || class == ALL_REGS)
1843 fprintf (file, "; pref %s", reg_class_names[(int) class]);
1844 else if (altclass == NO_REGS)
1845 fprintf (file, "; %s or none", reg_class_names[(int) class]);
1847 fprintf (file, "; pref %s, else %s",
1848 reg_class_names[(int) class],
1849 reg_class_names[(int) altclass]);
1851 if (REG_POINTER (regno_reg_rtx[i]))
1852 fprintf (file, "; pointer");
1853 fprintf (file, ".\n");
1856 fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks, n_edges);
1857 for (i = 0; i < n_basic_blocks; i++)
1859 register basic_block bb = BASIC_BLOCK (i);
1862 fprintf (file, "\nBasic block %d: first insn %d, last %d, loop_depth %d, count ",
1863 i, INSN_UID (bb->head), INSN_UID (bb->end), bb->loop_depth);
1864 fprintf (file, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) bb->count);
1865 fprintf (file, ", freq %i.\n", bb->frequency);
1867 fprintf (file, "Predecessors: ");
1868 for (e = bb->pred; e; e = e->pred_next)
1869 dump_edge_info (file, e, 0);
1871 fprintf (file, "\nSuccessors: ");
1872 for (e = bb->succ; e; e = e->succ_next)
1873 dump_edge_info (file, e, 1);
1875 fprintf (file, "\nRegisters live at start:");
1876 dump_regset (bb->global_live_at_start, file);
1878 fprintf (file, "\nRegisters live at end:");
1879 dump_regset (bb->global_live_at_end, file);
1890 dump_flow_info (stderr);
1894 dump_edge_info (file, e, do_succ)
1899 basic_block side = (do_succ ? e->dest : e->src);
1901 if (side == ENTRY_BLOCK_PTR)
1902 fputs (" ENTRY", file);
1903 else if (side == EXIT_BLOCK_PTR)
1904 fputs (" EXIT", file);
1906 fprintf (file, " %d", side->index);
1909 fprintf (file, " [%.1f%%] ", e->probability * 100.0 / REG_BR_PROB_BASE);
1913 fprintf (file, " count:");
1914 fprintf (file, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) e->count);
1919 static const char * const bitnames[] = {
1920 "fallthru", "crit", "ab", "abcall", "eh", "fake", "dfs_back"
1923 int i, flags = e->flags;
1927 for (i = 0; flags; i++)
1928 if (flags & (1 << i))
1934 if (i < (int) ARRAY_SIZE (bitnames))
1935 fputs (bitnames[i], file);
1937 fprintf (file, "%d", i);
1944 /* Print out one basic block with live information at start and end. */
1955 fprintf (outf, ";; Basic block %d, loop depth %d, count ",
1956 bb->index, bb->loop_depth);
1957 fprintf (outf, HOST_WIDEST_INT_PRINT_DEC, (HOST_WIDEST_INT) bb->count);
1960 fputs (";; Predecessors: ", outf);
1961 for (e = bb->pred; e; e = e->pred_next)
1962 dump_edge_info (outf, e, 0);
1965 fputs (";; Registers live at start:", outf);
1966 dump_regset (bb->global_live_at_start, outf);
1969 for (insn = bb->head, last = NEXT_INSN (bb->end);
1971 insn = NEXT_INSN (insn))
1972 print_rtl_single (outf, insn);
1974 fputs (";; Registers live at end:", outf);
1975 dump_regset (bb->global_live_at_end, outf);
1978 fputs (";; Successors: ", outf);
1979 for (e = bb->succ; e; e = e->succ_next)
1980 dump_edge_info (outf, e, 1);
1988 dump_bb (bb, stderr);
1995 dump_bb (BASIC_BLOCK (n), stderr);
1998 /* Like print_rtl, but also print out live information for the start of each
2002 print_rtl_with_bb (outf, rtx_first)
2006 register rtx tmp_rtx;
2009 fprintf (outf, "(nil)\n");
2013 enum bb_state { NOT_IN_BB, IN_ONE_BB, IN_MULTIPLE_BB };
2014 int max_uid = get_max_uid ();
2015 basic_block *start = (basic_block *)
2016 xcalloc (max_uid, sizeof (basic_block));
2017 basic_block *end = (basic_block *)
2018 xcalloc (max_uid, sizeof (basic_block));
2019 enum bb_state *in_bb_p = (enum bb_state *)
2020 xcalloc (max_uid, sizeof (enum bb_state));
2022 for (i = n_basic_blocks - 1; i >= 0; i--)
2024 basic_block bb = BASIC_BLOCK (i);
2027 start[INSN_UID (bb->head)] = bb;
2028 end[INSN_UID (bb->end)] = bb;
2029 for (x = bb->head; x != NULL_RTX; x = NEXT_INSN (x))
2031 enum bb_state state = IN_MULTIPLE_BB;
2032 if (in_bb_p[INSN_UID (x)] == NOT_IN_BB)
2034 in_bb_p[INSN_UID (x)] = state;
2041 for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
2046 if ((bb = start[INSN_UID (tmp_rtx)]) != NULL)
2048 fprintf (outf, ";; Start of basic block %d, registers live:",
2050 dump_regset (bb->global_live_at_start, outf);
2054 if (in_bb_p[INSN_UID (tmp_rtx)] == NOT_IN_BB
2055 && GET_CODE (tmp_rtx) != NOTE
2056 && GET_CODE (tmp_rtx) != BARRIER)
2057 fprintf (outf, ";; Insn is not within a basic block\n");
2058 else if (in_bb_p[INSN_UID (tmp_rtx)] == IN_MULTIPLE_BB)
2059 fprintf (outf, ";; Insn is in multiple basic blocks\n");
2061 did_output = print_rtl_single (outf, tmp_rtx);
2063 if ((bb = end[INSN_UID (tmp_rtx)]) != NULL)
2065 fprintf (outf, ";; End of basic block %d, registers live:\n",
2067 dump_regset (bb->global_live_at_end, outf);
2080 if (current_function_epilogue_delay_list != 0)
2082 fprintf (outf, "\n;; Insns in epilogue delay list:\n\n");
2083 for (tmp_rtx = current_function_epilogue_delay_list; tmp_rtx != 0;
2084 tmp_rtx = XEXP (tmp_rtx, 1))
2085 print_rtl_single (outf, XEXP (tmp_rtx, 0));
2089 /* Verify the CFG consistency. This function check some CFG invariants and
2090 aborts when something is wrong. Hope that this function will help to
2091 convert many optimization passes to preserve CFG consistent.
2093 Currently it does following checks:
2095 - test head/end pointers
2096 - overlapping of basic blocks
2097 - edge list correctness
2098 - headers of basic blocks (the NOTE_INSN_BASIC_BLOCK note)
2099 - tails of basic blocks (ensure that boundary is necesary)
2100 - scans body of the basic block for JUMP_INSN, CODE_LABEL
2101 and NOTE_INSN_BASIC_BLOCK
2102 - check that all insns are in the basic blocks
2103 (except the switch handling code, barriers and notes)
2104 - check that all returns are followed by barriers
2106 In future it can be extended check a lot of other stuff as well
2107 (reachability of basic blocks, life information, etc. etc.). */
2112 const int max_uid = get_max_uid ();
2113 const rtx rtx_first = get_insns ();
2114 rtx last_head = get_last_insn ();
2115 basic_block *bb_info, *last_visited;
2116 size_t *edge_checksum;
2118 int i, last_bb_num_seen, num_bb_notes, err = 0;
2120 bb_info = (basic_block *) xcalloc (max_uid, sizeof (basic_block));
2121 last_visited = (basic_block *) xcalloc (n_basic_blocks + 2,
2122 sizeof (basic_block));
2123 edge_checksum = (size_t *) xcalloc (n_basic_blocks + 2, sizeof (size_t));
2125 for (i = n_basic_blocks - 1; i >= 0; i--)
2127 basic_block bb = BASIC_BLOCK (i);
2128 rtx head = bb->head;
2131 /* Verify the end of the basic block is in the INSN chain. */
2132 for (x = last_head; x != NULL_RTX; x = PREV_INSN (x))
2137 error ("End insn %d for block %d not found in the insn stream.",
2138 INSN_UID (end), bb->index);
2142 /* Work backwards from the end to the head of the basic block
2143 to verify the head is in the RTL chain. */
2144 for (; x != NULL_RTX; x = PREV_INSN (x))
2146 /* While walking over the insn chain, verify insns appear
2147 in only one basic block and initialize the BB_INFO array
2148 used by other passes. */
2149 if (bb_info[INSN_UID (x)] != NULL)
2151 error ("Insn %d is in multiple basic blocks (%d and %d)",
2152 INSN_UID (x), bb->index, bb_info[INSN_UID (x)]->index);
2155 bb_info[INSN_UID (x)] = bb;
2162 error ("Head insn %d for block %d not found in the insn stream.",
2163 INSN_UID (head), bb->index);
2170 /* Now check the basic blocks (boundaries etc.) */
2171 for (i = n_basic_blocks - 1; i >= 0; i--)
2173 basic_block bb = BASIC_BLOCK (i);
2174 int has_fallthru = 0;
2180 if (last_visited [e->dest->index + 2] == bb)
2182 error ("verify_flow_info: Duplicate edge %i->%i",
2183 e->src->index, e->dest->index);
2186 last_visited [e->dest->index + 2] = bb;
2188 if (e->flags & EDGE_FALLTHRU)
2191 if ((e->flags & EDGE_FALLTHRU)
2192 && e->src != ENTRY_BLOCK_PTR
2193 && e->dest != EXIT_BLOCK_PTR)
2196 if (e->src->index + 1 != e->dest->index)
2198 error ("verify_flow_info: Incorrect blocks for fallthru %i->%i",
2199 e->src->index, e->dest->index);
2203 for (insn = NEXT_INSN (e->src->end); insn != e->dest->head;
2204 insn = NEXT_INSN (insn))
2205 if (GET_CODE (insn) == BARRIER || INSN_P (insn))
2207 error ("verify_flow_info: Incorrect fallthru %i->%i",
2208 e->src->index, e->dest->index);
2209 fatal_insn ("Wrong insn in the fallthru edge", insn);
2215 error ("verify_flow_info: Basic block %d succ edge is corrupted",
2217 fprintf (stderr, "Predecessor: ");
2218 dump_edge_info (stderr, e, 0);
2219 fprintf (stderr, "\nSuccessor: ");
2220 dump_edge_info (stderr, e, 1);
2221 fprintf (stderr, "\n");
2224 edge_checksum[e->dest->index + 2] += (size_t) e;
2231 /* Ensure existence of barrier in BB with no fallthru edges. */
2232 for (insn = bb->end; GET_CODE (insn) != BARRIER;
2233 insn = NEXT_INSN (insn))
2235 || (GET_CODE (insn) == NOTE
2236 && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK))
2238 error ("Missing barrier after block %i", bb->index);
2248 error ("Basic block %d pred edge is corrupted", bb->index);
2249 fputs ("Predecessor: ", stderr);
2250 dump_edge_info (stderr, e, 0);
2251 fputs ("\nSuccessor: ", stderr);
2252 dump_edge_info (stderr, e, 1);
2253 fputc ('\n', stderr);
2256 edge_checksum[e->dest->index + 2] -= (size_t) e;
2260 /* OK pointers are correct. Now check the header of basic
2261 block. It ought to contain optional CODE_LABEL followed
2262 by NOTE_BASIC_BLOCK. */
2264 if (GET_CODE (x) == CODE_LABEL)
2268 error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2274 if (!NOTE_INSN_BASIC_BLOCK_P (x) || NOTE_BASIC_BLOCK (x) != bb)
2276 error ("NOTE_INSN_BASIC_BLOCK is missing for block %d",
2283 /* Do checks for empty blocks here */
2290 if (NOTE_INSN_BASIC_BLOCK_P (x))
2292 error ("NOTE_INSN_BASIC_BLOCK %d in the middle of basic block %d",
2293 INSN_UID (x), bb->index);
2300 if (GET_CODE (x) == JUMP_INSN
2301 || GET_CODE (x) == CODE_LABEL
2302 || GET_CODE (x) == BARRIER)
2304 error ("In basic block %d:", bb->index);
2305 fatal_insn ("Flow control insn inside a basic block", x);
2313 /* Complete edge checksumming for ENTRY and EXIT. */
2316 for (e = ENTRY_BLOCK_PTR->succ; e ; e = e->succ_next)
2317 edge_checksum[e->dest->index + 2] += (size_t) e;
2318 for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
2319 edge_checksum[e->dest->index + 2] -= (size_t) e;
2322 for (i = -2; i < n_basic_blocks; ++i)
2323 if (edge_checksum[i + 2])
2325 error ("Basic block %i edge lists are corrupted", i);
2329 last_bb_num_seen = -1;
2334 if (NOTE_INSN_BASIC_BLOCK_P (x))
2336 basic_block bb = NOTE_BASIC_BLOCK (x);
2338 if (bb->index != last_bb_num_seen + 1)
2339 internal_error ("Basic blocks not numbered consecutively.");
2341 last_bb_num_seen = bb->index;
2344 if (!bb_info[INSN_UID (x)])
2346 switch (GET_CODE (x))
2353 /* An addr_vec is placed outside any block block. */
2355 && GET_CODE (NEXT_INSN (x)) == JUMP_INSN
2356 && (GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_DIFF_VEC
2357 || GET_CODE (PATTERN (NEXT_INSN (x))) == ADDR_VEC))
2362 /* But in any case, non-deletable labels can appear anywhere. */
2366 fatal_insn ("Insn outside basic block", x);
2371 && GET_CODE (x) == JUMP_INSN
2372 && returnjump_p (x) && ! condjump_p (x)
2373 && ! (NEXT_INSN (x) && GET_CODE (NEXT_INSN (x)) == BARRIER))
2374 fatal_insn ("Return not followed by barrier", x);
2379 if (num_bb_notes != n_basic_blocks)
2381 ("number of bb notes in insn chain (%d) != n_basic_blocks (%d)",
2382 num_bb_notes, n_basic_blocks);
2385 internal_error ("verify_flow_info failed.");
2389 free (last_visited);
2390 free (edge_checksum);
2394 /* Assume that the preceeding pass has possibly eliminated jump instructions
2395 or converted the unconditional jumps. Eliminate the edges from CFG.
2396 Return true if any edges are eliminated. */
2399 purge_dead_edges (bb)
2404 bool purged = false;
2406 if (GET_CODE (insn) == JUMP_INSN && !simplejump_p (insn))
2408 if (GET_CODE (insn) == JUMP_INSN)
2412 /* We do care only about conditional jumps and simplejumps. */
2413 if (!any_condjump_p (insn)
2414 && !returnjump_p (insn)
2415 && !simplejump_p (insn))
2417 for (e = bb->succ; e; e = next)
2419 next = e->succ_next;
2421 /* Check purposes we can have edge. */
2422 if ((e->flags & EDGE_FALLTHRU)
2423 && any_condjump_p (insn))
2425 if (e->dest != EXIT_BLOCK_PTR
2426 && e->dest->head == JUMP_LABEL (insn))
2428 if (e->dest == EXIT_BLOCK_PTR
2429 && returnjump_p (insn))
2434 if (!bb->succ || !purged)
2437 fprintf (rtl_dump_file, "Purged edges from bb %i\n", bb->index);
2441 /* Redistribute probabilities. */
2442 if (!bb->succ->succ_next)
2444 bb->succ->probability = REG_BR_PROB_BASE;
2445 bb->succ->count = bb->count;
2449 note = find_reg_note (insn, REG_BR_PROB, NULL);
2452 b = BRANCH_EDGE (bb);
2453 f = FALLTHRU_EDGE (bb);
2454 b->probability = INTVAL (XEXP (note, 0));
2455 f->probability = REG_BR_PROB_BASE - b->probability;
2456 b->count = bb->count * b->probability / REG_BR_PROB_BASE;
2457 f->count = bb->count * f->probability / REG_BR_PROB_BASE;
2462 /* Cleanup abnormal edges caused by throwing insns that have been
2464 if (! can_throw_internal (bb->end))
2465 for (e = bb->succ; e; e = next)
2467 next = e->succ_next;
2468 if (e->flags & EDGE_EH)
2475 /* If we don't see a jump insn, we don't know exactly why the block would
2476 have been broken at this point. Look for a simple, non-fallthru edge,
2477 as these are only created by conditional branches. If we find such an
2478 edge we know that there used to be a jump here and can then safely
2479 remove all non-fallthru edges. */
2480 for (e = bb->succ; e && (e->flags & (EDGE_COMPLEX | EDGE_FALLTHRU));
2484 for (e = bb->succ; e; e = next)
2486 next = e->succ_next;
2487 if (!(e->flags & EDGE_FALLTHRU))
2488 remove_edge (e), purged = true;
2490 if (!bb->succ || bb->succ->succ_next)
2492 bb->succ->probability = REG_BR_PROB_BASE;
2493 bb->succ->count = bb->count;
2496 fprintf (rtl_dump_file, "Purged non-fallthru edges from bb %i\n",
2501 /* Search all basic blocks for potentionally dead edges and purge them.
2503 Return true ifif some edge has been elliminated.
2507 purge_all_dead_edges ()
2509 int i, purged = false;
2510 for (i = 0; i < n_basic_blocks; i++)
2511 purged |= purge_dead_edges (BASIC_BLOCK (i));