1 /* Basic block reordering routines for the GNU compiler.
2 Copyright (C) 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 2, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING. If not, write to the Free
18 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
23 #include "coretypes.h"
27 #include "hard-reg-set.h"
29 #include "basic-block.h"
30 #include "insn-config.h"
33 #include "cfglayout.h"
37 #include "alloc-pool.h"
39 #include "tree-pass.h"
42 /* Holds the interesting trailing notes for the function. */
43 rtx cfg_layout_function_footer;
44 rtx cfg_layout_function_header;
46 static rtx skip_insns_after_block (basic_block);
47 static void record_effective_endpoints (void);
48 static rtx label_for_bb (basic_block);
49 static void fixup_reorder_chain (void);
51 static void set_block_levels (tree, int);
52 static void change_scope (rtx, tree, tree);
54 void verify_insn_chain (void);
55 static void fixup_fallthru_exit_predecessor (void);
56 static tree insn_scope (rtx);
59 unlink_insn_chain (rtx first, rtx last)
61 rtx prevfirst = PREV_INSN (first);
62 rtx nextlast = NEXT_INSN (last);
64 PREV_INSN (first) = NULL;
65 NEXT_INSN (last) = NULL;
67 NEXT_INSN (prevfirst) = nextlast;
69 PREV_INSN (nextlast) = prevfirst;
71 set_last_insn (prevfirst);
73 set_first_insn (nextlast);
77 /* Skip over inter-block insns occurring after BB which are typically
78 associated with BB (e.g., barriers). If there are any such insns,
79 we return the last one. Otherwise, we return the end of BB. */
82 skip_insns_after_block (basic_block bb)
84 rtx insn, last_insn, next_head, prev;
87 if (bb->next_bb != EXIT_BLOCK_PTR)
88 next_head = BB_HEAD (bb->next_bb);
90 for (last_insn = insn = BB_END (bb); (insn = NEXT_INSN (insn)) != 0; )
92 if (insn == next_head)
95 switch (GET_CODE (insn))
102 switch (NOTE_LINE_NUMBER (insn))
104 case NOTE_INSN_BLOCK_END:
107 case NOTE_INSN_DELETED:
108 case NOTE_INSN_DELETED_LABEL:
119 && JUMP_P (NEXT_INSN (insn))
120 && (GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_VEC
121 || GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_DIFF_VEC))
123 insn = NEXT_INSN (insn);
136 /* It is possible to hit contradictory sequence. For instance:
142 Where barrier belongs to jump_insn, but the note does not. This can be
143 created by removing the basic block originally following
144 NOTE_INSN_BLOCK_BEG. In such case reorder the notes. */
146 for (insn = last_insn; insn != BB_END (bb); insn = prev)
148 prev = PREV_INSN (insn);
150 switch (NOTE_LINE_NUMBER (insn))
152 case NOTE_INSN_BLOCK_END:
153 case NOTE_INSN_DELETED:
154 case NOTE_INSN_DELETED_LABEL:
157 reorder_insns (insn, insn, last_insn);
164 /* Locate or create a label for a given basic block. */
167 label_for_bb (basic_block bb)
169 rtx label = BB_HEAD (bb);
171 if (!LABEL_P (label))
174 fprintf (dump_file, "Emitting label for block %d\n", bb->index);
176 label = block_label (bb);
182 /* Locate the effective beginning and end of the insn chain for each
183 block, as defined by skip_insns_after_block above. */
186 record_effective_endpoints (void)
192 for (insn = get_insns ();
195 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK;
196 insn = NEXT_INSN (insn))
198 /* No basic blocks at all? */
201 if (PREV_INSN (insn))
202 cfg_layout_function_header =
203 unlink_insn_chain (get_insns (), PREV_INSN (insn));
205 cfg_layout_function_header = NULL_RTX;
207 next_insn = get_insns ();
212 if (PREV_INSN (BB_HEAD (bb)) && next_insn != BB_HEAD (bb))
213 bb->il.rtl->header = unlink_insn_chain (next_insn,
214 PREV_INSN (BB_HEAD (bb)));
215 end = skip_insns_after_block (bb);
216 if (NEXT_INSN (BB_END (bb)) && BB_END (bb) != end)
217 bb->il.rtl->footer = unlink_insn_chain (NEXT_INSN (BB_END (bb)), end);
218 next_insn = NEXT_INSN (BB_END (bb));
221 cfg_layout_function_footer = next_insn;
222 if (cfg_layout_function_footer)
223 cfg_layout_function_footer = unlink_insn_chain (cfg_layout_function_footer, get_last_insn ());
226 /* Data structures representing mapping of INSN_LOCATOR into scope blocks, line
227 numbers and files. In order to be GGC friendly we need to use separate
228 varrays. This also slightly improve the memory locality in binary search.
229 The _locs array contains locators where the given property change. The
230 block_locators_blocks contains the scope block that is used for all insn
231 locator greater than corresponding block_locators_locs value and smaller
232 than the following one. Similarly for the other properties. */
233 static VEC(int,heap) *block_locators_locs;
234 static GTY(()) VEC(tree,gc) *block_locators_blocks;
235 static VEC(int,heap) *line_locators_locs;
236 static VEC(int,heap) *line_locators_lines;
237 static VEC(int,heap) *file_locators_locs;
238 static GTY(()) varray_type file_locators_files;
239 int prologue_locator;
240 int epilogue_locator;
242 /* During the RTL expansion the lexical blocks and line numbers are
243 represented via INSN_NOTEs. Replace them by representation using
247 insn_locators_initialize (void)
250 tree last_block = NULL;
253 int line_number = 0, last_line_number = 0;
254 const char *file_name = NULL, *last_file_name = NULL;
256 prologue_locator = epilogue_locator = 0;
258 block_locators_locs = VEC_alloc (int, heap, 32);
259 block_locators_blocks = VEC_alloc (tree, gc, 32);
260 line_locators_locs = VEC_alloc (int, heap, 32);
261 line_locators_lines = VEC_alloc (int, heap, 32);
262 file_locators_locs = VEC_alloc (int, heap, 32);
263 VARRAY_CHAR_PTR_INIT (file_locators_files, 32, "file_locators_files");
265 for (insn = get_insns (); insn; insn = next)
269 next = NEXT_INSN (insn);
273 gcc_assert (NOTE_LINE_NUMBER (insn) != NOTE_INSN_BLOCK_BEG
274 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BLOCK_END);
275 if (NOTE_LINE_NUMBER (insn) > 0)
277 expanded_location xloc;
278 NOTE_EXPANDED_LOCATION (xloc, insn);
279 line_number = xloc.line;
280 file_name = xloc.file;
285 active = (active_insn_p (insn)
286 && GET_CODE (PATTERN (insn)) != ADDR_VEC
287 && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC);
289 check_block_change (insn, &block);
293 || (!prologue_locator && file_name))
295 if (last_block != block)
298 VEC_safe_push (int, heap, block_locators_locs, loc);
299 VEC_safe_push (tree, gc, block_locators_blocks, block);
302 if (last_line_number != line_number)
305 VEC_safe_push (int, heap, line_locators_locs, loc);
306 VEC_safe_push (int, heap, line_locators_lines, line_number);
307 last_line_number = line_number;
309 if (last_file_name != file_name)
312 VEC_safe_push (int, heap, file_locators_locs, loc);
313 VARRAY_PUSH_CHAR_PTR (file_locators_files, (char *) file_name);
314 last_file_name = file_name;
316 if (!prologue_locator && file_name)
317 prologue_locator = loc;
319 epilogue_locator = loc;
321 INSN_LOCATOR (insn) = loc;
325 /* Tag the blocks with a depth number so that change_scope can find
326 the common parent easily. */
327 set_block_levels (DECL_INITIAL (cfun->decl), 0);
329 free_block_changes ();
333 struct tree_opt_pass pass_insn_locators_initialize =
335 "locators", /* name */
337 insn_locators_initialize, /* execute */
340 0, /* static_pass_number */
342 0, /* properties_required */
343 0, /* properties_provided */
344 0, /* properties_destroyed */
345 0, /* todo_flags_start */
346 TODO_dump_func, /* todo_flags_finish */
351 into_cfg_layout_mode (void)
353 cfg_layout_initialize (0);
358 outof_cfg_layout_mode (void)
363 if (bb->next_bb != EXIT_BLOCK_PTR)
364 bb->aux = bb->next_bb;
366 cfg_layout_finalize ();
371 struct tree_opt_pass pass_into_cfg_layout_mode =
373 "into_cfglayout", /* name */
375 into_cfg_layout_mode, /* execute */
378 0, /* static_pass_number */
380 0, /* properties_required */
381 0, /* properties_provided */
382 0, /* properties_destroyed */
383 0, /* todo_flags_start */
384 TODO_dump_func, /* todo_flags_finish */
388 struct tree_opt_pass pass_outof_cfg_layout_mode =
390 "outof_cfglayout", /* name */
392 outof_cfg_layout_mode, /* execute */
395 0, /* static_pass_number */
397 0, /* properties_required */
398 0, /* properties_provided */
399 0, /* properties_destroyed */
400 0, /* todo_flags_start */
401 TODO_dump_func, /* todo_flags_finish */
405 /* For each lexical block, set BLOCK_NUMBER to the depth at which it is
406 found in the block tree. */
409 set_block_levels (tree block, int level)
413 BLOCK_NUMBER (block) = level;
414 set_block_levels (BLOCK_SUBBLOCKS (block), level + 1);
415 block = BLOCK_CHAIN (block);
419 /* Return sope resulting from combination of S1 and S2. */
421 choose_inner_scope (tree s1, tree s2)
427 if (BLOCK_NUMBER (s1) > BLOCK_NUMBER (s2))
432 /* Emit lexical block notes needed to change scope from S1 to S2. */
435 change_scope (rtx orig_insn, tree s1, tree s2)
437 rtx insn = orig_insn;
438 tree com = NULL_TREE;
439 tree ts1 = s1, ts2 = s2;
444 gcc_assert (ts1 && ts2);
445 if (BLOCK_NUMBER (ts1) > BLOCK_NUMBER (ts2))
446 ts1 = BLOCK_SUPERCONTEXT (ts1);
447 else if (BLOCK_NUMBER (ts1) < BLOCK_NUMBER (ts2))
448 ts2 = BLOCK_SUPERCONTEXT (ts2);
451 ts1 = BLOCK_SUPERCONTEXT (ts1);
452 ts2 = BLOCK_SUPERCONTEXT (ts2);
461 rtx note = emit_note_before (NOTE_INSN_BLOCK_END, insn);
462 NOTE_BLOCK (note) = s;
463 s = BLOCK_SUPERCONTEXT (s);
470 insn = emit_note_before (NOTE_INSN_BLOCK_BEG, insn);
471 NOTE_BLOCK (insn) = s;
472 s = BLOCK_SUPERCONTEXT (s);
476 /* Return lexical scope block insn belong to. */
478 insn_scope (rtx insn)
480 int max = VEC_length (int, block_locators_locs);
482 int loc = INSN_LOCATOR (insn);
484 /* When block_locators_locs was initialized, the pro- and epilogue
485 insns didn't exist yet and can therefore not be found this way.
486 But we know that they belong to the outer most block of the
488 Without this test, the prologue would be put inside the block of
489 the first valid instruction in the function and when that first
490 insn is part of an inlined function then the low_pc of that
491 inlined function is messed up. Likewise for the epilogue and
492 the last valid instruction. */
493 if (loc == prologue_locator || loc == epilogue_locator)
494 return DECL_INITIAL (cfun->decl);
500 int pos = (min + max) / 2;
501 int tmp = VEC_index (int, block_locators_locs, pos);
503 if (tmp <= loc && min != pos)
505 else if (tmp > loc && max != pos)
513 return VEC_index (tree, block_locators_blocks, min);
516 /* Return line number of the statement specified by the locator. */
518 locator_line (int loc)
520 int max = VEC_length (int, line_locators_locs);
527 int pos = (min + max) / 2;
528 int tmp = VEC_index (int, line_locators_locs, pos);
530 if (tmp <= loc && min != pos)
532 else if (tmp > loc && max != pos)
540 return VEC_index (int, line_locators_lines, min);
543 /* Return line number of the statement that produced this insn. */
547 return locator_line (INSN_LOCATOR (insn));
550 /* Return source file of the statement specified by LOC. */
552 locator_file (int loc)
554 int max = VEC_length (int, file_locators_locs);
561 int pos = (min + max) / 2;
562 int tmp = VEC_index (int, file_locators_locs, pos);
564 if (tmp <= loc && min != pos)
566 else if (tmp > loc && max != pos)
574 return VARRAY_CHAR_PTR (file_locators_files, min);
577 /* Return source file of the statement that produced this insn. */
581 return locator_file (INSN_LOCATOR (insn));
584 /* Rebuild all the NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes based
585 on the scope tree and the newly reordered instructions. */
588 reemit_insn_block_notes (void)
590 tree cur_block = DECL_INITIAL (cfun->decl);
594 if (!active_insn_p (insn))
595 insn = next_active_insn (insn);
596 for (; insn; insn = next_active_insn (insn))
600 /* Avoid putting scope notes between jump table and its label. */
602 && (GET_CODE (PATTERN (insn)) == ADDR_VEC
603 || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
606 this_block = insn_scope (insn);
607 /* For sequences compute scope resulting from merging all scopes
608 of instructions nested inside. */
609 if (GET_CODE (PATTERN (insn)) == SEQUENCE)
612 rtx body = PATTERN (insn);
615 for (i = 0; i < XVECLEN (body, 0); i++)
616 this_block = choose_inner_scope (this_block,
617 insn_scope (XVECEXP (body, 0, i)));
622 if (this_block != cur_block)
624 change_scope (insn, cur_block, this_block);
625 cur_block = this_block;
629 /* change_scope emits before the insn, not after. */
630 note = emit_note (NOTE_INSN_DELETED);
631 change_scope (note, cur_block, DECL_INITIAL (cfun->decl));
638 /* Link the basic blocks in the correct order, compacting the basic
639 block queue while at it. This also clears the visited flag on
640 all basic blocks. If STAY_IN_CFGLAYOUT_MODE is false, this function
641 also clears the basic block header and footer fields.
643 This function is usually called after a pass (e.g. tracer) finishes
644 some transformations while in cfglayout mode. The required sequence
645 of the basic blocks is in a linked list along the bb->aux field.
646 This functions re-links the basic block prev_bb and next_bb pointers
647 accordingly, and it compacts and renumbers the blocks. */
650 relink_block_chain (bool stay_in_cfglayout_mode)
652 basic_block bb, prev_bb;
655 /* Maybe dump the re-ordered sequence. */
658 fprintf (dump_file, "Reordered sequence:\n");
659 for (bb = ENTRY_BLOCK_PTR->next_bb, index = NUM_FIXED_BLOCKS;
661 bb = bb->aux, index++)
663 fprintf (dump_file, " %i ", index);
664 if (get_bb_original (bb))
665 fprintf (dump_file, "duplicate of %i ",
666 get_bb_original (bb)->index);
667 else if (forwarder_block_p (bb)
668 && !LABEL_P (BB_HEAD (bb)))
669 fprintf (dump_file, "compensation ");
671 fprintf (dump_file, "bb %i ", bb->index);
672 fprintf (dump_file, " [%i]\n", bb->frequency);
676 /* Now reorder the blocks. */
677 prev_bb = ENTRY_BLOCK_PTR;
678 bb = ENTRY_BLOCK_PTR->next_bb;
679 for (; bb; prev_bb = bb, bb = bb->aux)
681 bb->prev_bb = prev_bb;
682 prev_bb->next_bb = bb;
684 prev_bb->next_bb = EXIT_BLOCK_PTR;
685 EXIT_BLOCK_PTR->prev_bb = prev_bb;
687 /* Then, clean up the aux and visited fields. */
691 bb->il.rtl->visited = 0;
692 if (!stay_in_cfglayout_mode)
693 bb->il.rtl->header = bb->il.rtl->footer = NULL;
696 /* Maybe reset the original copy tables, they are not valid anymore
697 when we renumber the basic blocks in compact_blocks. If we are
698 are going out of cfglayout mode, don't re-allocate the tables. */
699 free_original_copy_tables ();
700 if (stay_in_cfglayout_mode)
701 initialize_original_copy_tables ();
703 /* Finally, put basic_block_info in the new order. */
708 /* Given a reorder chain, rearrange the code to match. */
711 fixup_reorder_chain (void)
716 if (cfg_layout_function_header)
718 set_first_insn (cfg_layout_function_header);
719 insn = cfg_layout_function_header;
720 while (NEXT_INSN (insn))
721 insn = NEXT_INSN (insn);
724 /* First do the bulk reordering -- rechain the blocks without regard to
725 the needed changes to jumps and labels. */
727 for (bb = ENTRY_BLOCK_PTR->next_bb; bb; bb = bb->aux)
729 if (bb->il.rtl->header)
732 NEXT_INSN (insn) = bb->il.rtl->header;
734 set_first_insn (bb->il.rtl->header);
735 PREV_INSN (bb->il.rtl->header) = insn;
736 insn = bb->il.rtl->header;
737 while (NEXT_INSN (insn))
738 insn = NEXT_INSN (insn);
741 NEXT_INSN (insn) = BB_HEAD (bb);
743 set_first_insn (BB_HEAD (bb));
744 PREV_INSN (BB_HEAD (bb)) = insn;
746 if (bb->il.rtl->footer)
748 NEXT_INSN (insn) = bb->il.rtl->footer;
749 PREV_INSN (bb->il.rtl->footer) = insn;
750 while (NEXT_INSN (insn))
751 insn = NEXT_INSN (insn);
755 NEXT_INSN (insn) = cfg_layout_function_footer;
756 if (cfg_layout_function_footer)
757 PREV_INSN (cfg_layout_function_footer) = insn;
759 while (NEXT_INSN (insn))
760 insn = NEXT_INSN (insn);
762 set_last_insn (insn);
763 #ifdef ENABLE_CHECKING
764 verify_insn_chain ();
767 /* Now add jumps and labels as needed to match the blocks new
770 for (bb = ENTRY_BLOCK_PTR->next_bb; bb ; bb = bb->aux)
772 edge e_fall, e_taken, e;
777 if (EDGE_COUNT (bb->succs) == 0)
780 /* Find the old fallthru edge, and another non-EH edge for
782 e_taken = e_fall = NULL;
784 FOR_EACH_EDGE (e, ei, bb->succs)
785 if (e->flags & EDGE_FALLTHRU)
787 else if (! (e->flags & EDGE_EH))
790 bb_end_insn = BB_END (bb);
791 if (JUMP_P (bb_end_insn))
793 if (any_condjump_p (bb_end_insn))
795 /* If the old fallthru is still next, nothing to do. */
796 if (bb->aux == e_fall->dest
797 || e_fall->dest == EXIT_BLOCK_PTR)
800 /* The degenerated case of conditional jump jumping to the next
801 instruction can happen for jumps with side effects. We need
802 to construct a forwarder block and this will be done just
803 fine by force_nonfallthru below. */
807 /* There is another special case: if *neither* block is next,
808 such as happens at the very end of a function, then we'll
809 need to add a new unconditional jump. Choose the taken
810 edge based on known or assumed probability. */
811 else if (bb->aux != e_taken->dest)
813 rtx note = find_reg_note (bb_end_insn, REG_BR_PROB, 0);
816 && INTVAL (XEXP (note, 0)) < REG_BR_PROB_BASE / 2
817 && invert_jump (bb_end_insn,
818 (e_fall->dest == EXIT_BLOCK_PTR
820 : label_for_bb (e_fall->dest)), 0))
822 e_fall->flags &= ~EDGE_FALLTHRU;
823 #ifdef ENABLE_CHECKING
824 gcc_assert (could_fall_through
825 (e_taken->src, e_taken->dest));
827 e_taken->flags |= EDGE_FALLTHRU;
828 update_br_prob_note (bb);
829 e = e_fall, e_fall = e_taken, e_taken = e;
833 /* If the "jumping" edge is a crossing edge, and the fall
834 through edge is non-crossing, leave things as they are. */
835 else if ((e_taken->flags & EDGE_CROSSING)
836 && !(e_fall->flags & EDGE_CROSSING))
839 /* Otherwise we can try to invert the jump. This will
840 basically never fail, however, keep up the pretense. */
841 else if (invert_jump (bb_end_insn,
842 (e_fall->dest == EXIT_BLOCK_PTR
844 : label_for_bb (e_fall->dest)), 0))
846 e_fall->flags &= ~EDGE_FALLTHRU;
847 #ifdef ENABLE_CHECKING
848 gcc_assert (could_fall_through
849 (e_taken->src, e_taken->dest));
851 e_taken->flags |= EDGE_FALLTHRU;
852 update_br_prob_note (bb);
858 /* Otherwise we have some return, switch or computed
859 jump. In the 99% case, there should not have been a
861 gcc_assert (returnjump_p (bb_end_insn) || !e_fall);
867 /* No fallthru implies a noreturn function with EH edges, or
868 something similarly bizarre. In any case, we don't need to
873 /* If the fallthru block is still next, nothing to do. */
874 if (bb->aux == e_fall->dest)
877 /* A fallthru to exit block. */
878 if (e_fall->dest == EXIT_BLOCK_PTR)
882 /* We got here if we need to add a new jump insn. */
883 nb = force_nonfallthru (e_fall);
886 nb->il.rtl->visited = 1;
889 /* Don't process this new block. */
892 /* Make sure new bb is tagged for correct section (same as
893 fall-thru source, since you cannot fall-throu across
894 section boundaries). */
895 BB_COPY_PARTITION (e_fall->src, single_pred (bb));
896 if (flag_reorder_blocks_and_partition
897 && targetm.have_named_sections
898 && JUMP_P (BB_END (bb))
899 && !any_condjump_p (BB_END (bb))
900 && (EDGE_SUCC (bb, 0)->flags & EDGE_CROSSING))
901 REG_NOTES (BB_END (bb)) = gen_rtx_EXPR_LIST
902 (REG_CROSSING_JUMP, NULL_RTX, REG_NOTES (BB_END (bb)));
906 relink_block_chain (/*stay_in_cfglayout_mode=*/false);
908 /* Annoying special case - jump around dead jumptables left in the code. */
914 FOR_EACH_EDGE (e, ei, bb->succs)
915 if (e->flags & EDGE_FALLTHRU)
918 if (e && !can_fallthru (e->src, e->dest))
919 force_nonfallthru (e);
923 /* Perform sanity checks on the insn chain.
924 1. Check that next/prev pointers are consistent in both the forward and
926 2. Count insns in chain, going both directions, and check if equal.
927 3. Check that get_last_insn () returns the actual end of chain. */
930 verify_insn_chain (void)
933 int insn_cnt1, insn_cnt2;
935 for (prevx = NULL, insn_cnt1 = 1, x = get_insns ();
937 prevx = x, insn_cnt1++, x = NEXT_INSN (x))
938 gcc_assert (PREV_INSN (x) == prevx);
940 gcc_assert (prevx == get_last_insn ());
942 for (nextx = NULL, insn_cnt2 = 1, x = get_last_insn ();
944 nextx = x, insn_cnt2++, x = PREV_INSN (x))
945 gcc_assert (NEXT_INSN (x) == nextx);
947 gcc_assert (insn_cnt1 == insn_cnt2);
950 /* If we have assembler epilogues, the block falling through to exit must
951 be the last one in the reordered chain when we reach final. Ensure
952 that this condition is met. */
954 fixup_fallthru_exit_predecessor (void)
958 basic_block bb = NULL;
960 /* This transformation is not valid before reload, because we might
961 separate a call from the instruction that copies the return
963 gcc_assert (reload_completed);
965 FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
966 if (e->flags & EDGE_FALLTHRU)
971 basic_block c = ENTRY_BLOCK_PTR->next_bb;
973 /* If the very first block is the one with the fall-through exit
974 edge, we have to split that block. */
977 bb = split_block (bb, NULL)->dest;
980 bb->il.rtl->footer = c->il.rtl->footer;
981 c->il.rtl->footer = NULL;
996 /* Return true in case it is possible to duplicate the basic block BB. */
998 /* We do not want to declare the function in a header file, since it should
999 only be used through the cfghooks interface, and we do not want to move
1000 it to cfgrtl.c since it would require also moving quite a lot of related
1002 extern bool cfg_layout_can_duplicate_bb_p (basic_block);
1005 cfg_layout_can_duplicate_bb_p (basic_block bb)
1007 /* Do not attempt to duplicate tablejumps, as we need to unshare
1008 the dispatch table. This is difficult to do, as the instructions
1009 computing jump destination may be hoisted outside the basic block. */
1010 if (tablejump_p (BB_END (bb), NULL, NULL))
1013 /* Do not duplicate blocks containing insns that can't be copied. */
1014 if (targetm.cannot_copy_insn_p)
1016 rtx insn = BB_HEAD (bb);
1019 if (INSN_P (insn) && targetm.cannot_copy_insn_p (insn))
1021 if (insn == BB_END (bb))
1023 insn = NEXT_INSN (insn);
1031 duplicate_insn_chain (rtx from, rtx to)
1035 /* Avoid updating of boundaries of previous basic block. The
1036 note will get removed from insn stream in fixup. */
1037 last = emit_note (NOTE_INSN_DELETED);
1039 /* Create copy at the end of INSN chain. The chain will
1040 be reordered later. */
1041 for (insn = from; insn != NEXT_INSN (to); insn = NEXT_INSN (insn))
1043 switch (GET_CODE (insn))
1048 /* Avoid copying of dispatch tables. We never duplicate
1049 tablejumps, so this can hit only in case the table got
1050 moved far from original jump. */
1051 if (GET_CODE (PATTERN (insn)) == ADDR_VEC
1052 || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
1054 emit_copy_of_insn_after (insn, get_last_insn ());
1065 switch (NOTE_LINE_NUMBER (insn))
1067 /* In case prologue is empty and function contain label
1068 in first BB, we may want to copy the block. */
1069 case NOTE_INSN_PROLOGUE_END:
1071 case NOTE_INSN_DELETED:
1072 case NOTE_INSN_DELETED_LABEL:
1073 /* No problem to strip these. */
1074 case NOTE_INSN_EPILOGUE_BEG:
1075 /* Debug code expect these notes to exist just once.
1076 Keep them in the master copy.
1077 ??? It probably makes more sense to duplicate them for each
1079 case NOTE_INSN_FUNCTION_BEG:
1080 /* There is always just single entry to function. */
1081 case NOTE_INSN_BASIC_BLOCK:
1084 case NOTE_INSN_SWITCH_TEXT_SECTIONS:
1085 emit_note_copy (insn);
1089 /* All other notes should have already been eliminated.
1091 gcc_assert (NOTE_LINE_NUMBER (insn) >= 0);
1093 /* It is possible that no_line_number is set and the note
1094 won't be emitted. */
1095 emit_note_copy (insn);
1102 insn = NEXT_INSN (last);
1106 /* Create a duplicate of the basic block BB. */
1108 /* We do not want to declare the function in a header file, since it should
1109 only be used through the cfghooks interface, and we do not want to move
1110 it to cfgrtl.c since it would require also moving quite a lot of related
1112 extern basic_block cfg_layout_duplicate_bb (basic_block);
1115 cfg_layout_duplicate_bb (basic_block bb)
1120 insn = duplicate_insn_chain (BB_HEAD (bb), BB_END (bb));
1121 new_bb = create_basic_block (insn,
1122 insn ? get_last_insn () : NULL,
1123 EXIT_BLOCK_PTR->prev_bb);
1125 BB_COPY_PARTITION (new_bb, bb);
1126 if (bb->il.rtl->header)
1128 insn = bb->il.rtl->header;
1129 while (NEXT_INSN (insn))
1130 insn = NEXT_INSN (insn);
1131 insn = duplicate_insn_chain (bb->il.rtl->header, insn);
1133 new_bb->il.rtl->header = unlink_insn_chain (insn, get_last_insn ());
1136 if (bb->il.rtl->footer)
1138 insn = bb->il.rtl->footer;
1139 while (NEXT_INSN (insn))
1140 insn = NEXT_INSN (insn);
1141 insn = duplicate_insn_chain (bb->il.rtl->footer, insn);
1143 new_bb->il.rtl->footer = unlink_insn_chain (insn, get_last_insn ());
1146 if (bb->il.rtl->global_live_at_start)
1148 new_bb->il.rtl->global_live_at_start = ALLOC_REG_SET (®_obstack);
1149 new_bb->il.rtl->global_live_at_end = ALLOC_REG_SET (®_obstack);
1150 COPY_REG_SET (new_bb->il.rtl->global_live_at_start,
1151 bb->il.rtl->global_live_at_start);
1152 COPY_REG_SET (new_bb->il.rtl->global_live_at_end,
1153 bb->il.rtl->global_live_at_end);
1159 /* Main entry point to this module - initialize the datastructures for
1160 CFG layout changes. It keeps LOOPS up-to-date if not null.
1162 FLAGS is a set of additional flags to pass to cleanup_cfg(). It should
1163 include CLEANUP_UPDATE_LIFE if liveness information must be kept up
1167 cfg_layout_initialize (unsigned int flags)
1169 initialize_original_copy_tables ();
1171 cfg_layout_rtl_register_cfg_hooks ();
1173 record_effective_endpoints ();
1175 cleanup_cfg (CLEANUP_CFGLAYOUT | flags);
1178 /* Splits superblocks. */
1180 break_superblocks (void)
1182 sbitmap superblocks;
1186 superblocks = sbitmap_alloc (last_basic_block);
1187 sbitmap_zero (superblocks);
1190 if (bb->flags & BB_SUPERBLOCK)
1192 bb->flags &= ~BB_SUPERBLOCK;
1193 SET_BIT (superblocks, bb->index);
1199 rebuild_jump_labels (get_insns ());
1200 find_many_sub_basic_blocks (superblocks);
1206 /* Finalize the changes: reorder insn list according to the sequence specified
1207 by aux pointers, enter compensation code, rebuild scope forest. */
1210 cfg_layout_finalize (void)
1212 #ifdef ENABLE_CHECKING
1213 verify_flow_info ();
1215 rtl_register_cfg_hooks ();
1216 if (reload_completed
1217 #ifdef HAVE_epilogue
1221 fixup_fallthru_exit_predecessor ();
1222 fixup_reorder_chain ();
1224 rebuild_jump_labels (get_insns ());
1225 delete_dead_jumptables ();
1227 #ifdef ENABLE_CHECKING
1228 verify_insn_chain ();
1229 verify_flow_info ();
1233 /* Checks whether all N blocks in BBS array can be copied. */
1235 can_copy_bbs_p (basic_block *bbs, unsigned n)
1241 for (i = 0; i < n; i++)
1242 bbs[i]->flags |= BB_DUPLICATED;
1244 for (i = 0; i < n; i++)
1246 /* In case we should redirect abnormal edge during duplication, fail. */
1248 FOR_EACH_EDGE (e, ei, bbs[i]->succs)
1249 if ((e->flags & EDGE_ABNORMAL)
1250 && (e->dest->flags & BB_DUPLICATED))
1256 if (!can_duplicate_block_p (bbs[i]))
1264 for (i = 0; i < n; i++)
1265 bbs[i]->flags &= ~BB_DUPLICATED;
1270 /* Duplicates N basic blocks stored in array BBS. Newly created basic blocks
1271 are placed into array NEW_BBS in the same order. Edges from basic blocks
1272 in BBS are also duplicated and copies of those of them
1273 that lead into BBS are redirected to appropriate newly created block. The
1274 function assigns bbs into loops (copy of basic block bb is assigned to
1275 bb->loop_father->copy loop, so this must be set up correctly in advance)
1276 and updates dominators locally (LOOPS structure that contains the information
1277 about dominators is passed to enable this).
1279 BASE is the superloop to that basic block belongs; if its header or latch
1280 is copied, we do not set the new blocks as header or latch.
1282 Created copies of N_EDGES edges in array EDGES are stored in array NEW_EDGES,
1283 also in the same order.
1285 Newly created basic blocks are put after the basic block AFTER in the
1286 instruction stream, and the order of the blocks in BBS array is preserved. */
1289 copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
1290 edge *edges, unsigned num_edges, edge *new_edges,
1291 struct loop *base, basic_block after)
1294 basic_block bb, new_bb, dom_bb;
1297 /* Duplicate bbs, update dominators, assign bbs to loops. */
1298 for (i = 0; i < n; i++)
1302 new_bb = new_bbs[i] = duplicate_block (bb, NULL, after);
1304 bb->flags |= BB_DUPLICATED;
1305 /* Possibly set loop header. */
1306 if (bb->loop_father->header == bb && bb->loop_father != base)
1307 new_bb->loop_father->header = new_bb;
1309 if (bb->loop_father->latch == bb && bb->loop_father != base)
1310 new_bb->loop_father->latch = new_bb;
1313 /* Set dominators. */
1314 for (i = 0; i < n; i++)
1317 new_bb = new_bbs[i];
1319 dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb);
1320 if (dom_bb->flags & BB_DUPLICATED)
1322 dom_bb = get_bb_copy (dom_bb);
1323 set_immediate_dominator (CDI_DOMINATORS, new_bb, dom_bb);
1327 /* Redirect edges. */
1328 for (j = 0; j < num_edges; j++)
1329 new_edges[j] = NULL;
1330 for (i = 0; i < n; i++)
1333 new_bb = new_bbs[i];
1336 FOR_EACH_EDGE (e, ei, new_bb->succs)
1338 for (j = 0; j < num_edges; j++)
1339 if (edges[j] && edges[j]->src == bb && edges[j]->dest == e->dest)
1342 if (!(e->dest->flags & BB_DUPLICATED))
1344 redirect_edge_and_branch_force (e, get_bb_copy (e->dest));
1348 /* Clear information about duplicates. */
1349 for (i = 0; i < n; i++)
1350 bbs[i]->flags &= ~BB_DUPLICATED;
1353 #include "gt-cfglayout.h"