re PR fortran/13773 (Incorrect diagnosis of restricted function)
[official-gcc.git] / gcc / cfglayout.c
blob8a57c68c2b21db76e441df500773b4eff2b4cae0
1 /* Basic block reordering routines for the GNU compiler.
2 Copyright (C) 2000, 2001, 2003, 2004 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
9 version.
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
14 for more details.
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, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "rtl.h"
27 #include "hard-reg-set.h"
28 #include "basic-block.h"
29 #include "insn-config.h"
30 #include "output.h"
31 #include "function.h"
32 #include "obstack.h"
33 #include "cfglayout.h"
34 #include "cfgloop.h"
35 #include "target.h"
36 #include "ggc.h"
37 #include "alloc-pool.h"
38 #include "flags.h"
40 /* The contents of the current function definition are allocated
41 in this obstack, and all are freed at the end of the function. */
42 extern struct obstack flow_obstack;
44 /* Holds the interesting trailing notes for the function. */
45 rtx cfg_layout_function_footer, cfg_layout_function_header;
47 static rtx skip_insns_after_block (basic_block);
48 static void record_effective_endpoints (void);
49 static rtx label_for_bb (basic_block);
50 static void fixup_reorder_chain (void);
52 static void set_block_levels (tree, int);
53 static void change_scope (rtx, tree, tree);
55 void verify_insn_chain (void);
56 static void fixup_fallthru_exit_predecessor (void);
57 static rtx duplicate_insn_chain (rtx, rtx);
58 static tree insn_scope (rtx);
59 static void update_unlikely_executed_notes (basic_block);
61 rtx
62 unlink_insn_chain (rtx first, rtx last)
64 rtx prevfirst = PREV_INSN (first);
65 rtx nextlast = NEXT_INSN (last);
67 PREV_INSN (first) = NULL;
68 NEXT_INSN (last) = NULL;
69 if (prevfirst)
70 NEXT_INSN (prevfirst) = nextlast;
71 if (nextlast)
72 PREV_INSN (nextlast) = prevfirst;
73 else
74 set_last_insn (prevfirst);
75 if (!prevfirst)
76 set_first_insn (nextlast);
77 return first;
80 /* Skip over inter-block insns occurring after BB which are typically
81 associated with BB (e.g., barriers). If there are any such insns,
82 we return the last one. Otherwise, we return the end of BB. */
84 static rtx
85 skip_insns_after_block (basic_block bb)
87 rtx insn, last_insn, next_head, prev;
89 next_head = NULL_RTX;
90 if (bb->next_bb != EXIT_BLOCK_PTR)
91 next_head = BB_HEAD (bb->next_bb);
93 for (last_insn = insn = BB_END (bb); (insn = NEXT_INSN (insn)) != 0; )
95 if (insn == next_head)
96 break;
98 switch (GET_CODE (insn))
100 case BARRIER:
101 last_insn = insn;
102 continue;
104 case NOTE:
105 switch (NOTE_LINE_NUMBER (insn))
107 case NOTE_INSN_LOOP_END:
108 case NOTE_INSN_BLOCK_END:
109 last_insn = insn;
110 continue;
111 case NOTE_INSN_DELETED:
112 case NOTE_INSN_DELETED_LABEL:
113 continue;
115 default:
116 continue;
117 break;
119 break;
121 case CODE_LABEL:
122 if (NEXT_INSN (insn)
123 && GET_CODE (NEXT_INSN (insn)) == JUMP_INSN
124 && (GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_VEC
125 || GET_CODE (PATTERN (NEXT_INSN (insn))) == ADDR_DIFF_VEC))
127 insn = NEXT_INSN (insn);
128 last_insn = insn;
129 continue;
131 break;
133 default:
134 break;
137 break;
140 /* It is possible to hit contradictory sequence. For instance:
142 jump_insn
143 NOTE_INSN_LOOP_BEG
144 barrier
146 Where barrier belongs to jump_insn, but the note does not. This can be
147 created by removing the basic block originally following
148 NOTE_INSN_LOOP_BEG. In such case reorder the notes. */
150 for (insn = last_insn; insn != BB_END (bb); insn = prev)
152 prev = PREV_INSN (insn);
153 if (GET_CODE (insn) == NOTE)
154 switch (NOTE_LINE_NUMBER (insn))
156 case NOTE_INSN_LOOP_END:
157 case NOTE_INSN_BLOCK_END:
158 case NOTE_INSN_DELETED:
159 case NOTE_INSN_DELETED_LABEL:
160 continue;
161 default:
162 reorder_insns (insn, insn, last_insn);
166 return last_insn;
169 /* Locate or create a label for a given basic block. */
171 static rtx
172 label_for_bb (basic_block bb)
174 rtx label = BB_HEAD (bb);
176 if (GET_CODE (label) != CODE_LABEL)
178 if (dump_file)
179 fprintf (dump_file, "Emitting label for block %d\n", bb->index);
181 label = block_label (bb);
184 return label;
187 /* Locate the effective beginning and end of the insn chain for each
188 block, as defined by skip_insns_after_block above. */
190 static void
191 record_effective_endpoints (void)
193 rtx next_insn;
194 basic_block bb;
195 rtx insn;
197 for (insn = get_insns ();
198 insn
199 && GET_CODE (insn) == NOTE
200 && NOTE_LINE_NUMBER (insn) != NOTE_INSN_BASIC_BLOCK;
201 insn = NEXT_INSN (insn))
202 continue;
203 if (!insn)
204 abort (); /* No basic blocks at all? */
205 if (PREV_INSN (insn))
206 cfg_layout_function_header =
207 unlink_insn_chain (get_insns (), PREV_INSN (insn));
208 else
209 cfg_layout_function_header = NULL_RTX;
211 next_insn = get_insns ();
212 FOR_EACH_BB (bb)
214 rtx end;
216 if (PREV_INSN (BB_HEAD (bb)) && next_insn != BB_HEAD (bb))
217 bb->rbi->header = unlink_insn_chain (next_insn,
218 PREV_INSN (BB_HEAD (bb)));
219 end = skip_insns_after_block (bb);
220 if (NEXT_INSN (BB_END (bb)) && BB_END (bb) != end)
221 bb->rbi->footer = unlink_insn_chain (NEXT_INSN (BB_END (bb)), end);
222 next_insn = NEXT_INSN (BB_END (bb));
225 cfg_layout_function_footer = next_insn;
226 if (cfg_layout_function_footer)
227 cfg_layout_function_footer = unlink_insn_chain (cfg_layout_function_footer, get_last_insn ());
230 /* Data structures representing mapping of INSN_LOCATOR into scope blocks, line
231 numbers and files. In order to be GGC friendly we need to use separate
232 varrays. This also slightly improve the memory locality in binary search.
233 The _locs array contains locators where the given property change. The
234 block_locators_blocks contains the scope block that is used for all insn
235 locator greater than corresponding block_locators_locs value and smaller
236 than the following one. Similarly for the other properties. */
237 static GTY(()) varray_type block_locators_locs;
238 static GTY(()) varray_type block_locators_blocks;
239 static GTY(()) varray_type line_locators_locs;
240 static GTY(()) varray_type line_locators_lines;
241 static GTY(()) varray_type file_locators_locs;
242 static GTY(()) varray_type file_locators_files;
243 int prologue_locator;
244 int epilogue_locator;
246 /* During the RTL expansion the lexical blocks and line numbers are
247 represented via INSN_NOTEs. Replace them by representation using
248 INSN_LOCATORs. */
250 void
251 insn_locators_initialize (void)
253 tree block = NULL;
254 tree last_block = NULL;
255 rtx insn, next;
256 int loc = 0;
257 int line_number = 0, last_line_number = 0;
258 char *file_name = NULL, *last_file_name = NULL;
260 prologue_locator = epilogue_locator = 0;
262 VARRAY_INT_INIT (block_locators_locs, 32, "block_locators_locs");
263 VARRAY_TREE_INIT (block_locators_blocks, 32, "block_locators_blocks");
264 VARRAY_INT_INIT (line_locators_locs, 32, "line_locators_locs");
265 VARRAY_INT_INIT (line_locators_lines, 32, "line_locators_lines");
266 VARRAY_INT_INIT (file_locators_locs, 32, "file_locators_locs");
267 VARRAY_CHAR_PTR_INIT (file_locators_files, 32, "file_locators_files");
269 for (insn = get_insns (); insn; insn = next)
271 next = NEXT_INSN (insn);
273 if ((active_insn_p (insn)
274 && GET_CODE (PATTERN (insn)) != ADDR_VEC
275 && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
276 || !NEXT_INSN (insn)
277 || (!prologue_locator && file_name))
279 if (last_block != block)
281 loc++;
282 VARRAY_PUSH_INT (block_locators_locs, loc);
283 VARRAY_PUSH_TREE (block_locators_blocks, block);
284 last_block = block;
286 if (last_line_number != line_number)
288 loc++;
289 VARRAY_PUSH_INT (line_locators_locs, loc);
290 VARRAY_PUSH_INT (line_locators_lines, line_number);
291 last_line_number = line_number;
293 if (last_file_name != file_name)
295 loc++;
296 VARRAY_PUSH_INT (file_locators_locs, loc);
297 VARRAY_PUSH_CHAR_PTR (file_locators_files, file_name);
298 last_file_name = file_name;
301 if (!prologue_locator && file_name)
302 prologue_locator = loc;
303 if (!NEXT_INSN (insn))
304 epilogue_locator = loc;
305 if (active_insn_p (insn))
306 INSN_LOCATOR (insn) = loc;
307 else if (GET_CODE (insn) == NOTE)
309 switch (NOTE_LINE_NUMBER (insn))
311 case NOTE_INSN_BLOCK_BEG:
312 if (cfun->dont_emit_block_notes)
313 abort ();
314 block = NOTE_BLOCK (insn);
315 delete_insn (insn);
316 break;
317 case NOTE_INSN_BLOCK_END:
318 if (cfun->dont_emit_block_notes)
319 abort ();
320 block = BLOCK_SUPERCONTEXT (block);
321 if (block && TREE_CODE (block) == FUNCTION_DECL)
322 block = 0;
323 delete_insn (insn);
324 break;
325 default:
326 if (NOTE_LINE_NUMBER (insn) > 0)
328 line_number = NOTE_LINE_NUMBER (insn);
329 file_name = (char *)NOTE_SOURCE_FILE (insn);
331 break;
335 if (cfun->dont_emit_block_notes)
336 check_block_change (insn, &block);
339 /* Tag the blocks with a depth number so that change_scope can find
340 the common parent easily. */
341 set_block_levels (DECL_INITIAL (cfun->decl), 0);
343 if (cfun->dont_emit_block_notes)
344 free_block_changes ();
347 /* For each lexical block, set BLOCK_NUMBER to the depth at which it is
348 found in the block tree. */
350 static void
351 set_block_levels (tree block, int level)
353 while (block)
355 BLOCK_NUMBER (block) = level;
356 set_block_levels (BLOCK_SUBBLOCKS (block), level + 1);
357 block = BLOCK_CHAIN (block);
361 /* Return sope resulting from combination of S1 and S2. */
362 tree
363 choose_inner_scope (tree s1, tree s2)
365 if (!s1)
366 return s2;
367 if (!s2)
368 return s1;
369 if (BLOCK_NUMBER (s1) > BLOCK_NUMBER (s2))
370 return s1;
371 return s2;
374 /* Emit lexical block notes needed to change scope from S1 to S2. */
376 static void
377 change_scope (rtx orig_insn, tree s1, tree s2)
379 rtx insn = orig_insn;
380 tree com = NULL_TREE;
381 tree ts1 = s1, ts2 = s2;
382 tree s;
384 while (ts1 != ts2)
386 if (ts1 == NULL || ts2 == NULL)
387 abort ();
388 if (BLOCK_NUMBER (ts1) > BLOCK_NUMBER (ts2))
389 ts1 = BLOCK_SUPERCONTEXT (ts1);
390 else if (BLOCK_NUMBER (ts1) < BLOCK_NUMBER (ts2))
391 ts2 = BLOCK_SUPERCONTEXT (ts2);
392 else
394 ts1 = BLOCK_SUPERCONTEXT (ts1);
395 ts2 = BLOCK_SUPERCONTEXT (ts2);
398 com = ts1;
400 /* Close scopes. */
401 s = s1;
402 while (s != com)
404 rtx note = emit_note_before (NOTE_INSN_BLOCK_END, insn);
405 NOTE_BLOCK (note) = s;
406 s = BLOCK_SUPERCONTEXT (s);
409 /* Open scopes. */
410 s = s2;
411 while (s != com)
413 insn = emit_note_before (NOTE_INSN_BLOCK_BEG, insn);
414 NOTE_BLOCK (insn) = s;
415 s = BLOCK_SUPERCONTEXT (s);
419 /* Return lexical scope block insn belong to. */
420 static tree
421 insn_scope (rtx insn)
423 int max = VARRAY_ACTIVE_SIZE (block_locators_locs);
424 int min = 0;
425 int loc = INSN_LOCATOR (insn);
427 /* When block_locators_locs was initialized, the pro- and epilogue
428 insns didn't exist yet and can therefore not be found this way.
429 But we know that they belong to the outer most block of the
430 current function.
431 Without this test, the prologue would be put inside the block of
432 the first valid instruction in the function and when that first
433 insn is part of an inlined function then the low_pc of that
434 inlined function is messed up. Likewise for the epilogue and
435 the last valid instruction. */
436 if (loc == prologue_locator || loc == epilogue_locator)
437 return DECL_INITIAL (cfun->decl);
439 if (!max || !loc)
440 return NULL;
441 while (1)
443 int pos = (min + max) / 2;
444 int tmp = VARRAY_INT (block_locators_locs, pos);
446 if (tmp <= loc && min != pos)
447 min = pos;
448 else if (tmp > loc && max != pos)
449 max = pos;
450 else
452 min = pos;
453 break;
456 return VARRAY_TREE (block_locators_blocks, min);
459 /* Return line number of the statement specified by the locator. */
461 locator_line (int loc)
463 int max = VARRAY_ACTIVE_SIZE (line_locators_locs);
464 int min = 0;
466 if (!max || !loc)
467 return 0;
468 while (1)
470 int pos = (min + max) / 2;
471 int tmp = VARRAY_INT (line_locators_locs, pos);
473 if (tmp <= loc && min != pos)
474 min = pos;
475 else if (tmp > loc && max != pos)
476 max = pos;
477 else
479 min = pos;
480 break;
483 return VARRAY_INT (line_locators_lines, min);
486 /* Return line number of the statement that produced this insn. */
488 insn_line (rtx insn)
490 return locator_line (INSN_LOCATOR (insn));
493 /* Return source file of the statement specified by LOC. */
494 const char *
495 locator_file (int loc)
497 int max = VARRAY_ACTIVE_SIZE (file_locators_locs);
498 int min = 0;
500 if (!max || !loc)
501 return NULL;
502 while (1)
504 int pos = (min + max) / 2;
505 int tmp = VARRAY_INT (file_locators_locs, pos);
507 if (tmp <= loc && min != pos)
508 min = pos;
509 else if (tmp > loc && max != pos)
510 max = pos;
511 else
513 min = pos;
514 break;
517 return VARRAY_CHAR_PTR (file_locators_files, min);
520 /* Return source file of the statement that produced this insn. */
521 const char *
522 insn_file (rtx insn)
524 return locator_file (INSN_LOCATOR (insn));
527 /* Rebuild all the NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes based
528 on the scope tree and the newly reordered instructions. */
530 void
531 reemit_insn_block_notes (void)
533 tree cur_block = DECL_INITIAL (cfun->decl);
534 rtx insn, note;
536 insn = get_insns ();
537 if (!active_insn_p (insn))
538 insn = next_active_insn (insn);
539 for (; insn; insn = next_active_insn (insn))
541 tree this_block;
543 this_block = insn_scope (insn);
544 /* For sequences compute scope resulting from merging all scopes
545 of instructions nested inside. */
546 if (GET_CODE (PATTERN (insn)) == SEQUENCE)
548 int i;
549 rtx body = PATTERN (insn);
551 this_block = NULL;
552 for (i = 0; i < XVECLEN (body, 0); i++)
553 this_block = choose_inner_scope (this_block,
554 insn_scope (XVECEXP (body, 0, i)));
556 if (! this_block)
557 continue;
559 if (this_block != cur_block)
561 change_scope (insn, cur_block, this_block);
562 cur_block = this_block;
566 /* change_scope emits before the insn, not after. */
567 note = emit_note (NOTE_INSN_DELETED);
568 change_scope (note, cur_block, DECL_INITIAL (cfun->decl));
569 delete_insn (note);
571 reorder_blocks ();
574 /* Given a reorder chain, rearrange the code to match. */
576 static void
577 fixup_reorder_chain (void)
579 basic_block bb, prev_bb;
580 int index;
581 rtx insn = NULL;
583 if (cfg_layout_function_header)
585 set_first_insn (cfg_layout_function_header);
586 insn = cfg_layout_function_header;
587 while (NEXT_INSN (insn))
588 insn = NEXT_INSN (insn);
591 /* First do the bulk reordering -- rechain the blocks without regard to
592 the needed changes to jumps and labels. */
594 for (bb = ENTRY_BLOCK_PTR->next_bb, index = 0;
595 bb != 0;
596 bb = bb->rbi->next, index++)
598 if (bb->rbi->header)
600 if (insn)
601 NEXT_INSN (insn) = bb->rbi->header;
602 else
603 set_first_insn (bb->rbi->header);
604 PREV_INSN (bb->rbi->header) = insn;
605 insn = bb->rbi->header;
606 while (NEXT_INSN (insn))
607 insn = NEXT_INSN (insn);
609 if (insn)
610 NEXT_INSN (insn) = BB_HEAD (bb);
611 else
612 set_first_insn (BB_HEAD (bb));
613 PREV_INSN (BB_HEAD (bb)) = insn;
614 insn = BB_END (bb);
615 if (bb->rbi->footer)
617 NEXT_INSN (insn) = bb->rbi->footer;
618 PREV_INSN (bb->rbi->footer) = insn;
619 while (NEXT_INSN (insn))
620 insn = NEXT_INSN (insn);
624 if (index != n_basic_blocks)
625 abort ();
627 NEXT_INSN (insn) = cfg_layout_function_footer;
628 if (cfg_layout_function_footer)
629 PREV_INSN (cfg_layout_function_footer) = insn;
631 while (NEXT_INSN (insn))
632 insn = NEXT_INSN (insn);
634 set_last_insn (insn);
635 #ifdef ENABLE_CHECKING
636 verify_insn_chain ();
637 #endif
638 delete_dead_jumptables ();
640 /* Now add jumps and labels as needed to match the blocks new
641 outgoing edges. */
643 for (bb = ENTRY_BLOCK_PTR->next_bb; bb ; bb = bb->rbi->next)
645 edge e_fall, e_taken, e;
646 rtx bb_end_insn;
647 basic_block nb;
648 basic_block old_bb;
650 if (bb->succ == NULL)
651 continue;
653 /* Find the old fallthru edge, and another non-EH edge for
654 a taken jump. */
655 e_taken = e_fall = NULL;
656 for (e = bb->succ; e ; e = e->succ_next)
657 if (e->flags & EDGE_FALLTHRU)
658 e_fall = e;
659 else if (! (e->flags & EDGE_EH))
660 e_taken = e;
662 bb_end_insn = BB_END (bb);
663 if (GET_CODE (bb_end_insn) == JUMP_INSN)
665 if (any_condjump_p (bb_end_insn))
667 /* If the old fallthru is still next, nothing to do. */
668 if (bb->rbi->next == e_fall->dest
669 || (!bb->rbi->next
670 && e_fall->dest == EXIT_BLOCK_PTR))
671 continue;
673 /* The degenerated case of conditional jump jumping to the next
674 instruction can happen on target having jumps with side
675 effects.
677 Create temporarily the duplicated edge representing branch.
678 It will get unidentified by force_nonfallthru_and_redirect
679 that would otherwise get confused by fallthru edge not pointing
680 to the next basic block. */
681 if (!e_taken)
683 rtx note;
684 edge e_fake;
686 e_fake = unchecked_make_edge (bb, e_fall->dest, 0);
688 if (!redirect_jump (BB_END (bb), block_label (bb), 0))
689 abort ();
690 note = find_reg_note (BB_END (bb), REG_BR_PROB, NULL_RTX);
691 if (note)
693 int prob = INTVAL (XEXP (note, 0));
695 e_fake->probability = prob;
696 e_fake->count = e_fall->count * prob / REG_BR_PROB_BASE;
697 e_fall->probability -= e_fall->probability;
698 e_fall->count -= e_fake->count;
699 if (e_fall->probability < 0)
700 e_fall->probability = 0;
701 if (e_fall->count < 0)
702 e_fall->count = 0;
705 /* There is one special case: if *neither* block is next,
706 such as happens at the very end of a function, then we'll
707 need to add a new unconditional jump. Choose the taken
708 edge based on known or assumed probability. */
709 else if (bb->rbi->next != e_taken->dest)
711 rtx note = find_reg_note (bb_end_insn, REG_BR_PROB, 0);
713 if (note
714 && INTVAL (XEXP (note, 0)) < REG_BR_PROB_BASE / 2
715 && invert_jump (bb_end_insn,
716 label_for_bb (e_fall->dest), 0))
718 e_fall->flags &= ~EDGE_FALLTHRU;
719 e_taken->flags |= EDGE_FALLTHRU;
720 update_br_prob_note (bb);
721 e = e_fall, e_fall = e_taken, e_taken = e;
725 /* If the "jumping" edge is a crossing edge, and the fall
726 through edge is non-crossing, leave things as they are. */
727 else if (e_taken->crossing_edge && !e_fall->crossing_edge)
728 continue;
730 /* Otherwise we can try to invert the jump. This will
731 basically never fail, however, keep up the pretense. */
732 else if (invert_jump (bb_end_insn,
733 label_for_bb (e_fall->dest), 0))
735 e_fall->flags &= ~EDGE_FALLTHRU;
736 e_taken->flags |= EDGE_FALLTHRU;
737 update_br_prob_note (bb);
738 continue;
741 else if (returnjump_p (bb_end_insn))
742 continue;
743 else
745 /* Otherwise we have some switch or computed jump. In the
746 99% case, there should not have been a fallthru edge. */
747 if (! e_fall)
748 continue;
750 #ifdef CASE_DROPS_THROUGH
751 /* Except for VAX. Since we didn't have predication for the
752 tablejump, the fallthru block should not have moved. */
753 if (bb->rbi->next == e_fall->dest)
754 continue;
755 bb_end_insn = skip_insns_after_block (bb);
756 #else
757 abort ();
758 #endif
761 else
763 /* No fallthru implies a noreturn function with EH edges, or
764 something similarly bizarre. In any case, we don't need to
765 do anything. */
766 if (! e_fall)
767 continue;
769 /* If the fallthru block is still next, nothing to do. */
770 if (bb->rbi->next == e_fall->dest)
771 continue;
773 /* A fallthru to exit block. */
774 if (!bb->rbi->next && e_fall->dest == EXIT_BLOCK_PTR)
775 continue;
778 /* We got here if we need to add a new jump insn. */
779 nb = force_nonfallthru (e_fall);
780 if (nb)
782 initialize_bb_rbi (nb);
783 nb->rbi->visited = 1;
784 nb->rbi->next = bb->rbi->next;
785 bb->rbi->next = nb;
786 /* Don't process this new block. */
787 old_bb = bb;
788 bb = nb;
790 /* Make sure new bb is tagged for correct section (same as
791 fall-thru source). */
792 e_fall->src->partition = bb->pred->src->partition;
793 if (flag_reorder_blocks_and_partition)
795 if (bb->pred->src->partition == COLD_PARTITION)
797 rtx new_note;
798 rtx note = BB_HEAD (e_fall->src);
800 while (!INSN_P (note)
801 && note != BB_END (e_fall->src))
802 note = NEXT_INSN (note);
804 new_note = emit_note_before
805 (NOTE_INSN_UNLIKELY_EXECUTED_CODE,
806 note);
807 NOTE_BASIC_BLOCK (new_note) = bb;
809 if (GET_CODE (BB_END (bb)) == JUMP_INSN
810 && !any_condjump_p (BB_END (bb))
811 && bb->succ->crossing_edge )
812 REG_NOTES (BB_END (bb)) = gen_rtx_EXPR_LIST
813 (REG_CROSSING_JUMP, NULL_RTX, REG_NOTES (BB_END (bb)));
818 /* Put basic_block_info in the new order. */
820 if (dump_file)
822 fprintf (dump_file, "Reordered sequence:\n");
823 for (bb = ENTRY_BLOCK_PTR->next_bb, index = 0;
825 bb = bb->rbi->next, index++)
827 fprintf (dump_file, " %i ", index);
828 if (bb->rbi->original)
829 fprintf (dump_file, "duplicate of %i ",
830 bb->rbi->original->index);
831 else if (forwarder_block_p (bb)
832 && GET_CODE (BB_HEAD (bb)) != CODE_LABEL)
833 fprintf (dump_file, "compensation ");
834 else
835 fprintf (dump_file, "bb %i ", bb->index);
836 fprintf (dump_file, " [%i]\n", bb->frequency);
840 prev_bb = ENTRY_BLOCK_PTR;
841 bb = ENTRY_BLOCK_PTR->next_bb;
842 index = 0;
844 for (; bb; prev_bb = bb, bb = bb->rbi->next, index ++)
846 bb->index = index;
847 BASIC_BLOCK (index) = bb;
849 update_unlikely_executed_notes (bb);
851 bb->prev_bb = prev_bb;
852 prev_bb->next_bb = bb;
854 prev_bb->next_bb = EXIT_BLOCK_PTR;
855 EXIT_BLOCK_PTR->prev_bb = prev_bb;
857 /* Annoying special case - jump around dead jumptables left in the code. */
858 FOR_EACH_BB (bb)
860 edge e;
861 for (e = bb->succ; e && !(e->flags & EDGE_FALLTHRU); e = e->succ_next)
862 continue;
863 if (e && !can_fallthru (e->src, e->dest))
864 force_nonfallthru (e);
868 /* Update the basic block number information in any
869 NOTE_INSN_UNLIKELY_EXECUTED_CODE notes within the basic block. */
871 static void
872 update_unlikely_executed_notes (basic_block bb)
874 rtx cur_insn;
876 for (cur_insn = BB_HEAD (bb); cur_insn != BB_END (bb);
877 cur_insn = NEXT_INSN (cur_insn))
878 if (GET_CODE (cur_insn) == NOTE
879 && NOTE_LINE_NUMBER (cur_insn) == NOTE_INSN_UNLIKELY_EXECUTED_CODE)
880 NOTE_BASIC_BLOCK (cur_insn) = bb;
883 /* Perform sanity checks on the insn chain.
884 1. Check that next/prev pointers are consistent in both the forward and
885 reverse direction.
886 2. Count insns in chain, going both directions, and check if equal.
887 3. Check that get_last_insn () returns the actual end of chain. */
889 void
890 verify_insn_chain (void)
892 rtx x, prevx, nextx;
893 int insn_cnt1, insn_cnt2;
895 for (prevx = NULL, insn_cnt1 = 1, x = get_insns ();
896 x != 0;
897 prevx = x, insn_cnt1++, x = NEXT_INSN (x))
898 if (PREV_INSN (x) != prevx)
899 abort ();
901 if (prevx != get_last_insn ())
902 abort ();
904 for (nextx = NULL, insn_cnt2 = 1, x = get_last_insn ();
905 x != 0;
906 nextx = x, insn_cnt2++, x = PREV_INSN (x))
907 if (NEXT_INSN (x) != nextx)
908 abort ();
910 if (insn_cnt1 != insn_cnt2)
911 abort ();
914 /* The block falling through to exit must be the last one in the
915 reordered chain. Ensure that this condition is met. */
916 static void
917 fixup_fallthru_exit_predecessor (void)
919 edge e;
920 basic_block bb = NULL;
922 for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next)
923 if (e->flags & EDGE_FALLTHRU)
924 bb = e->src;
926 if (bb && bb->rbi->next)
928 basic_block c = ENTRY_BLOCK_PTR->next_bb;
930 while (c->rbi->next != bb)
931 c = c->rbi->next;
933 c->rbi->next = bb->rbi->next;
934 while (c->rbi->next)
935 c = c->rbi->next;
937 c->rbi->next = bb;
938 bb->rbi->next = NULL;
942 /* Return true in case it is possible to duplicate the basic block BB. */
944 /* We do not want to declare the function in a header file, since it should
945 only be used through the cfghooks interface, and we do not want to move
946 it to cfgrtl.c since it would require also moving quite a lot of related
947 code. */
948 extern bool cfg_layout_can_duplicate_bb_p (basic_block);
950 bool
951 cfg_layout_can_duplicate_bb_p (basic_block bb)
953 /* Do not attempt to duplicate tablejumps, as we need to unshare
954 the dispatch table. This is difficult to do, as the instructions
955 computing jump destination may be hoisted outside the basic block. */
956 if (tablejump_p (BB_END (bb), NULL, NULL))
957 return false;
959 /* Do not duplicate blocks containing insns that can't be copied. */
960 if (targetm.cannot_copy_insn_p)
962 rtx insn = BB_HEAD (bb);
963 while (1)
965 if (INSN_P (insn) && targetm.cannot_copy_insn_p (insn))
966 return false;
967 if (insn == BB_END (bb))
968 break;
969 insn = NEXT_INSN (insn);
973 return true;
976 static rtx
977 duplicate_insn_chain (rtx from, rtx to)
979 rtx insn, last;
981 /* Avoid updating of boundaries of previous basic block. The
982 note will get removed from insn stream in fixup. */
983 last = emit_note (NOTE_INSN_DELETED);
985 /* Create copy at the end of INSN chain. The chain will
986 be reordered later. */
987 for (insn = from; insn != NEXT_INSN (to); insn = NEXT_INSN (insn))
989 switch (GET_CODE (insn))
991 case INSN:
992 case CALL_INSN:
993 case JUMP_INSN:
994 /* Avoid copying of dispatch tables. We never duplicate
995 tablejumps, so this can hit only in case the table got
996 moved far from original jump. */
997 if (GET_CODE (PATTERN (insn)) == ADDR_VEC
998 || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
999 break;
1000 emit_copy_of_insn_after (insn, get_last_insn ());
1001 break;
1003 case CODE_LABEL:
1004 break;
1006 case BARRIER:
1007 emit_barrier ();
1008 break;
1010 case NOTE:
1011 switch (NOTE_LINE_NUMBER (insn))
1013 /* In case prologue is empty and function contain label
1014 in first BB, we may want to copy the block. */
1015 case NOTE_INSN_PROLOGUE_END:
1017 case NOTE_INSN_LOOP_VTOP:
1018 case NOTE_INSN_LOOP_CONT:
1019 case NOTE_INSN_LOOP_BEG:
1020 case NOTE_INSN_LOOP_END:
1021 /* Strip down the loop notes - we don't really want to keep
1022 them consistent in loop copies. */
1023 case NOTE_INSN_DELETED:
1024 case NOTE_INSN_DELETED_LABEL:
1025 /* No problem to strip these. */
1026 case NOTE_INSN_EPILOGUE_BEG:
1027 case NOTE_INSN_FUNCTION_END:
1028 /* Debug code expect these notes to exist just once.
1029 Keep them in the master copy.
1030 ??? It probably makes more sense to duplicate them for each
1031 epilogue copy. */
1032 case NOTE_INSN_FUNCTION_BEG:
1033 /* There is always just single entry to function. */
1034 case NOTE_INSN_BASIC_BLOCK:
1035 break;
1037 /* There is no purpose to duplicate prologue. */
1038 case NOTE_INSN_BLOCK_BEG:
1039 case NOTE_INSN_BLOCK_END:
1040 /* The BLOCK_BEG/BLOCK_END notes should be eliminated when BB
1041 reordering is in the progress. */
1042 case NOTE_INSN_EH_REGION_BEG:
1043 case NOTE_INSN_EH_REGION_END:
1044 /* Should never exist at BB duplication time. */
1045 abort ();
1046 break;
1047 case NOTE_INSN_REPEATED_LINE_NUMBER:
1048 case NOTE_INSN_UNLIKELY_EXECUTED_CODE:
1049 emit_note_copy (insn);
1050 break;
1052 default:
1053 if (NOTE_LINE_NUMBER (insn) < 0)
1054 abort ();
1055 /* It is possible that no_line_number is set and the note
1056 won't be emitted. */
1057 emit_note_copy (insn);
1059 break;
1060 default:
1061 abort ();
1064 insn = NEXT_INSN (last);
1065 delete_insn (last);
1066 return insn;
1068 /* Create a duplicate of the basic block BB. */
1070 /* We do not want to declare the function in a header file, since it should
1071 only be used through the cfghooks interface, and we do not want to move
1072 it to cfgrtl.c since it would require also moving quite a lot of related
1073 code. */
1074 extern basic_block cfg_layout_duplicate_bb (basic_block);
1076 basic_block
1077 cfg_layout_duplicate_bb (basic_block bb)
1079 rtx insn;
1080 basic_block new_bb;
1082 insn = duplicate_insn_chain (BB_HEAD (bb), BB_END (bb));
1083 new_bb = create_basic_block (insn,
1084 insn ? get_last_insn () : NULL,
1085 EXIT_BLOCK_PTR->prev_bb);
1087 if (bb->rbi->header)
1089 insn = bb->rbi->header;
1090 while (NEXT_INSN (insn))
1091 insn = NEXT_INSN (insn);
1092 insn = duplicate_insn_chain (bb->rbi->header, insn);
1093 if (insn)
1094 new_bb->rbi->header = unlink_insn_chain (insn, get_last_insn ());
1097 if (bb->rbi->footer)
1099 insn = bb->rbi->footer;
1100 while (NEXT_INSN (insn))
1101 insn = NEXT_INSN (insn);
1102 insn = duplicate_insn_chain (bb->rbi->footer, insn);
1103 if (insn)
1104 new_bb->rbi->footer = unlink_insn_chain (insn, get_last_insn ());
1107 if (bb->global_live_at_start)
1109 new_bb->global_live_at_start = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1110 new_bb->global_live_at_end = OBSTACK_ALLOC_REG_SET (&flow_obstack);
1111 COPY_REG_SET (new_bb->global_live_at_start, bb->global_live_at_start);
1112 COPY_REG_SET (new_bb->global_live_at_end, bb->global_live_at_end);
1115 return new_bb;
1118 /* Main entry point to this module - initialize the data structures for
1119 CFG layout changes. It keeps LOOPS up-to-date if not null. */
1121 void
1122 cfg_layout_initialize (void)
1124 basic_block bb;
1126 /* Our algorithm depends on fact that there are no dead jumptables
1127 around the code. */
1128 alloc_rbi_pool ();
1130 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
1131 initialize_bb_rbi (bb);
1133 cfg_layout_rtl_register_cfg_hooks ();
1135 record_effective_endpoints ();
1137 cleanup_cfg (CLEANUP_CFGLAYOUT);
1140 /* Splits superblocks. */
1141 void
1142 break_superblocks (void)
1144 sbitmap superblocks;
1145 bool need = false;
1146 basic_block bb;
1148 superblocks = sbitmap_alloc (last_basic_block);
1149 sbitmap_zero (superblocks);
1151 FOR_EACH_BB (bb)
1152 if (bb->flags & BB_SUPERBLOCK)
1154 bb->flags &= ~BB_SUPERBLOCK;
1155 SET_BIT (superblocks, bb->index);
1156 need = true;
1159 if (need)
1161 rebuild_jump_labels (get_insns ());
1162 find_many_sub_basic_blocks (superblocks);
1165 free (superblocks);
1168 /* Finalize the changes: reorder insn list according to the sequence, enter
1169 compensation code, rebuild scope forest. */
1171 void
1172 cfg_layout_finalize (void)
1174 basic_block bb;
1176 #ifdef ENABLE_CHECKING
1177 verify_flow_info ();
1178 #endif
1179 rtl_register_cfg_hooks ();
1180 fixup_fallthru_exit_predecessor ();
1181 fixup_reorder_chain ();
1183 #ifdef ENABLE_CHECKING
1184 verify_insn_chain ();
1185 #endif
1187 free_rbi_pool ();
1188 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
1189 bb->rbi = NULL;
1191 break_superblocks ();
1193 #ifdef ENABLE_CHECKING
1194 verify_flow_info ();
1195 #endif
1198 /* Checks whether all N blocks in BBS array can be copied. */
1199 bool
1200 can_copy_bbs_p (basic_block *bbs, unsigned n)
1202 unsigned i;
1203 edge e;
1204 int ret = true;
1206 for (i = 0; i < n; i++)
1207 bbs[i]->rbi->duplicated = 1;
1209 for (i = 0; i < n; i++)
1211 /* In case we should redirect abnormal edge during duplication, fail. */
1212 for (e = bbs[i]->succ; e; e = e->succ_next)
1213 if ((e->flags & EDGE_ABNORMAL)
1214 && e->dest->rbi->duplicated)
1216 ret = false;
1217 goto end;
1220 if (!can_duplicate_block_p (bbs[i]))
1222 ret = false;
1223 break;
1227 end:
1228 for (i = 0; i < n; i++)
1229 bbs[i]->rbi->duplicated = 0;
1231 return ret;
1234 /* Duplicates N basic blocks stored in array BBS. Newly created basic blocks
1235 are placed into array NEW_BBS in the same order. Edges from basic blocks
1236 in BBS are also duplicated and copies of those of them
1237 that lead into BBS are redirected to appropriate newly created block. The
1238 function assigns bbs into loops (copy of basic block bb is assigned to
1239 bb->loop_father->copy loop, so this must be set up correctly in advance)
1240 and updates dominators locally (LOOPS structure that contains the information
1241 about dominators is passed to enable this).
1243 BASE is the superloop to that basic block belongs; if its header or latch
1244 is copied, we do not set the new blocks as header or latch.
1246 Created copies of N_EDGES edges in array EDGES are stored in array NEW_EDGES,
1247 also in the same order. */
1249 void
1250 copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
1251 edge *edges, unsigned n_edges, edge *new_edges,
1252 struct loop *base)
1254 unsigned i, j;
1255 basic_block bb, new_bb, dom_bb;
1256 edge e;
1258 /* Duplicate bbs, update dominators, assign bbs to loops. */
1259 for (i = 0; i < n; i++)
1261 /* Duplicate. */
1262 bb = bbs[i];
1263 new_bb = new_bbs[i] = duplicate_block (bb, NULL);
1264 bb->rbi->duplicated = 1;
1265 /* Add to loop. */
1266 add_bb_to_loop (new_bb, bb->loop_father->copy);
1267 /* Possibly set header. */
1268 if (bb->loop_father->header == bb && bb->loop_father != base)
1269 new_bb->loop_father->header = new_bb;
1270 /* Or latch. */
1271 if (bb->loop_father->latch == bb && bb->loop_father != base)
1272 new_bb->loop_father->latch = new_bb;
1275 /* Set dominators. */
1276 for (i = 0; i < n; i++)
1278 bb = bbs[i];
1279 new_bb = new_bbs[i];
1281 dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb);
1282 if (dom_bb->rbi->duplicated)
1284 dom_bb = dom_bb->rbi->copy;
1285 set_immediate_dominator (CDI_DOMINATORS, new_bb, dom_bb);
1289 /* Redirect edges. */
1290 for (j = 0; j < n_edges; j++)
1291 new_edges[j] = NULL;
1292 for (i = 0; i < n; i++)
1294 new_bb = new_bbs[i];
1295 bb = bbs[i];
1297 for (e = new_bb->succ; e; e = e->succ_next)
1299 for (j = 0; j < n_edges; j++)
1300 if (edges[j] && edges[j]->src == bb && edges[j]->dest == e->dest)
1301 new_edges[j] = e;
1303 if (!e->dest->rbi->duplicated)
1304 continue;
1305 redirect_edge_and_branch_force (e, e->dest->rbi->copy);
1309 /* Clear information about duplicates. */
1310 for (i = 0; i < n; i++)
1311 bbs[i]->rbi->duplicated = 0;
1314 #include "gt-cfglayout.h"