1 /* Basic block reordering routines for the GNU compiler.
2 Copyright (C) 2000, 2002, 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
7 under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License 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
21 /* This (greedy) algorithm constructs traces in several rounds.
22 The construction starts from "seeds". The seed for the first round
23 is the entry point of function. When there are more than one seed
24 that one is selected first that has the lowest key in the heap
25 (see function bb_to_key). Then the algorithm repeatedly adds the most
26 probable successor to the end of a trace. Finally it connects the traces.
28 There are two parameters: Branch Threshold and Exec Threshold.
29 If the edge to a successor of the actual basic block is lower than
30 Branch Threshold or the frequency of the successor is lower than
31 Exec Threshold the successor will be the seed in one of the next rounds.
32 Each round has these parameters lower than the previous one.
33 The last round has to have these parameters set to zero
34 so that the remaining blocks are picked up.
36 The algorithm selects the most probable successor from all unvisited
37 successors and successors that have been added to this trace.
38 The other successors (that has not been "sent" to the next round) will be
39 other seeds for this round and the secondary traces will start in them.
40 If the successor has not been visited in this trace it is added to the trace
41 (however, there is some heuristic for simple branches).
42 If the successor has been visited in this trace the loop has been found.
43 If the loop has many iterations the loop is rotated so that the
44 source block of the most probable edge going out from the loop
45 is the last block of the trace.
46 If the loop has few iterations and there is no edge from the last block of
47 the loop going out from loop the loop header is duplicated.
48 Finally, the construction of the trace is terminated.
50 When connecting traces it first checks whether there is an edge from the
51 last block of one trace to the first block of another trace.
52 When there are still some unconnected traces it checks whether there exists
53 a basic block BB such that BB is a successor of the last bb of one trace
54 and BB is a predecessor of the first block of another trace. In this case,
55 BB is duplicated and the traces are connected through this duplicate.
56 The rest of traces are simply connected so there will be a jump to the
57 beginning of the rest of trace.
62 "Software Trace Cache"
63 A. Ramirez, J. Larriba-Pey, C. Navarro, J. Torrellas and M. Valero; 1999
64 http://citeseer.nj.nec.com/15361.html
70 #include "coretypes.h"
73 #include "basic-block.h"
77 #include "cfglayout.h"
85 /* The number of rounds. In most cases there will only be 4 rounds, but
86 when partitioning hot and cold basic blocks into separate sections of
87 the .o file there will be an extra round.*/
90 /* Branch thresholds in thousandths (per mille) of the REG_BR_PROB_BASE. */
91 static int branch_threshold[N_ROUNDS] = {400, 200, 100, 0, 0};
93 /* Exec thresholds in thousandths (per mille) of the frequency of bb 0. */
94 static int exec_threshold[N_ROUNDS] = {500, 200, 50, 0, 0};
96 /* If edge frequency is lower than DUPLICATION_THRESHOLD per mille of entry
97 block the edge destination is not duplicated while connecting traces. */
98 #define DUPLICATION_THRESHOLD 100
100 /* Length of unconditional jump instruction. */
101 static int uncond_jump_length;
103 /* Structure to hold needed information for each basic block. */
104 typedef struct bbro_basic_block_data_def
106 /* Which trace is the bb start of (-1 means it is not a start of a trace). */
109 /* Which trace is the bb end of (-1 means it is not an end of a trace). */
112 /* Which heap is BB in (if any)? */
115 /* Which heap node is BB in (if any)? */
117 } bbro_basic_block_data;
119 /* The current size of the following dynamic array. */
120 static int array_size;
122 /* The array which holds needed information for basic blocks. */
123 static bbro_basic_block_data *bbd;
125 /* To avoid frequent reallocation the size of arrays is greater than needed,
126 the number of elements is (not less than) 1.25 * size_wanted. */
127 #define GET_ARRAY_SIZE(X) ((((X) / 4) + 1) * 5)
129 /* Free the memory and set the pointer to NULL. */
131 do { if (P) { free (P); P = 0; } else { abort (); } } while (0)
133 /* Structure for holding information about a trace. */
136 /* First and last basic block of the trace. */
137 basic_block first, last;
139 /* The round of the STC creation which this trace was found in. */
142 /* The length (i.e. the number of basic blocks) of the trace. */
146 /* Maximum frequency and count of one of the entry blocks. */
147 int max_entry_frequency;
148 gcov_type max_entry_count;
150 /* Local function prototypes. */
151 static void find_traces (int *, struct trace *);
152 static basic_block rotate_loop (edge, struct trace *, int);
153 static void mark_bb_visited (basic_block, int);
154 static void find_traces_1_round (int, int, gcov_type, struct trace *, int *,
155 int, fibheap_t *, int);
156 static basic_block copy_bb (basic_block, edge, basic_block, int);
157 static fibheapkey_t bb_to_key (basic_block);
158 static bool better_edge_p (basic_block, edge, int, int, int, int, edge);
159 static void connect_traces (int, struct trace *);
160 static bool copy_bb_p (basic_block, int);
161 static int get_uncond_jump_length (void);
162 static bool push_to_next_round_p (basic_block, int, int, int, gcov_type);
163 static void add_unlikely_executed_notes (void);
164 static void find_rarely_executed_basic_blocks_and_crossing_edges (edge *,
167 static void mark_bb_for_unlikely_executed_section (basic_block);
168 static void add_labels_and_missing_jumps (edge *, int);
169 static void add_reg_crossing_jump_notes (void);
170 static void fix_up_fall_thru_edges (void);
171 static void fix_edges_for_rarely_executed_code (edge *, int);
172 static void fix_crossing_conditional_branches (void);
173 static void fix_crossing_unconditional_branches (void);
175 /* Check to see if bb should be pushed into the next round of trace
176 collections or not. Reasons for pushing the block forward are 1).
177 If the block is cold, we are doing partitioning, and there will be
178 another round (cold partition blocks are not supposed to be
179 collected into traces until the very last round); or 2). There will
180 be another round, and the basic block is not "hot enough" for the
181 current round of trace collection. */
184 push_to_next_round_p (basic_block bb, int round, int number_of_rounds,
185 int exec_th, gcov_type count_th)
187 bool there_exists_another_round;
189 bool block_not_hot_enough;
191 there_exists_another_round = round < number_of_rounds - 1;
193 cold_block = (flag_reorder_blocks_and_partition
194 && bb->partition == COLD_PARTITION);
196 block_not_hot_enough = (bb->frequency < exec_th
197 || bb->count < count_th
198 || probably_never_executed_bb_p (bb));
200 if (there_exists_another_round
201 && (cold_block || block_not_hot_enough))
207 /* Find the traces for Software Trace Cache. Chain each trace through
208 RBI()->next. Store the number of traces to N_TRACES and description of
212 find_traces (int *n_traces, struct trace *traces)
215 int number_of_rounds;
219 /* Add one extra round of trace collection when partitioning hot/cold
220 basic blocks into separate sections. The last round is for all the
221 cold blocks (and ONLY the cold blocks). */
223 number_of_rounds = N_ROUNDS - 1;
224 if (flag_reorder_blocks_and_partition)
225 number_of_rounds = N_ROUNDS;
227 /* Insert entry points of function into heap. */
228 heap = fibheap_new ();
229 max_entry_frequency = 0;
231 for (e = ENTRY_BLOCK_PTR->succ; e; e = e->succ_next)
233 bbd[e->dest->index].heap = heap;
234 bbd[e->dest->index].node = fibheap_insert (heap, bb_to_key (e->dest),
236 if (e->dest->frequency > max_entry_frequency)
237 max_entry_frequency = e->dest->frequency;
238 if (e->dest->count > max_entry_count)
239 max_entry_count = e->dest->count;
242 /* Find the traces. */
243 for (i = 0; i < number_of_rounds; i++)
245 gcov_type count_threshold;
248 fprintf (dump_file, "STC - round %d\n", i + 1);
250 if (max_entry_count < INT_MAX / 1000)
251 count_threshold = max_entry_count * exec_threshold[i] / 1000;
253 count_threshold = max_entry_count / 1000 * exec_threshold[i];
255 find_traces_1_round (REG_BR_PROB_BASE * branch_threshold[i] / 1000,
256 max_entry_frequency * exec_threshold[i] / 1000,
257 count_threshold, traces, n_traces, i, &heap,
260 fibheap_delete (heap);
264 for (i = 0; i < *n_traces; i++)
267 fprintf (dump_file, "Trace %d (round %d): ", i + 1,
268 traces[i].round + 1);
269 for (bb = traces[i].first; bb != traces[i].last; bb = bb->rbi->next)
270 fprintf (dump_file, "%d [%d] ", bb->index, bb->frequency);
271 fprintf (dump_file, "%d [%d]\n", bb->index, bb->frequency);
277 /* Rotate loop whose back edge is BACK_EDGE in the tail of trace TRACE
278 (with sequential number TRACE_N). */
281 rotate_loop (edge back_edge, struct trace *trace, int trace_n)
285 /* Information about the best end (end after rotation) of the loop. */
286 basic_block best_bb = NULL;
287 edge best_edge = NULL;
289 gcov_type best_count = -1;
290 /* The best edge is preferred when its destination is not visited yet
291 or is a start block of some trace. */
292 bool is_preferred = false;
294 /* Find the most frequent edge that goes out from current trace. */
295 bb = back_edge->dest;
299 for (e = bb->succ; e; e = e->succ_next)
300 if (e->dest != EXIT_BLOCK_PTR
301 && e->dest->rbi->visited != trace_n
302 && (e->flags & EDGE_CAN_FALLTHRU)
303 && !(e->flags & EDGE_COMPLEX))
307 /* The best edge is preferred. */
308 if (!e->dest->rbi->visited
309 || bbd[e->dest->index].start_of_trace >= 0)
311 /* The current edge E is also preferred. */
312 int freq = EDGE_FREQUENCY (e);
313 if (freq > best_freq || e->count > best_count)
316 best_count = e->count;
324 if (!e->dest->rbi->visited
325 || bbd[e->dest->index].start_of_trace >= 0)
327 /* The current edge E is preferred. */
329 best_freq = EDGE_FREQUENCY (e);
330 best_count = e->count;
336 int freq = EDGE_FREQUENCY (e);
337 if (!best_edge || freq > best_freq || e->count > best_count)
340 best_count = e->count;
349 while (bb != back_edge->dest);
353 /* Rotate the loop so that the BEST_EDGE goes out from the last block of
355 if (back_edge->dest == trace->first)
357 trace->first = best_bb->rbi->next;
363 for (prev_bb = trace->first;
364 prev_bb->rbi->next != back_edge->dest;
365 prev_bb = prev_bb->rbi->next)
367 prev_bb->rbi->next = best_bb->rbi->next;
369 /* Try to get rid of uncond jump to cond jump. */
370 if (prev_bb->succ && !prev_bb->succ->succ_next)
372 basic_block header = prev_bb->succ->dest;
374 /* Duplicate HEADER if it is a small block containing cond jump
376 if (any_condjump_p (BB_END (header)) && copy_bb_p (header, 0))
378 copy_bb (header, prev_bb->succ, prev_bb, trace_n);
385 /* We have not found suitable loop tail so do no rotation. */
386 best_bb = back_edge->src;
388 best_bb->rbi->next = NULL;
392 /* This function marks BB that it was visited in trace number TRACE. */
395 mark_bb_visited (basic_block bb, int trace)
397 bb->rbi->visited = trace;
398 if (bbd[bb->index].heap)
400 fibheap_delete_node (bbd[bb->index].heap, bbd[bb->index].node);
401 bbd[bb->index].heap = NULL;
402 bbd[bb->index].node = NULL;
406 /* One round of finding traces. Find traces for BRANCH_TH and EXEC_TH i.e. do
407 not include basic blocks their probability is lower than BRANCH_TH or their
408 frequency is lower than EXEC_TH into traces (or count is lower than
409 COUNT_TH). It stores the new traces into TRACES and modifies the number of
410 traces *N_TRACES. Sets the round (which the trace belongs to) to ROUND. It
411 expects that starting basic blocks are in *HEAP and at the end it deletes
412 *HEAP and stores starting points for the next round into new *HEAP. */
415 find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
416 struct trace *traces, int *n_traces, int round,
417 fibheap_t *heap, int number_of_rounds)
419 /* The following variable refers to the last round in which non-"cold"
420 blocks may be collected into a trace. */
422 int last_round = N_ROUNDS - 1;
424 /* Heap for discarded basic blocks which are possible starting points for
426 fibheap_t new_heap = fibheap_new ();
428 while (!fibheap_empty (*heap))
435 bb = fibheap_extract_min (*heap);
436 bbd[bb->index].heap = NULL;
437 bbd[bb->index].node = NULL;
440 fprintf (dump_file, "Getting bb %d\n", bb->index);
442 /* If the BB's frequency is too low send BB to the next round. When
443 partitioning hot/cold blocks into separate sections, make sure all
444 the cold blocks (and ONLY the cold blocks) go into the (extra) final
447 if (push_to_next_round_p (bb, round, number_of_rounds, exec_th,
450 int key = bb_to_key (bb);
451 bbd[bb->index].heap = new_heap;
452 bbd[bb->index].node = fibheap_insert (new_heap, key, bb);
456 " Possible start point of next round: %d (key: %d)\n",
461 trace = traces + *n_traces;
463 trace->round = round;
471 /* The probability and frequency of the best edge. */
472 int best_prob = INT_MIN / 2;
473 int best_freq = INT_MIN / 2;
476 mark_bb_visited (bb, *n_traces);
480 fprintf (dump_file, "Basic block %d was visited in trace %d\n",
481 bb->index, *n_traces - 1);
483 /* Select the successor that will be placed after BB. */
484 for (e = bb->succ; e; e = e->succ_next)
486 #ifdef ENABLE_CHECKING
487 if (e->flags & EDGE_FAKE)
491 if (e->dest == EXIT_BLOCK_PTR)
494 if (e->dest->rbi->visited
495 && e->dest->rbi->visited != *n_traces)
498 if (e->dest->partition == COLD_PARTITION
499 && round < last_round)
502 prob = e->probability;
503 freq = EDGE_FREQUENCY (e);
505 /* Edge that cannot be fallthru or improbable or infrequent
506 successor (ie. it is unsuitable successor). */
507 if (!(e->flags & EDGE_CAN_FALLTHRU) || (e->flags & EDGE_COMPLEX)
508 || prob < branch_th || freq < exec_th || e->count < count_th)
511 /* If partitioning hot/cold basic blocks, don't consider edges
512 that cross section boundaries. */
514 if (better_edge_p (bb, e, prob, freq, best_prob, best_freq,
523 /* If the best destination has multiple predecessors, and can be
524 duplicated cheaper than a jump, don't allow it to be added
525 to a trace. We'll duplicate it when connecting traces. */
526 if (best_edge && best_edge->dest->pred->pred_next
527 && copy_bb_p (best_edge->dest, 0))
530 /* Add all non-selected successors to the heaps. */
531 for (e = bb->succ; e; e = e->succ_next)
534 || e->dest == EXIT_BLOCK_PTR
535 || e->dest->rbi->visited)
538 key = bb_to_key (e->dest);
540 if (bbd[e->dest->index].heap)
542 /* E->DEST is already in some heap. */
543 if (key != bbd[e->dest->index].node->key)
548 "Changing key for bb %d from %ld to %ld.\n",
550 (long) bbd[e->dest->index].node->key,
553 fibheap_replace_key (bbd[e->dest->index].heap,
554 bbd[e->dest->index].node, key);
559 fibheap_t which_heap = *heap;
561 prob = e->probability;
562 freq = EDGE_FREQUENCY (e);
564 if (!(e->flags & EDGE_CAN_FALLTHRU)
565 || (e->flags & EDGE_COMPLEX)
566 || prob < branch_th || freq < exec_th
567 || e->count < count_th)
569 /* When partitioning hot/cold basic blocks, make sure
570 the cold blocks (and only the cold blocks) all get
571 pushed to the last round of trace collection. */
573 if (push_to_next_round_p (e->dest, round,
576 which_heap = new_heap;
579 bbd[e->dest->index].heap = which_heap;
580 bbd[e->dest->index].node = fibheap_insert (which_heap,
586 " Possible start of %s round: %d (key: %ld)\n",
587 (which_heap == new_heap) ? "next" : "this",
588 e->dest->index, (long) key);
594 if (best_edge) /* Suitable successor was found. */
596 if (best_edge->dest->rbi->visited == *n_traces)
598 /* We do nothing with one basic block loops. */
599 if (best_edge->dest != bb)
601 if (EDGE_FREQUENCY (best_edge)
602 > 4 * best_edge->dest->frequency / 5)
604 /* The loop has at least 4 iterations. If the loop
605 header is not the first block of the function
606 we can rotate the loop. */
608 if (best_edge->dest != ENTRY_BLOCK_PTR->next_bb)
613 "Rotating loop %d - %d\n",
614 best_edge->dest->index, bb->index);
616 bb->rbi->next = best_edge->dest;
617 bb = rotate_loop (best_edge, trace, *n_traces);
622 /* The loop has less than 4 iterations. */
624 /* Check whether there is another edge from BB. */
626 for (another_edge = bb->succ;
628 another_edge = another_edge->succ_next)
629 if (another_edge != best_edge)
632 if (!another_edge && copy_bb_p (best_edge->dest,
635 bb = copy_bb (best_edge->dest, best_edge, bb,
641 /* Terminate the trace. */
646 /* Check for a situation
655 EDGE_FREQUENCY (AB) + EDGE_FREQUENCY (BC)
656 >= EDGE_FREQUENCY (AC).
657 (i.e. 2 * B->frequency >= EDGE_FREQUENCY (AC) )
658 Best ordering is then A B C.
660 This situation is created for example by:
667 for (e = bb->succ; e; e = e->succ_next)
669 && (e->flags & EDGE_CAN_FALLTHRU)
670 && !(e->flags & EDGE_COMPLEX)
671 && !e->dest->rbi->visited
672 && !e->dest->pred->pred_next
675 && (e->dest->succ->flags & EDGE_CAN_FALLTHRU)
676 && !(e->dest->succ->flags & EDGE_COMPLEX)
677 && !e->dest->succ->succ_next
678 && e->dest->succ->dest == best_edge->dest
679 && 2 * e->dest->frequency >= EDGE_FREQUENCY (best_edge))
683 fprintf (dump_file, "Selecting BB %d\n",
684 best_edge->dest->index);
688 bb->rbi->next = best_edge->dest;
689 bb = best_edge->dest;
695 bbd[trace->first->index].start_of_trace = *n_traces - 1;
696 bbd[trace->last->index].end_of_trace = *n_traces - 1;
698 /* The trace is terminated so we have to recount the keys in heap
699 (some block can have a lower key because now one of its predecessors
700 is an end of the trace). */
701 for (e = bb->succ; e; e = e->succ_next)
703 if (e->dest == EXIT_BLOCK_PTR
704 || e->dest->rbi->visited)
707 if (bbd[e->dest->index].heap)
709 key = bb_to_key (e->dest);
710 if (key != bbd[e->dest->index].node->key)
715 "Changing key for bb %d from %ld to %ld.\n",
717 (long) bbd[e->dest->index].node->key, key);
719 fibheap_replace_key (bbd[e->dest->index].heap,
720 bbd[e->dest->index].node,
727 fibheap_delete (*heap);
729 /* "Return" the new heap. */
733 /* Create a duplicate of the basic block OLD_BB and redirect edge E to it, add
734 it to trace after BB, mark OLD_BB visited and update pass' data structures
735 (TRACE is a number of trace which OLD_BB is duplicated to). */
738 copy_bb (basic_block old_bb, edge e, basic_block bb, int trace)
742 new_bb = cfg_layout_duplicate_bb (old_bb, e);
743 if (e->dest != new_bb)
745 if (e->dest->rbi->visited)
749 "Duplicated bb %d (created bb %d)\n",
750 old_bb->index, new_bb->index);
751 new_bb->rbi->visited = trace;
752 new_bb->rbi->next = bb->rbi->next;
753 bb->rbi->next = new_bb;
755 if (new_bb->index >= array_size || last_basic_block > array_size)
760 new_size = MAX (last_basic_block, new_bb->index + 1);
761 new_size = GET_ARRAY_SIZE (new_size);
762 bbd = xrealloc (bbd, new_size * sizeof (bbro_basic_block_data));
763 for (i = array_size; i < new_size; i++)
765 bbd[i].start_of_trace = -1;
766 bbd[i].end_of_trace = -1;
770 array_size = new_size;
775 "Growing the dynamic array to %d elements.\n",
783 /* Compute and return the key (for the heap) of the basic block BB. */
786 bb_to_key (basic_block bb)
792 /* Do not start in probably never executed blocks. */
794 if (bb->partition == COLD_PARTITION || probably_never_executed_bb_p (bb))
797 /* Prefer blocks whose predecessor is an end of some trace
798 or whose predecessor edge is EDGE_DFS_BACK. */
799 for (e = bb->pred; e; e = e->pred_next)
801 if ((e->src != ENTRY_BLOCK_PTR && bbd[e->src->index].end_of_trace >= 0)
802 || (e->flags & EDGE_DFS_BACK))
804 int edge_freq = EDGE_FREQUENCY (e);
806 if (edge_freq > priority)
807 priority = edge_freq;
812 /* The block with priority should have significantly lower key. */
813 return -(100 * BB_FREQ_MAX + 100 * priority + bb->frequency);
814 return -bb->frequency;
817 /* Return true when the edge E from basic block BB is better than the temporary
818 best edge (details are in function). The probability of edge E is PROB. The
819 frequency of the successor is FREQ. The current best probability is
820 BEST_PROB, the best frequency is BEST_FREQ.
821 The edge is considered to be equivalent when PROB does not differ much from
822 BEST_PROB; similarly for frequency. */
825 better_edge_p (basic_block bb, edge e, int prob, int freq, int best_prob,
826 int best_freq, edge cur_best_edge)
830 /* The BEST_* values do not have to be best, but can be a bit smaller than
832 int diff_prob = best_prob / 10;
833 int diff_freq = best_freq / 10;
835 if (prob > best_prob + diff_prob)
836 /* The edge has higher probability than the temporary best edge. */
837 is_better_edge = true;
838 else if (prob < best_prob - diff_prob)
839 /* The edge has lower probability than the temporary best edge. */
840 is_better_edge = false;
841 else if (freq < best_freq - diff_freq)
842 /* The edge and the temporary best edge have almost equivalent
843 probabilities. The higher frequency of a successor now means
844 that there is another edge going into that successor.
845 This successor has lower frequency so it is better. */
846 is_better_edge = true;
847 else if (freq > best_freq + diff_freq)
848 /* This successor has higher frequency so it is worse. */
849 is_better_edge = false;
850 else if (e->dest->prev_bb == bb)
851 /* The edges have equivalent probabilities and the successors
852 have equivalent frequencies. Select the previous successor. */
853 is_better_edge = true;
855 is_better_edge = false;
857 /* If we are doing hot/cold partitioning, make sure that we always favor
858 non-crossing edges over crossing edges. */
861 && flag_reorder_blocks_and_partition
863 && cur_best_edge->crossing_edge
864 && !e->crossing_edge)
865 is_better_edge = true;
867 return is_better_edge;
870 /* Connect traces in array TRACES, N_TRACES is the count of traces. */
873 connect_traces (int n_traces, struct trace *traces)
876 int unconnected_hot_trace_count = 0;
877 bool cold_connected = true;
882 gcov_type count_threshold;
884 freq_threshold = max_entry_frequency * DUPLICATION_THRESHOLD / 1000;
885 if (max_entry_count < INT_MAX / 1000)
886 count_threshold = max_entry_count * DUPLICATION_THRESHOLD / 1000;
888 count_threshold = max_entry_count / 1000 * DUPLICATION_THRESHOLD;
890 connected = xcalloc (n_traces, sizeof (bool));
893 /* If we are partitioning hot/cold basic blocks, mark the cold
894 traces as already connnected, to remove them from consideration
895 for connection to the hot traces. After the hot traces have all
896 been connected (determined by "unconnected_hot_trace_count"), we
897 will go back and connect the cold traces. */
899 cold_traces = xcalloc (n_traces, sizeof (bool));
901 if (flag_reorder_blocks_and_partition)
902 for (i = 0; i < n_traces; i++)
904 if (traces[i].first->partition == COLD_PARTITION)
907 cold_traces[i] = true;
908 cold_connected = false;
911 unconnected_hot_trace_count++;
914 for (i = 0; i < n_traces || !cold_connected ; i++)
921 /* If we are partitioning hot/cold basic blocks, check to see
922 if all the hot traces have been connected. If so, go back
923 and mark the cold traces as unconnected so we can connect
924 them up too. Re-set "i" to the first (unconnected) cold
925 trace. Use flag "cold_connected" to make sure we don't do
926 this step more than once. */
928 if (flag_reorder_blocks_and_partition
929 && (i >= n_traces || unconnected_hot_trace_count <= 0)
933 int first_cold_trace = -1;
935 for (j = 0; j < n_traces; j++)
938 connected[j] = false;
939 if (first_cold_trace == -1)
940 first_cold_trace = j;
942 i = t = first_cold_trace;
943 cold_connected = true;
950 if (unconnected_hot_trace_count > 0)
951 unconnected_hot_trace_count--;
953 /* Find the predecessor traces. */
954 for (t2 = t; t2 > 0;)
958 for (e = traces[t2].first->pred; e; e = e->pred_next)
960 int si = e->src->index;
962 if (e->src != ENTRY_BLOCK_PTR
963 && (e->flags & EDGE_CAN_FALLTHRU)
964 && !(e->flags & EDGE_COMPLEX)
965 && bbd[si].end_of_trace >= 0
966 && !connected[bbd[si].end_of_trace]
968 || e->probability > best->probability
969 || (e->probability == best->probability
970 && traces[bbd[si].end_of_trace].length > best_len)))
973 best_len = traces[bbd[si].end_of_trace].length;
978 best->src->rbi->next = best->dest;
979 t2 = bbd[best->src->index].end_of_trace;
980 connected[t2] = true;
982 if (unconnected_hot_trace_count > 0)
983 unconnected_hot_trace_count--;
987 fprintf (dump_file, "Connection: %d %d\n",
988 best->src->index, best->dest->index);
996 traces[last_trace].last->rbi->next = traces[t2].first;
999 /* Find the successor traces. */
1002 /* Find the continuation of the chain. */
1005 for (e = traces[t].last->succ; e; e = e->succ_next)
1007 int di = e->dest->index;
1009 if (e->dest != EXIT_BLOCK_PTR
1010 && (e->flags & EDGE_CAN_FALLTHRU)
1011 && !(e->flags & EDGE_COMPLEX)
1012 && bbd[di].start_of_trace >= 0
1013 && !connected[bbd[di].start_of_trace]
1015 || e->probability > best->probability
1016 || (e->probability == best->probability
1017 && traces[bbd[di].start_of_trace].length > best_len)))
1020 best_len = traces[bbd[di].start_of_trace].length;
1028 fprintf (dump_file, "Connection: %d %d\n",
1029 best->src->index, best->dest->index);
1031 t = bbd[best->dest->index].start_of_trace;
1032 traces[last_trace].last->rbi->next = traces[t].first;
1033 connected[t] = true;
1034 if (unconnected_hot_trace_count > 0)
1035 unconnected_hot_trace_count--;
1040 /* Try to connect the traces by duplication of 1 block. */
1042 basic_block next_bb = NULL;
1043 bool try_copy = false;
1045 for (e = traces[t].last->succ; e; e = e->succ_next)
1046 if (e->dest != EXIT_BLOCK_PTR
1047 && (e->flags & EDGE_CAN_FALLTHRU)
1048 && !(e->flags & EDGE_COMPLEX)
1049 && (!best || e->probability > best->probability))
1054 /* If the destination is a start of a trace which is only
1055 one block long, then no need to search the successor
1056 blocks of the trace. Accept it. */
1057 if (bbd[e->dest->index].start_of_trace >= 0
1058 && traces[bbd[e->dest->index].start_of_trace].length
1066 for (e2 = e->dest->succ; e2; e2 = e2->succ_next)
1068 int di = e2->dest->index;
1070 if (e2->dest == EXIT_BLOCK_PTR
1071 || ((e2->flags & EDGE_CAN_FALLTHRU)
1072 && !(e2->flags & EDGE_COMPLEX)
1073 && bbd[di].start_of_trace >= 0
1074 && !connected[bbd[di].start_of_trace]
1075 && (EDGE_FREQUENCY (e2) >= freq_threshold)
1076 && (e2->count >= count_threshold)
1078 || e2->probability > best2->probability
1079 || (e2->probability == best2->probability
1080 && traces[bbd[di].start_of_trace].length
1085 if (e2->dest != EXIT_BLOCK_PTR)
1086 best2_len = traces[bbd[di].start_of_trace].length;
1088 best2_len = INT_MAX;
1095 if (flag_reorder_blocks_and_partition)
1098 /* Copy tiny blocks always; copy larger blocks only when the
1099 edge is traversed frequently enough. */
1101 && copy_bb_p (best->dest,
1103 && EDGE_FREQUENCY (best) >= freq_threshold
1104 && best->count >= count_threshold))
1110 fprintf (dump_file, "Connection: %d %d ",
1111 traces[t].last->index, best->dest->index);
1113 fputc ('\n', dump_file);
1114 else if (next_bb == EXIT_BLOCK_PTR)
1115 fprintf (dump_file, "exit\n");
1117 fprintf (dump_file, "%d\n", next_bb->index);
1120 new_bb = copy_bb (best->dest, best, traces[t].last, t);
1121 traces[t].last = new_bb;
1122 if (next_bb && next_bb != EXIT_BLOCK_PTR)
1124 t = bbd[next_bb->index].start_of_trace;
1125 traces[last_trace].last->rbi->next = traces[t].first;
1126 connected[t] = true;
1127 if (unconnected_hot_trace_count > 0)
1128 unconnected_hot_trace_count--;
1132 break; /* Stop finding the successor traces. */
1135 break; /* Stop finding the successor traces. */
1144 fprintf (dump_file, "Final order:\n");
1145 for (bb = traces[0].first; bb; bb = bb->rbi->next)
1146 fprintf (dump_file, "%d ", bb->index);
1147 fprintf (dump_file, "\n");
1154 /* Return true when BB can and should be copied. CODE_MAY_GROW is true
1155 when code size is allowed to grow by duplication. */
1158 copy_bb_p (basic_block bb, int code_may_grow)
1161 int max_size = uncond_jump_length;
1168 if (!bb->pred || !bb->pred->pred_next)
1170 if (!cfg_layout_can_duplicate_bb_p (bb))
1173 /* Avoid duplicating blocks which have many successors (PR/13430). */
1175 for (e = bb->succ; e; e = e->succ_next)
1182 if (code_may_grow && maybe_hot_bb_p (bb))
1185 for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
1186 insn = NEXT_INSN (insn))
1189 size += get_attr_length (insn);
1192 if (size <= max_size)
1198 "Block %d can't be copied because its size = %d.\n",
1205 /* Return the length of unconditional jump instruction. */
1208 get_uncond_jump_length (void)
1213 label = emit_label_before (gen_label_rtx (), get_insns ());
1214 jump = emit_jump_insn (gen_jump (label));
1216 length = get_attr_length (jump);
1219 delete_insn (label);
1224 add_unlikely_executed_notes (void)
1229 if (bb->partition == COLD_PARTITION)
1230 mark_bb_for_unlikely_executed_section (bb);
1233 /* Find the basic blocks that are rarely executed and need to be moved to
1234 a separate section of the .o file (to cut down on paging and improve
1238 find_rarely_executed_basic_blocks_and_crossing_edges (edge *crossing_edges,
1239 int *n_crossing_edges,
1246 /* Mark which partition (hot/cold) each basic block belongs in. */
1250 if (probably_never_executed_bb_p (bb))
1251 bb->partition = COLD_PARTITION;
1253 bb->partition = HOT_PARTITION;
1256 /* Mark every edge that crosses between sections. */
1260 for (e = bb->succ; e; e = e->succ_next)
1262 if (e->src != ENTRY_BLOCK_PTR
1263 && e->dest != EXIT_BLOCK_PTR
1264 && e->src->partition != e->dest->partition)
1266 e->crossing_edge = true;
1270 crossing_edges = xrealloc (crossing_edges,
1271 (*max_idx) * sizeof (edge));
1273 crossing_edges[i++] = e;
1276 e->crossing_edge = false;
1279 *n_crossing_edges = i;
1282 /* Add NOTE_INSN_UNLIKELY_EXECUTED_CODE to top of basic block. This note
1283 is later used to mark the basic block to be put in the
1284 unlikely-to-be-executed section of the .o file. */
1287 mark_bb_for_unlikely_executed_section (basic_block bb)
1290 rtx insert_insn = NULL;
1293 /* Find first non-note instruction and insert new NOTE before it (as
1294 long as new NOTE is not first instruction in basic block). */
1296 for (cur_insn = BB_HEAD (bb); cur_insn != NEXT_INSN (BB_END (bb));
1297 cur_insn = NEXT_INSN (cur_insn))
1298 if (GET_CODE (cur_insn) != NOTE
1299 && GET_CODE (cur_insn) != CODE_LABEL)
1301 insert_insn = cur_insn;
1305 /* Insert note and assign basic block number to it. */
1309 new_note = emit_note_before (NOTE_INSN_UNLIKELY_EXECUTED_CODE,
1311 NOTE_BASIC_BLOCK (new_note) = bb;
1315 new_note = emit_note_after (NOTE_INSN_UNLIKELY_EXECUTED_CODE,
1317 NOTE_BASIC_BLOCK (new_note) = bb;
1321 /* If any destination of a crossing edge does not have a label, add label;
1322 Convert any fall-through crossing edges (for blocks that do not contain
1323 a jump) to unconditional jumps. */
1326 add_labels_and_missing_jumps (edge *crossing_edges, int n_crossing_edges)
1335 for (i=0; i < n_crossing_edges; i++)
1337 if (crossing_edges[i])
1339 src = crossing_edges[i]->src;
1340 dest = crossing_edges[i]->dest;
1342 /* Make sure dest has a label. */
1344 if (dest && (dest != EXIT_BLOCK_PTR))
1346 label = block_label (dest);
1348 /* Make sure source block ends with a jump. */
1350 if (src && (src != ENTRY_BLOCK_PTR))
1352 if (GET_CODE (BB_END (src)) != JUMP_INSN)
1353 /* bb just falls through. */
1355 /* make sure there's only one successor */
1356 if (src->succ && (src->succ->succ_next == NULL))
1358 /* Find label in dest block. */
1359 label = block_label (dest);
1361 new_jump = emit_jump_insn_after (gen_jump (label),
1363 barrier = emit_barrier_after (new_jump);
1364 JUMP_LABEL (new_jump) = label;
1365 LABEL_NUSES (label) += 1;
1366 src->rbi->footer = unlink_insn_chain (barrier,
1368 /* Mark edge as non-fallthru. */
1369 crossing_edges[i]->flags &= ~EDGE_FALLTHRU;
1373 /* Basic block has two successors, but
1374 doesn't end in a jump; something is wrong
1378 } /* end: 'if (GET_CODE ... ' */
1379 } /* end: 'if (src && src->index...' */
1380 } /* end: 'if (dest && dest->index...' */
1381 } /* end: 'if (crossing_edges[i]...' */
1382 } /* end for loop */
1385 /* Find any bb's where the fall-through edge is a crossing edge (note that
1386 these bb's must also contain a conditional jump; we've already
1387 dealt with fall-through edges for blocks that didn't have a
1388 conditional jump in the call to add_labels_and_missing_jumps).
1389 Convert the fall-through edge to non-crossing edge by inserting a
1390 new bb to fall-through into. The new bb will contain an
1391 unconditional jump (crossing edge) to the original fall through
1395 fix_up_fall_thru_edges (void)
1404 bool cond_jump_crosses;
1407 rtx fall_thru_label;
1410 FOR_EACH_BB (cur_bb)
1413 succ1 = cur_bb->succ;
1415 succ2 = succ1->succ_next;
1419 /* Find the fall-through edge. */
1422 && (succ1->flags & EDGE_FALLTHRU))
1428 && (succ2->flags & EDGE_FALLTHRU))
1434 if (fall_thru && (fall_thru->dest != EXIT_BLOCK_PTR))
1436 /* Check to see if the fall-thru edge is a crossing edge. */
1438 if (fall_thru->crossing_edge)
1440 /* The fall_thru edge crosses; now check the cond jump edge, if
1443 cond_jump_crosses = true;
1445 old_jump = BB_END (cur_bb);
1447 /* Find the jump instruction, if there is one. */
1451 if (!cond_jump->crossing_edge)
1452 cond_jump_crosses = false;
1454 /* We know the fall-thru edge crosses; if the cond
1455 jump edge does NOT cross, and its destination is the
1456 next block in the bb order, invert the jump
1457 (i.e. fix it so the fall thru does not cross and
1458 the cond jump does). */
1460 if (!cond_jump_crosses
1461 && cur_bb->rbi->next == cond_jump->dest)
1463 /* Find label in fall_thru block. We've already added
1464 any missing labels, so there must be one. */
1466 fall_thru_label = block_label (fall_thru->dest);
1468 if (old_jump && fall_thru_label)
1469 invert_worked = invert_jump (old_jump,
1473 fall_thru->flags &= ~EDGE_FALLTHRU;
1474 cond_jump->flags |= EDGE_FALLTHRU;
1475 update_br_prob_note (cur_bb);
1477 fall_thru = cond_jump;
1479 cond_jump->crossing_edge = true;
1480 fall_thru->crossing_edge = false;
1485 if (cond_jump_crosses || !invert_worked)
1487 /* This is the case where both edges out of the basic
1488 block are crossing edges. Here we will fix up the
1489 fall through edge. The jump edge will be taken care
1492 new_bb = force_nonfallthru (fall_thru);
1496 new_bb->rbi->next = cur_bb->rbi->next;
1497 cur_bb->rbi->next = new_bb;
1499 /* Make sure new fall-through bb is in same
1500 partition as bb it's falling through from. */
1502 new_bb->partition = cur_bb->partition;
1503 new_bb->succ->crossing_edge = true;
1506 /* Add barrier after new jump */
1510 barrier = emit_barrier_after (BB_END (new_bb));
1511 new_bb->rbi->footer = unlink_insn_chain (barrier,
1516 barrier = emit_barrier_after (BB_END (cur_bb));
1517 cur_bb->rbi->footer = unlink_insn_chain (barrier,
1526 /* This function checks the destination blockof a "crossing jump" to
1527 see if it has any crossing predecessors that begin with a code label
1528 and end with an unconditional jump. If so, it returns that predecessor
1529 block. (This is to avoid creating lots of new basic blocks that all
1530 contain unconditional jumps to the same destination). */
1533 find_jump_block (basic_block jump_dest)
1535 basic_block source_bb = NULL;
1539 for (e = jump_dest->pred; e; e = e->pred_next)
1540 if (e->crossing_edge)
1542 basic_block src = e->src;
1544 /* Check each predecessor to see if it has a label, and contains
1545 only one executable instruction, which is an unconditional jump.
1546 If so, we can use it. */
1548 if (GET_CODE (BB_HEAD (src)) == CODE_LABEL)
1549 for (insn = BB_HEAD (src);
1550 !INSN_P (insn) && insn != NEXT_INSN (BB_END (src));
1551 insn = NEXT_INSN (insn))
1554 && insn == BB_END (src)
1555 && GET_CODE (insn) == JUMP_INSN
1556 && !any_condjump_p (insn))
1570 /* Find all BB's with conditional jumps that are crossing edges;
1571 insert a new bb and make the conditional jump branch to the new
1572 bb instead (make the new bb same color so conditional branch won't
1573 be a 'crossing' edge). Insert an unconditional jump from the
1574 new bb to the original destination of the conditional jump. */
1577 fix_crossing_conditional_branches (void)
1581 basic_block last_bb;
1583 basic_block prev_bb;
1590 rtx old_label = NULL_RTX;
1595 last_bb = EXIT_BLOCK_PTR->prev_bb;
1597 FOR_EACH_BB (cur_bb)
1599 crossing_edge = NULL;
1600 succ1 = cur_bb->succ;
1602 succ2 = succ1->succ_next;
1606 /* We already took care of fall-through edges, so only one successor
1607 can be a crossing edge. */
1609 if (succ1 && succ1->crossing_edge)
1610 crossing_edge = succ1;
1611 else if (succ2 && succ2->crossing_edge)
1612 crossing_edge = succ2;
1616 old_jump = BB_END (cur_bb);
1618 /* Check to make sure the jump instruction is a
1619 conditional jump. */
1623 if (any_condjump_p (old_jump))
1625 if (GET_CODE (PATTERN (old_jump)) == SET)
1626 set_src = SET_SRC (PATTERN (old_jump));
1627 else if (GET_CODE (PATTERN (old_jump)) == PARALLEL)
1629 set_src = XVECEXP (PATTERN (old_jump), 0,0);
1630 if (GET_CODE (set_src) == SET)
1631 set_src = SET_SRC (set_src);
1637 if (set_src && (GET_CODE (set_src) == IF_THEN_ELSE))
1639 if (GET_CODE (XEXP (set_src, 1)) == PC)
1640 old_label = XEXP (set_src, 2);
1641 else if (GET_CODE (XEXP (set_src, 2)) == PC)
1642 old_label = XEXP (set_src, 1);
1644 /* Check to see if new bb for jumping to that dest has
1645 already been created; if so, use it; if not, create
1648 new_bb = find_jump_block (crossing_edge->dest);
1651 new_label = block_label (new_bb);
1654 /* Create new basic block to be dest for
1655 conditional jump. */
1657 new_bb = create_basic_block (NULL, NULL, last_bb);
1658 new_bb->rbi->next = last_bb->rbi->next;
1659 last_bb->rbi->next = new_bb;
1663 /* Update register liveness information. */
1665 new_bb->global_live_at_start =
1666 OBSTACK_ALLOC_REG_SET (&flow_obstack);
1667 new_bb->global_live_at_end =
1668 OBSTACK_ALLOC_REG_SET (&flow_obstack);
1669 COPY_REG_SET (new_bb->global_live_at_end,
1670 prev_bb->global_live_at_end);
1671 COPY_REG_SET (new_bb->global_live_at_start,
1672 prev_bb->global_live_at_end);
1674 /* Put appropriate instructions in new bb. */
1676 new_label = gen_label_rtx ();
1677 emit_label_before (new_label, BB_HEAD (new_bb));
1678 BB_HEAD (new_bb) = new_label;
1680 if (GET_CODE (old_label) == LABEL_REF)
1682 old_label = JUMP_LABEL (old_jump);
1683 new_jump = emit_jump_insn_after (gen_jump
1688 else if (GET_CODE (old_label) == RETURN)
1689 new_jump = emit_jump_insn_after (gen_return (),
1695 barrier = emit_barrier_after (new_jump);
1696 JUMP_LABEL (new_jump) = old_label;
1697 new_bb->rbi->footer = unlink_insn_chain (barrier,
1700 /* Make sure new bb is in same partition as source
1701 of conditional branch. */
1703 new_bb->partition = cur_bb->partition;
1706 /* Make old jump branch to new bb. */
1708 redirect_jump (old_jump, new_label, 0);
1710 /* Remove crossing_edge as predecessor of 'dest'. */
1712 dest = crossing_edge->dest;
1714 redirect_edge_succ (crossing_edge, new_bb);
1716 /* Make a new edge from new_bb to old dest; new edge
1717 will be a successor for new_bb and a predecessor
1721 new_edge = make_edge (new_bb, dest, 0);
1723 new_edge = new_bb->succ;
1725 crossing_edge->crossing_edge = false;
1726 new_edge->crossing_edge = true;
1732 /* Find any unconditional branches that cross between hot and cold
1733 sections. Convert them into indirect jumps instead. */
1736 fix_crossing_unconditional_branches (void)
1742 rtx indirect_jump_sequence;
1743 rtx jump_insn = NULL_RTX;
1748 FOR_EACH_BB (cur_bb)
1750 last_insn = BB_END (cur_bb);
1751 succ = cur_bb->succ;
1753 /* Check to see if bb ends in a crossing (unconditional) jump. At
1754 this point, no crossing jumps should be conditional. */
1756 if (GET_CODE (last_insn) == JUMP_INSN
1757 && succ->crossing_edge)
1761 if (any_condjump_p (last_insn))
1764 /* Make sure the jump is not already an indirect or table jump. */
1766 else if (!computed_jump_p (last_insn)
1767 && !tablejump_p (last_insn, &label2, &table))
1769 /* We have found a "crossing" unconditional branch. Now
1770 we must convert it to an indirect jump. First create
1771 reference of label, as target for jump. */
1773 label = JUMP_LABEL (last_insn);
1774 label_addr = gen_rtx_LABEL_REF (VOIDmode, label);
1775 LABEL_NUSES (label) += 1;
1777 /* Get a register to use for the indirect jump. */
1779 new_reg = gen_reg_rtx (Pmode);
1781 /* Generate indirect the jump sequence. */
1784 emit_move_insn (new_reg, label_addr);
1785 emit_indirect_jump (new_reg);
1786 indirect_jump_sequence = get_insns ();
1789 /* Make sure every instruction in the new jump sequence has
1790 its basic block set to be cur_bb. */
1792 for (cur_insn = indirect_jump_sequence; cur_insn;
1793 cur_insn = NEXT_INSN (cur_insn))
1795 BLOCK_FOR_INSN (cur_insn) = cur_bb;
1796 if (GET_CODE (cur_insn) == JUMP_INSN)
1797 jump_insn = cur_insn;
1800 /* Insert the new (indirect) jump sequence immediately before
1801 the unconditional jump, then delete the unconditional jump. */
1803 emit_insn_before (indirect_jump_sequence, last_insn);
1804 delete_insn (last_insn);
1806 /* Make BB_END for cur_bb be the jump instruction (NOT the
1807 barrier instruction at the end of the sequence...). */
1809 BB_END (cur_bb) = jump_insn;
1815 /* Add REG_CROSSING_JUMP note to all crossing jump insns. */
1818 add_reg_crossing_jump_notes (void)
1824 for (e = bb->succ; e; e = e->succ_next)
1825 if (e->crossing_edge
1826 && GET_CODE (BB_END (e->src)) == JUMP_INSN)
1827 REG_NOTES (BB_END (e->src)) = gen_rtx_EXPR_LIST (REG_CROSSING_JUMP,
1833 /* Basic blocks containing NOTE_INSN_UNLIKELY_EXECUTED_CODE will be
1834 put in a separate section of the .o file, to reduce paging and
1835 improve cache performance (hopefully). This can result in bits of
1836 code from the same function being widely separated in the .o file.
1837 However this is not obvious to the current bb structure. Therefore
1838 we must take care to ensure that: 1). There are no fall_thru edges
1839 that cross between sections; 2). For those architectures which
1840 have "short" conditional branches, all conditional branches that
1841 attempt to cross between sections are converted to unconditional
1842 branches; and, 3). For those architectures which have "short"
1843 unconditional branches, all unconditional branches that attempt
1844 to cross between sections are converted to indirect jumps.
1846 The code for fixing up fall_thru edges that cross between hot and
1847 cold basic blocks does so by creating new basic blocks containing
1848 unconditional branches to the appropriate label in the "other"
1849 section. The new basic block is then put in the same (hot or cold)
1850 section as the original conditional branch, and the fall_thru edge
1851 is modified to fall into the new basic block instead. By adding
1852 this level of indirection we end up with only unconditional branches
1853 crossing between hot and cold sections.
1855 Conditional branches are dealt with by adding a level of indirection.
1856 A new basic block is added in the same (hot/cold) section as the
1857 conditional branch, and the conditional branch is retargeted to the
1858 new basic block. The new basic block contains an unconditional branch
1859 to the original target of the conditional branch (in the other section).
1861 Unconditional branches are dealt with by converting them into
1865 fix_edges_for_rarely_executed_code (edge *crossing_edges,
1866 int n_crossing_edges)
1868 /* Make sure the source of any crossing edge ends in a jump and the
1869 destination of any crossing edge has a label. */
1871 add_labels_and_missing_jumps (crossing_edges, n_crossing_edges);
1873 /* Convert all crossing fall_thru edges to non-crossing fall
1874 thrus to unconditional jumps (that jump to the original fall
1877 fix_up_fall_thru_edges ();
1879 /* If the architecture does not have conditional branches that can
1880 span all of memory, convert crossing conditional branches into
1881 crossing unconditional branches. */
1883 if (!HAS_LONG_COND_BRANCH)
1884 fix_crossing_conditional_branches ();
1886 /* If the architecture does not have unconditional branches that
1887 can span all of memory, convert crossing unconditional branches
1888 into indirect jumps. Since adding an indirect jump also adds
1889 a new register usage, update the register usage information as
1892 if (!HAS_LONG_UNCOND_BRANCH)
1894 fix_crossing_unconditional_branches ();
1895 reg_scan (get_insns(), max_reg_num (), 1);
1898 add_reg_crossing_jump_notes ();
1901 /* Reorder basic blocks. The main entry point to this file. */
1904 reorder_basic_blocks (void)
1908 struct trace *traces;
1910 if (n_basic_blocks <= 1)
1913 if (targetm.cannot_modify_jumps_p ())
1916 timevar_push (TV_REORDER_BLOCKS);
1918 cfg_layout_initialize ();
1920 set_edge_can_fallthru_flag ();
1921 mark_dfs_back_edges ();
1923 /* We are estimating the length of uncond jump insn only once since the code
1924 for getting the insn length always returns the minimal length now. */
1925 if (uncond_jump_length == 0)
1926 uncond_jump_length = get_uncond_jump_length ();
1928 /* We need to know some information for each basic block. */
1929 array_size = GET_ARRAY_SIZE (last_basic_block);
1930 bbd = xmalloc (array_size * sizeof (bbro_basic_block_data));
1931 for (i = 0; i < array_size; i++)
1933 bbd[i].start_of_trace = -1;
1934 bbd[i].end_of_trace = -1;
1939 traces = xmalloc (n_basic_blocks * sizeof (struct trace));
1941 find_traces (&n_traces, traces);
1942 connect_traces (n_traces, traces);
1947 dump_flow_info (dump_file);
1949 if (flag_reorder_blocks_and_partition)
1950 add_unlikely_executed_notes ();
1952 cfg_layout_finalize ();
1954 timevar_pop (TV_REORDER_BLOCKS);
1957 /* This function is the main 'entrance' for the optimization that
1958 partitions hot and cold basic blocks into separate sections of the
1959 .o file (to improve performance and cache locality). Ideally it
1960 would be called after all optimizations that rearrange the CFG have
1961 been called. However part of this optimization may introduce new
1962 register usage, so it must be called before register allocation has
1963 occurred. This means that this optimization is actually called
1964 well before the optimization that reorders basic blocks (see function
1967 This optimization checks the feedback information to determine
1968 which basic blocks are hot/cold and adds
1969 NOTE_INSN_UNLIKELY_EXECUTED_CODE to non-hot basic blocks. The
1970 presence or absence of this note is later used for writing out
1971 sections in the .o file. This optimization must also modify the
1972 CFG to make sure there are no fallthru edges between hot & cold
1973 blocks, as those blocks will not necessarily be contiguous in the
1974 .o (or assembly) file; and in those cases where the architecture
1975 requires it, conditional and unconditional branches that cross
1976 between sections are converted into unconditional or indirect
1977 jumps, depending on what is appropriate. */
1980 partition_hot_cold_basic_blocks (void)
1983 edge *crossing_edges;
1984 int n_crossing_edges;
1985 int max_edges = 2 * last_basic_block;
1987 if (n_basic_blocks <= 1)
1990 crossing_edges = xcalloc (max_edges, sizeof (edge));
1992 cfg_layout_initialize ();
1994 FOR_EACH_BB (cur_bb)
1995 if (cur_bb->index >= 0
1996 && cur_bb->next_bb->index >= 0)
1997 cur_bb->rbi->next = cur_bb->next_bb;
1999 find_rarely_executed_basic_blocks_and_crossing_edges (crossing_edges,
2003 if (n_crossing_edges > 0)
2004 fix_edges_for_rarely_executed_code (crossing_edges, n_crossing_edges);
2006 free (crossing_edges);
2008 cfg_layout_finalize();