OSDN Git Service

f540ab1e2b7347a8d5ad4861c85d9527e709e0e9
[pf3gnuchains/gcc-fork.git] / gcc / bb-reorder.c
1 /* Basic block reordering routines for the GNU compiler.
2    Copyright (C) 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3
4    This file is part of GCC.
5
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)
9    any later version.
10
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.
15
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.  */
20
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.
27
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.
35
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.
49
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.
58
59
60    References:
61
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
65
66 */
67
68 #include "config.h"
69 #include "system.h"
70 #include "coretypes.h"
71 #include "tm.h"
72 #include "rtl.h"
73 #include "regs.h"
74 #include "flags.h"
75 #include "timevar.h"
76 #include "output.h"
77 #include "cfglayout.h"
78 #include "fibheap.h"
79 #include "target.h"
80 #include "function.h"
81 #include "tm_p.h"
82 #include "obstack.h"
83 #include "expr.h"
84 #include "errors.h"
85 #include "params.h"
86
87 /* The number of rounds.  In most cases there will only be 4 rounds, but
88    when partitioning hot and cold basic blocks into separate sections of
89    the .o file there will be an extra round.*/
90 #define N_ROUNDS 5
91
92 /* Stubs in case we don't have a return insn.
93    We have to check at runtime too, not only compiletime.  */  
94
95 #ifndef HAVE_return
96 #define HAVE_return 0
97 #define gen_return() NULL_RTX
98 #endif
99
100
101 /* Branch thresholds in thousandths (per mille) of the REG_BR_PROB_BASE.  */
102 static int branch_threshold[N_ROUNDS] = {400, 200, 100, 0, 0};
103
104 /* Exec thresholds in thousandths (per mille) of the frequency of bb 0.  */
105 static int exec_threshold[N_ROUNDS] = {500, 200, 50, 0, 0};
106
107 /* If edge frequency is lower than DUPLICATION_THRESHOLD per mille of entry
108    block the edge destination is not duplicated while connecting traces.  */
109 #define DUPLICATION_THRESHOLD 100
110
111 /* Length of unconditional jump instruction.  */
112 static int uncond_jump_length;
113
114 /* Structure to hold needed information for each basic block.  */
115 typedef struct bbro_basic_block_data_def
116 {
117   /* Which trace is the bb start of (-1 means it is not a start of a trace).  */
118   int start_of_trace;
119
120   /* Which trace is the bb end of (-1 means it is not an end of a trace).  */
121   int end_of_trace;
122
123   /* Which trace is the bb in?  */
124   int in_trace;
125
126   /* Which heap is BB in (if any)?  */
127   fibheap_t heap;
128
129   /* Which heap node is BB in (if any)?  */
130   fibnode_t node;
131 } bbro_basic_block_data;
132
133 /* The current size of the following dynamic array.  */
134 static int array_size;
135
136 /* The array which holds needed information for basic blocks.  */
137 static bbro_basic_block_data *bbd;
138
139 /* To avoid frequent reallocation the size of arrays is greater than needed,
140    the number of elements is (not less than) 1.25 * size_wanted.  */
141 #define GET_ARRAY_SIZE(X) ((((X) / 4) + 1) * 5)
142
143 /* Free the memory and set the pointer to NULL.  */
144 #define FREE(P) (gcc_assert (P), free (P), P = 0)
145
146 /* Structure for holding information about a trace.  */
147 struct trace
148 {
149   /* First and last basic block of the trace.  */
150   basic_block first, last;
151
152   /* The round of the STC creation which this trace was found in.  */
153   int round;
154
155   /* The length (i.e. the number of basic blocks) of the trace.  */
156   int length;
157 };
158
159 /* Maximum frequency and count of one of the entry blocks.  */
160 static int max_entry_frequency;
161 static gcov_type max_entry_count;
162
163 /* Local function prototypes.  */
164 static void find_traces (int *, struct trace *);
165 static basic_block rotate_loop (edge, struct trace *, int);
166 static void mark_bb_visited (basic_block, int);
167 static void find_traces_1_round (int, int, gcov_type, struct trace *, int *,
168                                  int, fibheap_t *, int);
169 static basic_block copy_bb (basic_block, edge, basic_block, int);
170 static fibheapkey_t bb_to_key (basic_block);
171 static bool better_edge_p (basic_block, edge, int, int, int, int, edge);
172 static void connect_traces (int, struct trace *);
173 static bool copy_bb_p (basic_block, int);
174 static int get_uncond_jump_length (void);
175 static bool push_to_next_round_p (basic_block, int, int, int, gcov_type);
176 static void find_rarely_executed_basic_blocks_and_crossing_edges (edge *, 
177                                                                   int *,
178                                                                   int *);
179 static void add_labels_and_missing_jumps (edge *, int);
180 static void add_reg_crossing_jump_notes (void);
181 static void fix_up_fall_thru_edges (void);
182 static void fix_edges_for_rarely_executed_code (edge *, int);
183 static void fix_crossing_conditional_branches (void);
184 static void fix_crossing_unconditional_branches (void);
185 \f
186 /* Check to see if bb should be pushed into the next round of trace
187    collections or not.  Reasons for pushing the block forward are 1).
188    If the block is cold, we are doing partitioning, and there will be
189    another round (cold partition blocks are not supposed to be
190    collected into traces until the very last round); or 2). There will
191    be another round, and the basic block is not "hot enough" for the
192    current round of trace collection.  */
193
194 static bool
195 push_to_next_round_p (basic_block bb, int round, int number_of_rounds,
196                       int exec_th, gcov_type count_th)
197 {
198   bool there_exists_another_round;
199   bool block_not_hot_enough;
200
201   there_exists_another_round = round < number_of_rounds - 1;
202
203   block_not_hot_enough = (bb->frequency < exec_th 
204                           || bb->count < count_th
205                           || probably_never_executed_bb_p (bb));
206
207   if (there_exists_another_round
208       && block_not_hot_enough)
209     return true;
210   else 
211     return false;
212 }
213
214 /* Find the traces for Software Trace Cache.  Chain each trace through
215    RBI()->next.  Store the number of traces to N_TRACES and description of
216    traces to TRACES.  */
217
218 static void
219 find_traces (int *n_traces, struct trace *traces)
220 {
221   int i;
222   int number_of_rounds;
223   edge e;
224   edge_iterator ei;
225   fibheap_t heap;
226
227   /* Add one extra round of trace collection when partitioning hot/cold
228      basic blocks into separate sections.  The last round is for all the
229      cold blocks (and ONLY the cold blocks).  */
230
231   number_of_rounds = N_ROUNDS - 1;
232
233   /* Insert entry points of function into heap.  */
234   heap = fibheap_new ();
235   max_entry_frequency = 0;
236   max_entry_count = 0;
237   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
238     {
239       bbd[e->dest->index].heap = heap;
240       bbd[e->dest->index].node = fibheap_insert (heap, bb_to_key (e->dest),
241                                                     e->dest);
242       if (e->dest->frequency > max_entry_frequency)
243         max_entry_frequency = e->dest->frequency;
244       if (e->dest->count > max_entry_count)
245         max_entry_count = e->dest->count;
246     }
247
248   /* Find the traces.  */
249   for (i = 0; i < number_of_rounds; i++)
250     {
251       gcov_type count_threshold;
252
253       if (dump_file)
254         fprintf (dump_file, "STC - round %d\n", i + 1);
255
256       if (max_entry_count < INT_MAX / 1000)
257         count_threshold = max_entry_count * exec_threshold[i] / 1000;
258       else
259         count_threshold = max_entry_count / 1000 * exec_threshold[i];
260
261       find_traces_1_round (REG_BR_PROB_BASE * branch_threshold[i] / 1000,
262                            max_entry_frequency * exec_threshold[i] / 1000,
263                            count_threshold, traces, n_traces, i, &heap,
264                            number_of_rounds);
265     }
266   fibheap_delete (heap);
267
268   if (dump_file)
269     {
270       for (i = 0; i < *n_traces; i++)
271         {
272           basic_block bb;
273           fprintf (dump_file, "Trace %d (round %d):  ", i + 1,
274                    traces[i].round + 1);
275           for (bb = traces[i].first; bb != traces[i].last; bb = bb->rbi->next)
276             fprintf (dump_file, "%d [%d] ", bb->index, bb->frequency);
277           fprintf (dump_file, "%d [%d]\n", bb->index, bb->frequency);
278         }
279       fflush (dump_file);
280     }
281 }
282
283 /* Rotate loop whose back edge is BACK_EDGE in the tail of trace TRACE
284    (with sequential number TRACE_N).  */
285
286 static basic_block
287 rotate_loop (edge back_edge, struct trace *trace, int trace_n)
288 {
289   basic_block bb;
290
291   /* Information about the best end (end after rotation) of the loop.  */
292   basic_block best_bb = NULL;
293   edge best_edge = NULL;
294   int best_freq = -1;
295   gcov_type best_count = -1;
296   /* The best edge is preferred when its destination is not visited yet
297      or is a start block of some trace.  */
298   bool is_preferred = false;
299
300   /* Find the most frequent edge that goes out from current trace.  */
301   bb = back_edge->dest;
302   do
303     {
304       edge e;
305       edge_iterator ei;
306
307       FOR_EACH_EDGE (e, ei, bb->succs)
308         if (e->dest != EXIT_BLOCK_PTR
309             && e->dest->rbi->visited != trace_n
310             && (e->flags & EDGE_CAN_FALLTHRU)
311             && !(e->flags & EDGE_COMPLEX))
312         {
313           if (is_preferred)
314             {
315               /* The best edge is preferred.  */
316               if (!e->dest->rbi->visited
317                   || bbd[e->dest->index].start_of_trace >= 0)
318                 {
319                   /* The current edge E is also preferred.  */
320                   int freq = EDGE_FREQUENCY (e);
321                   if (freq > best_freq || e->count > best_count)
322                     {
323                       best_freq = freq;
324                       best_count = e->count;
325                       best_edge = e;
326                       best_bb = bb;
327                     }
328                 }
329             }
330           else
331             {
332               if (!e->dest->rbi->visited
333                   || bbd[e->dest->index].start_of_trace >= 0)
334                 {
335                   /* The current edge E is preferred.  */
336                   is_preferred = true;
337                   best_freq = EDGE_FREQUENCY (e);
338                   best_count = e->count;
339                   best_edge = e;
340                   best_bb = bb;
341                 }
342               else
343                 {
344                   int freq = EDGE_FREQUENCY (e);
345                   if (!best_edge || freq > best_freq || e->count > best_count)
346                     {
347                       best_freq = freq;
348                       best_count = e->count;
349                       best_edge = e;
350                       best_bb = bb;
351                     }
352                 }
353             }
354         }
355       bb = bb->rbi->next;
356     }
357   while (bb != back_edge->dest);
358
359   if (best_bb)
360     {
361       /* Rotate the loop so that the BEST_EDGE goes out from the last block of
362          the trace.  */
363       if (back_edge->dest == trace->first)
364         {
365           trace->first = best_bb->rbi->next;
366         }
367       else
368         {
369           basic_block prev_bb;
370
371           for (prev_bb = trace->first;
372                prev_bb->rbi->next != back_edge->dest;
373                prev_bb = prev_bb->rbi->next)
374             ;
375           prev_bb->rbi->next = best_bb->rbi->next;
376
377           /* Try to get rid of uncond jump to cond jump.  */
378           if (single_succ_p (prev_bb))
379             {
380               basic_block header = single_succ (prev_bb);
381
382               /* Duplicate HEADER if it is a small block containing cond jump
383                  in the end.  */
384               if (any_condjump_p (BB_END (header)) && copy_bb_p (header, 0)
385                   && !find_reg_note (BB_END (header), REG_CROSSING_JUMP, 
386                                      NULL_RTX))
387                 copy_bb (header, single_succ_edge (prev_bb), prev_bb, trace_n);
388             }
389         }
390     }
391   else
392     {
393       /* We have not found suitable loop tail so do no rotation.  */
394       best_bb = back_edge->src;
395     }
396   best_bb->rbi->next = NULL;
397   return best_bb;
398 }
399
400 /* This function marks BB that it was visited in trace number TRACE.  */
401
402 static void
403 mark_bb_visited (basic_block bb, int trace)
404 {
405   bb->rbi->visited = trace;
406   if (bbd[bb->index].heap)
407     {
408       fibheap_delete_node (bbd[bb->index].heap, bbd[bb->index].node);
409       bbd[bb->index].heap = NULL;
410       bbd[bb->index].node = NULL;
411     }
412 }
413
414 /* One round of finding traces. Find traces for BRANCH_TH and EXEC_TH i.e. do
415    not include basic blocks their probability is lower than BRANCH_TH or their
416    frequency is lower than EXEC_TH into traces (or count is lower than
417    COUNT_TH).  It stores the new traces into TRACES and modifies the number of
418    traces *N_TRACES. Sets the round (which the trace belongs to) to ROUND. It
419    expects that starting basic blocks are in *HEAP and at the end it deletes
420    *HEAP and stores starting points for the next round into new *HEAP.  */
421
422 static void
423 find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
424                      struct trace *traces, int *n_traces, int round,
425                      fibheap_t *heap, int number_of_rounds)
426 {
427   /* Heap for discarded basic blocks which are possible starting points for
428      the next round.  */
429   fibheap_t new_heap = fibheap_new ();
430
431   while (!fibheap_empty (*heap))
432     {
433       basic_block bb;
434       struct trace *trace;
435       edge best_edge, e;
436       fibheapkey_t key;
437       edge_iterator ei;
438
439       bb = fibheap_extract_min (*heap);
440       bbd[bb->index].heap = NULL;
441       bbd[bb->index].node = NULL;
442
443       if (dump_file)
444         fprintf (dump_file, "Getting bb %d\n", bb->index);
445
446       /* If the BB's frequency is too low send BB to the next round.  When
447          partitioning hot/cold blocks into separate sections, make sure all
448          the cold blocks (and ONLY the cold blocks) go into the (extra) final
449          round.  */
450
451       if (push_to_next_round_p (bb, round, number_of_rounds, exec_th, 
452                                 count_th))
453         {
454           int key = bb_to_key (bb);
455           bbd[bb->index].heap = new_heap;
456           bbd[bb->index].node = fibheap_insert (new_heap, key, bb);
457
458           if (dump_file)
459             fprintf (dump_file,
460                      "  Possible start point of next round: %d (key: %d)\n",
461                      bb->index, key);
462           continue;
463         }
464
465       trace = traces + *n_traces;
466       trace->first = bb;
467       trace->round = round;
468       trace->length = 0;
469       bbd[bb->index].in_trace = *n_traces;
470       (*n_traces)++;
471
472       do
473         {
474           int prob, freq;
475           bool ends_in_call;
476
477           /* The probability and frequency of the best edge.  */
478           int best_prob = INT_MIN / 2;
479           int best_freq = INT_MIN / 2;
480
481           best_edge = NULL;
482           mark_bb_visited (bb, *n_traces);
483           trace->length++;
484
485           if (dump_file)
486             fprintf (dump_file, "Basic block %d was visited in trace %d\n",
487                      bb->index, *n_traces - 1);
488
489           ends_in_call = block_ends_with_call_p (bb);
490
491           /* Select the successor that will be placed after BB.  */
492           FOR_EACH_EDGE (e, ei, bb->succs)
493             {
494               gcc_assert (!(e->flags & EDGE_FAKE));
495
496               if (e->dest == EXIT_BLOCK_PTR)
497                 continue;
498
499               if (e->dest->rbi->visited
500                   && e->dest->rbi->visited != *n_traces)
501                 continue;
502
503               if (BB_PARTITION (e->dest) != BB_PARTITION (bb))
504                 continue;
505
506               prob = e->probability;
507               freq = EDGE_FREQUENCY (e);
508
509               /* The only sensible preference for a call instruction is the
510                  fallthru edge.  Don't bother selecting anything else.  */
511               if (ends_in_call)
512                 {
513                   if (e->flags & EDGE_CAN_FALLTHRU)
514                     {
515                       best_edge = e;
516                       best_prob = prob;
517                       best_freq = freq;
518                     }
519                   continue;
520                 }
521
522               /* Edge that cannot be fallthru or improbable or infrequent
523                  successor (i.e. it is unsuitable successor).  */
524               if (!(e->flags & EDGE_CAN_FALLTHRU) || (e->flags & EDGE_COMPLEX)
525                   || prob < branch_th || freq < exec_th || e->count < count_th)
526                 continue;
527
528               /* If partitioning hot/cold basic blocks, don't consider edges
529                  that cross section boundaries.  */
530
531               if (better_edge_p (bb, e, prob, freq, best_prob, best_freq,
532                                  best_edge))
533                 {
534                   best_edge = e;
535                   best_prob = prob;
536                   best_freq = freq;
537                 }
538             }
539
540           /* If the best destination has multiple predecessors, and can be
541              duplicated cheaper than a jump, don't allow it to be added
542              to a trace.  We'll duplicate it when connecting traces.  */
543           if (best_edge && EDGE_COUNT (best_edge->dest->preds) >= 2
544               && copy_bb_p (best_edge->dest, 0))
545             best_edge = NULL;
546
547           /* Add all non-selected successors to the heaps.  */
548           FOR_EACH_EDGE (e, ei, bb->succs)
549             {
550               if (e == best_edge
551                   || e->dest == EXIT_BLOCK_PTR
552                   || e->dest->rbi->visited)
553                 continue;
554
555               key = bb_to_key (e->dest);
556
557               if (bbd[e->dest->index].heap)
558                 {
559                   /* E->DEST is already in some heap.  */
560                   if (key != bbd[e->dest->index].node->key)
561                     {
562                       if (dump_file)
563                         {
564                           fprintf (dump_file,
565                                    "Changing key for bb %d from %ld to %ld.\n",
566                                    e->dest->index,
567                                    (long) bbd[e->dest->index].node->key,
568                                    key);
569                         }
570                       fibheap_replace_key (bbd[e->dest->index].heap,
571                                            bbd[e->dest->index].node, key);
572                     }
573                 }
574               else
575                 {
576                   fibheap_t which_heap = *heap;
577
578                   prob = e->probability;
579                   freq = EDGE_FREQUENCY (e);
580
581                   if (!(e->flags & EDGE_CAN_FALLTHRU)
582                       || (e->flags & EDGE_COMPLEX)
583                       || prob < branch_th || freq < exec_th
584                       || e->count < count_th)
585                     {
586                       /* When partitioning hot/cold basic blocks, make sure
587                          the cold blocks (and only the cold blocks) all get
588                          pushed to the last round of trace collection.  */
589
590                       if (push_to_next_round_p (e->dest, round, 
591                                                 number_of_rounds,
592                                                 exec_th, count_th))
593                         which_heap = new_heap;
594                     }
595
596                   bbd[e->dest->index].heap = which_heap;
597                   bbd[e->dest->index].node = fibheap_insert (which_heap,
598                                                                 key, e->dest);
599
600                   if (dump_file)
601                     {
602                       fprintf (dump_file,
603                                "  Possible start of %s round: %d (key: %ld)\n",
604                                (which_heap == new_heap) ? "next" : "this",
605                                e->dest->index, (long) key);
606                     }
607
608                 }
609             }
610
611           if (best_edge) /* Suitable successor was found.  */
612             {
613               if (best_edge->dest->rbi->visited == *n_traces)
614                 {
615                   /* We do nothing with one basic block loops.  */
616                   if (best_edge->dest != bb)
617                     {
618                       if (EDGE_FREQUENCY (best_edge)
619                           > 4 * best_edge->dest->frequency / 5)
620                         {
621                           /* The loop has at least 4 iterations.  If the loop
622                              header is not the first block of the function
623                              we can rotate the loop.  */
624
625                           if (best_edge->dest != ENTRY_BLOCK_PTR->next_bb)
626                             {
627                               if (dump_file)
628                                 {
629                                   fprintf (dump_file,
630                                            "Rotating loop %d - %d\n",
631                                            best_edge->dest->index, bb->index);
632                                 }
633                               bb->rbi->next = best_edge->dest;
634                               bbd[best_edge->dest->index].in_trace = 
635                                                              (*n_traces) - 1;
636                               bb = rotate_loop (best_edge, trace, *n_traces);
637                             }
638                         }
639                       else
640                         {
641                           /* The loop has less than 4 iterations.  */
642
643                           if (single_succ_p (bb)
644                               && copy_bb_p (best_edge->dest, !optimize_size))
645                             {
646                               bb = copy_bb (best_edge->dest, best_edge, bb,
647                                             *n_traces);
648                               trace->length++;
649                             }
650                         }
651                     }
652
653                   /* Terminate the trace.  */
654                   break;
655                 }
656               else
657                 {
658                   /* Check for a situation
659
660                     A
661                    /|
662                   B |
663                    \|
664                     C
665
666                   where
667                   EDGE_FREQUENCY (AB) + EDGE_FREQUENCY (BC)
668                     >= EDGE_FREQUENCY (AC).
669                   (i.e. 2 * B->frequency >= EDGE_FREQUENCY (AC) )
670                   Best ordering is then A B C.
671
672                   This situation is created for example by:
673
674                   if (A) B;
675                   C;
676
677                   */
678
679                   FOR_EACH_EDGE (e, ei, bb->succs)
680                     if (e != best_edge
681                         && (e->flags & EDGE_CAN_FALLTHRU)
682                         && !(e->flags & EDGE_COMPLEX)
683                         && !e->dest->rbi->visited
684                         && single_pred_p (e->dest)
685                         && !(e->flags & EDGE_CROSSING)
686                         && single_succ_p (e->dest)
687                         && (single_succ_edge (e->dest)->flags
688                             & EDGE_CAN_FALLTHRU)
689                         && !(single_succ_edge (e->dest)->flags & EDGE_COMPLEX)
690                         && single_succ (e->dest) == best_edge->dest
691                         && 2 * e->dest->frequency >= EDGE_FREQUENCY (best_edge))
692                       {
693                         best_edge = e;
694                         if (dump_file)
695                           fprintf (dump_file, "Selecting BB %d\n",
696                                    best_edge->dest->index);
697                         break;
698                       }
699
700                   bb->rbi->next = best_edge->dest;
701                   bbd[best_edge->dest->index].in_trace = (*n_traces) - 1;
702                   bb = best_edge->dest;
703                 }
704             }
705         }
706       while (best_edge);
707       trace->last = bb;
708       bbd[trace->first->index].start_of_trace = *n_traces - 1;
709       bbd[trace->last->index].end_of_trace = *n_traces - 1;
710
711       /* The trace is terminated so we have to recount the keys in heap
712          (some block can have a lower key because now one of its predecessors
713          is an end of the trace).  */
714       FOR_EACH_EDGE (e, ei, bb->succs)
715         {
716           if (e->dest == EXIT_BLOCK_PTR
717               || e->dest->rbi->visited)
718             continue;
719
720           if (bbd[e->dest->index].heap)
721             {
722               key = bb_to_key (e->dest);
723               if (key != bbd[e->dest->index].node->key)
724                 {
725                   if (dump_file)
726                     {
727                       fprintf (dump_file,
728                                "Changing key for bb %d from %ld to %ld.\n",
729                                e->dest->index,
730                                (long) bbd[e->dest->index].node->key, key);
731                     }
732                   fibheap_replace_key (bbd[e->dest->index].heap,
733                                        bbd[e->dest->index].node,
734                                        key);
735                 }
736             }
737         }
738     }
739
740   fibheap_delete (*heap);
741
742   /* "Return" the new heap.  */
743   *heap = new_heap;
744 }
745
746 /* Create a duplicate of the basic block OLD_BB and redirect edge E to it, add
747    it to trace after BB, mark OLD_BB visited and update pass' data structures
748    (TRACE is a number of trace which OLD_BB is duplicated to).  */
749
750 static basic_block
751 copy_bb (basic_block old_bb, edge e, basic_block bb, int trace)
752 {
753   basic_block new_bb;
754
755   new_bb = duplicate_block (old_bb, e);
756   BB_COPY_PARTITION (new_bb, old_bb);
757
758   gcc_assert (e->dest == new_bb);
759   gcc_assert (!e->dest->rbi->visited);
760
761   if (dump_file)
762     fprintf (dump_file,
763              "Duplicated bb %d (created bb %d)\n",
764              old_bb->index, new_bb->index);
765   new_bb->rbi->visited = trace;
766   new_bb->rbi->next = bb->rbi->next;
767   bb->rbi->next = new_bb;
768
769   if (new_bb->index >= array_size || last_basic_block > array_size)
770     {
771       int i;
772       int new_size;
773
774       new_size = MAX (last_basic_block, new_bb->index + 1);
775       new_size = GET_ARRAY_SIZE (new_size);
776       bbd = xrealloc (bbd, new_size * sizeof (bbro_basic_block_data));
777       for (i = array_size; i < new_size; i++)
778         {
779           bbd[i].start_of_trace = -1;
780           bbd[i].in_trace = -1;
781           bbd[i].end_of_trace = -1;
782           bbd[i].heap = NULL;
783           bbd[i].node = NULL;
784         }
785       array_size = new_size;
786
787       if (dump_file)
788         {
789           fprintf (dump_file,
790                    "Growing the dynamic array to %d elements.\n",
791                    array_size);
792         }
793     }
794
795   bbd[new_bb->index].in_trace = trace;
796
797   return new_bb;
798 }
799
800 /* Compute and return the key (for the heap) of the basic block BB.  */
801
802 static fibheapkey_t
803 bb_to_key (basic_block bb)
804 {
805   edge e;
806   edge_iterator ei;
807   int priority = 0;
808
809   /* Do not start in probably never executed blocks.  */
810
811   if (BB_PARTITION (bb) == BB_COLD_PARTITION
812       || probably_never_executed_bb_p (bb))
813     return BB_FREQ_MAX;
814
815   /* Prefer blocks whose predecessor is an end of some trace
816      or whose predecessor edge is EDGE_DFS_BACK.  */
817   FOR_EACH_EDGE (e, ei, bb->preds)
818     {
819       if ((e->src != ENTRY_BLOCK_PTR && bbd[e->src->index].end_of_trace >= 0)
820           || (e->flags & EDGE_DFS_BACK))
821         {
822           int edge_freq = EDGE_FREQUENCY (e);
823
824           if (edge_freq > priority)
825             priority = edge_freq;
826         }
827     }
828
829   if (priority)
830     /* The block with priority should have significantly lower key.  */
831     return -(100 * BB_FREQ_MAX + 100 * priority + bb->frequency);
832   return -bb->frequency;
833 }
834
835 /* Return true when the edge E from basic block BB is better than the temporary
836    best edge (details are in function).  The probability of edge E is PROB. The
837    frequency of the successor is FREQ.  The current best probability is
838    BEST_PROB, the best frequency is BEST_FREQ.
839    The edge is considered to be equivalent when PROB does not differ much from
840    BEST_PROB; similarly for frequency.  */
841
842 static bool
843 better_edge_p (basic_block bb, edge e, int prob, int freq, int best_prob,
844                int best_freq, edge cur_best_edge)
845 {
846   bool is_better_edge;
847
848   /* The BEST_* values do not have to be best, but can be a bit smaller than
849      maximum values.  */
850   int diff_prob = best_prob / 10;
851   int diff_freq = best_freq / 10;
852
853   if (prob > best_prob + diff_prob)
854     /* The edge has higher probability than the temporary best edge.  */
855     is_better_edge = true;
856   else if (prob < best_prob - diff_prob)
857     /* The edge has lower probability than the temporary best edge.  */
858     is_better_edge = false;
859   else if (freq < best_freq - diff_freq)
860     /* The edge and the temporary best edge  have almost equivalent
861        probabilities.  The higher frequency of a successor now means
862        that there is another edge going into that successor.
863        This successor has lower frequency so it is better.  */
864     is_better_edge = true;
865   else if (freq > best_freq + diff_freq)
866     /* This successor has higher frequency so it is worse.  */
867     is_better_edge = false;
868   else if (e->dest->prev_bb == bb)
869     /* The edges have equivalent probabilities and the successors
870        have equivalent frequencies.  Select the previous successor.  */
871     is_better_edge = true;
872   else
873     is_better_edge = false;
874
875   /* If we are doing hot/cold partitioning, make sure that we always favor
876      non-crossing edges over crossing edges.  */
877
878   if (!is_better_edge
879       && flag_reorder_blocks_and_partition 
880       && cur_best_edge 
881       && (cur_best_edge->flags & EDGE_CROSSING)
882       && !(e->flags & EDGE_CROSSING))
883     is_better_edge = true;
884
885   return is_better_edge;
886 }
887
888 /* Connect traces in array TRACES, N_TRACES is the count of traces.  */
889
890 static void
891 connect_traces (int n_traces, struct trace *traces)
892 {
893   int i;
894   bool *connected;
895   bool two_passes;
896   int last_trace;
897   int current_pass;
898   int current_partition;
899   int freq_threshold;
900   gcov_type count_threshold;
901
902   freq_threshold = max_entry_frequency * DUPLICATION_THRESHOLD / 1000;
903   if (max_entry_count < INT_MAX / 1000)
904     count_threshold = max_entry_count * DUPLICATION_THRESHOLD / 1000;
905   else
906     count_threshold = max_entry_count / 1000 * DUPLICATION_THRESHOLD;
907
908   connected = xcalloc (n_traces, sizeof (bool));
909   last_trace = -1;
910   current_pass = 1;
911   current_partition = BB_PARTITION (traces[0].first);
912   two_passes = false;
913
914   if (flag_reorder_blocks_and_partition)
915     for (i = 0; i < n_traces && !two_passes; i++)
916       if (BB_PARTITION (traces[0].first) 
917           != BB_PARTITION (traces[i].first))
918         two_passes = true;
919
920   for (i = 0; i < n_traces || (two_passes && current_pass == 1) ; i++)
921     {
922       int t = i;
923       int t2;
924       edge e, best;
925       int best_len;
926
927       if (i >= n_traces)
928         {
929           if (two_passes && current_pass == 1)
930             {
931               i = 0;
932               t = i;
933               current_pass = 2;
934               if (current_partition == BB_HOT_PARTITION)
935                 current_partition = BB_COLD_PARTITION;
936               else
937                 current_partition = BB_HOT_PARTITION;
938             }
939           else
940             abort ();
941         }
942       
943       if (connected[t])
944         continue;
945
946       if (two_passes 
947           && BB_PARTITION (traces[t].first) != current_partition)
948         continue;
949
950       connected[t] = true;
951
952       /* Find the predecessor traces.  */
953       for (t2 = t; t2 > 0;)
954         {
955           edge_iterator ei;
956           best = NULL;
957           best_len = 0;
958           FOR_EACH_EDGE (e, ei, traces[t2].first->preds)
959             {
960               int si = e->src->index;
961
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]
967                   && (BB_PARTITION (e->src) == current_partition)
968                   && (!best
969                       || e->probability > best->probability
970                       || (e->probability == best->probability
971                           && traces[bbd[si].end_of_trace].length > best_len)))
972                 {
973                   best = e;
974                   best_len = traces[bbd[si].end_of_trace].length;
975                 }
976             }
977           if (best)
978             {
979               best->src->rbi->next = best->dest;
980               t2 = bbd[best->src->index].end_of_trace;
981               connected[t2] = true;
982
983               if (dump_file)
984                 {
985                   fprintf (dump_file, "Connection: %d %d\n",
986                            best->src->index, best->dest->index);
987                 }
988             }
989           else
990             break;
991         }
992
993       if (last_trace >= 0)
994         traces[last_trace].last->rbi->next = traces[t2].first;
995       last_trace = t;
996
997       /* Find the successor traces.  */
998       while (1)
999         {
1000           /* Find the continuation of the chain.  */
1001           edge_iterator ei;
1002           best = NULL;
1003           best_len = 0;
1004           FOR_EACH_EDGE (e, ei, traces[t].last->succs)
1005             {
1006               int di = e->dest->index;
1007
1008               if (e->dest != EXIT_BLOCK_PTR
1009                   && (e->flags & EDGE_CAN_FALLTHRU)
1010                   && !(e->flags & EDGE_COMPLEX)
1011                   && bbd[di].start_of_trace >= 0
1012                   && !connected[bbd[di].start_of_trace]
1013                   && (BB_PARTITION (e->dest) == current_partition)
1014                   && (!best
1015                       || e->probability > best->probability
1016                       || (e->probability == best->probability
1017                           && traces[bbd[di].start_of_trace].length > best_len)))
1018                 {
1019                   best = e;
1020                   best_len = traces[bbd[di].start_of_trace].length;
1021                 }
1022             }
1023
1024           if (best)
1025             {
1026               if (dump_file)
1027                 {
1028                   fprintf (dump_file, "Connection: %d %d\n",
1029                            best->src->index, best->dest->index);
1030                 }
1031               t = bbd[best->dest->index].start_of_trace;
1032               traces[last_trace].last->rbi->next = traces[t].first;
1033               connected[t] = true;
1034               last_trace = t;
1035             }
1036           else
1037             {
1038               /* Try to connect the traces by duplication of 1 block.  */
1039               edge e2;
1040               basic_block next_bb = NULL;
1041               bool try_copy = false;
1042
1043               FOR_EACH_EDGE (e, ei, traces[t].last->succs)
1044                 if (e->dest != EXIT_BLOCK_PTR
1045                     && (e->flags & EDGE_CAN_FALLTHRU)
1046                     && !(e->flags & EDGE_COMPLEX)
1047                     && (!best || e->probability > best->probability))
1048                   {
1049                     edge_iterator ei;
1050                     edge best2 = NULL;
1051                     int best2_len = 0;
1052
1053                     /* If the destination is a start of a trace which is only
1054                        one block long, then no need to search the successor
1055                        blocks of the trace.  Accept it.  */
1056                     if (bbd[e->dest->index].start_of_trace >= 0
1057                         && traces[bbd[e->dest->index].start_of_trace].length
1058                            == 1)
1059                       {
1060                         best = e;
1061                         try_copy = true;
1062                         continue;
1063                       }
1064
1065                     FOR_EACH_EDGE (e2, ei, e->dest->succs)
1066                       {
1067                         int di = e2->dest->index;
1068
1069                         if (e2->dest == EXIT_BLOCK_PTR
1070                             || ((e2->flags & EDGE_CAN_FALLTHRU)
1071                                 && !(e2->flags & EDGE_COMPLEX)
1072                                 && bbd[di].start_of_trace >= 0
1073                                 && !connected[bbd[di].start_of_trace]
1074                                 && (BB_PARTITION (e2->dest) == current_partition)
1075                                 && (EDGE_FREQUENCY (e2) >= freq_threshold)
1076                                 && (e2->count >= count_threshold)
1077                                 && (!best2
1078                                     || e2->probability > best2->probability
1079                                     || (e2->probability == best2->probability
1080                                         && traces[bbd[di].start_of_trace].length
1081                                            > best2_len))))
1082                           {
1083                             best = e;
1084                             best2 = e2;
1085                             if (e2->dest != EXIT_BLOCK_PTR)
1086                               best2_len = traces[bbd[di].start_of_trace].length;
1087                             else
1088                               best2_len = INT_MAX;
1089                             next_bb = e2->dest;
1090                             try_copy = true;
1091                           }
1092                       }
1093                   }
1094
1095               if (flag_reorder_blocks_and_partition)
1096                 try_copy = false;
1097
1098               /* Copy tiny blocks always; copy larger blocks only when the
1099                  edge is traversed frequently enough.  */
1100               if (try_copy
1101                   && copy_bb_p (best->dest,
1102                                 !optimize_size
1103                                 && EDGE_FREQUENCY (best) >= freq_threshold
1104                                 && best->count >= count_threshold))
1105                 {
1106                   basic_block new_bb;
1107
1108                   if (dump_file)
1109                     {
1110                       fprintf (dump_file, "Connection: %d %d ",
1111                                traces[t].last->index, best->dest->index);
1112                       if (!next_bb)
1113                         fputc ('\n', dump_file);
1114                       else if (next_bb == EXIT_BLOCK_PTR)
1115                         fprintf (dump_file, "exit\n");
1116                       else
1117                         fprintf (dump_file, "%d\n", next_bb->index);
1118                     }
1119
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)
1123                     {
1124                       t = bbd[next_bb->index].start_of_trace;
1125                       traces[last_trace].last->rbi->next = traces[t].first;
1126                       connected[t] = true;
1127                       last_trace = t;
1128                     }
1129                   else
1130                     break;      /* Stop finding the successor traces.  */
1131                 }
1132               else
1133                 break;  /* Stop finding the successor traces.  */
1134             }
1135         }
1136     }
1137
1138   if (dump_file)
1139     {
1140       basic_block bb;
1141
1142       fprintf (dump_file, "Final order:\n");
1143       for (bb = traces[0].first; bb; bb = bb->rbi->next)
1144         fprintf (dump_file, "%d ", bb->index);
1145       fprintf (dump_file, "\n");
1146       fflush (dump_file);
1147     }
1148
1149   FREE (connected);
1150 }
1151
1152 /* Return true when BB can and should be copied. CODE_MAY_GROW is true
1153    when code size is allowed to grow by duplication.  */
1154
1155 static bool
1156 copy_bb_p (basic_block bb, int code_may_grow)
1157 {
1158   int size = 0;
1159   int max_size = uncond_jump_length;
1160   rtx insn;
1161
1162   if (!bb->frequency)
1163     return false;
1164   if (EDGE_COUNT (bb->preds) < 2)
1165     return false;
1166   if (!can_duplicate_block_p (bb))
1167     return false;
1168
1169   /* Avoid duplicating blocks which have many successors (PR/13430).  */
1170   if (EDGE_COUNT (bb->succs) > 8)
1171     return false;
1172
1173   if (code_may_grow && maybe_hot_bb_p (bb))
1174     max_size *= 8;
1175
1176   FOR_BB_INSNS (bb, insn)
1177     {
1178       if (INSN_P (insn))
1179         size += get_attr_length (insn);
1180     }
1181
1182   if (size <= max_size)
1183     return true;
1184
1185   if (dump_file)
1186     {
1187       fprintf (dump_file,
1188                "Block %d can't be copied because its size = %d.\n",
1189                bb->index, size);
1190     }
1191
1192   return false;
1193 }
1194
1195 /* Return the length of unconditional jump instruction.  */
1196
1197 static int
1198 get_uncond_jump_length (void)
1199 {
1200   rtx label, jump;
1201   int length;
1202
1203   label = emit_label_before (gen_label_rtx (), get_insns ());
1204   jump = emit_jump_insn (gen_jump (label));
1205
1206   length = get_attr_length (jump);
1207
1208   delete_insn (jump);
1209   delete_insn (label);
1210   return length;
1211 }
1212
1213 /* Find the basic blocks that are rarely executed and need to be moved to
1214    a separate section of the .o file (to cut down on paging and improve
1215    cache locality).  */
1216
1217 static void
1218 find_rarely_executed_basic_blocks_and_crossing_edges (edge *crossing_edges, 
1219                                                       int *n_crossing_edges, 
1220                                                       int *max_idx)
1221 {
1222   basic_block bb;
1223   bool has_hot_blocks = false;
1224   edge e;
1225   int i;
1226   edge_iterator ei;
1227
1228   /* Mark which partition (hot/cold) each basic block belongs in.  */
1229   
1230   FOR_EACH_BB (bb)
1231     {
1232       if (probably_never_executed_bb_p (bb))
1233         BB_SET_PARTITION (bb, BB_COLD_PARTITION);
1234       else
1235         {
1236           BB_SET_PARTITION (bb, BB_HOT_PARTITION);
1237           has_hot_blocks = true;
1238         }
1239     }
1240
1241   /* Mark every edge that crosses between sections.  */
1242
1243   i = 0;
1244   if (targetm.have_named_sections)
1245     {
1246       FOR_EACH_BB (bb)
1247         FOR_EACH_EDGE (e, ei, bb->succs)
1248           {
1249             if (e->src != ENTRY_BLOCK_PTR
1250                 && e->dest != EXIT_BLOCK_PTR
1251                 && BB_PARTITION (e->src) != BB_PARTITION (e->dest))
1252               {
1253                 e->flags |= EDGE_CROSSING;
1254                 if (i == *max_idx)
1255                   {
1256                     *max_idx *= 2;
1257                     crossing_edges = xrealloc (crossing_edges,
1258                                                (*max_idx) * sizeof (edge));
1259                   }
1260                 crossing_edges[i++] = e;
1261               }
1262             else
1263               e->flags &= ~EDGE_CROSSING;
1264           }
1265     }
1266   *n_crossing_edges = i;
1267 }
1268
1269 /* If any destination of a crossing edge does not have a label, add label;
1270    Convert any fall-through crossing edges (for blocks that do not contain
1271    a jump) to unconditional jumps.  */
1272
1273 static void 
1274 add_labels_and_missing_jumps (edge *crossing_edges, int n_crossing_edges)
1275 {
1276   int i;
1277   basic_block src;
1278   basic_block dest;
1279   rtx label;
1280   rtx barrier;
1281   rtx new_jump;
1282   
1283   for (i=0; i < n_crossing_edges; i++) 
1284     {
1285       if (crossing_edges[i]) 
1286         {
1287           src = crossing_edges[i]->src; 
1288           dest = crossing_edges[i]->dest;
1289           
1290           /* Make sure dest has a label.  */
1291           
1292           if (dest && (dest != EXIT_BLOCK_PTR))
1293             {
1294               label = block_label (dest);
1295               
1296               /* Make sure source block ends with a jump.  */
1297               
1298               if (src && (src != ENTRY_BLOCK_PTR)) 
1299                 {
1300                   if (!JUMP_P (BB_END (src)))
1301                     /* bb just falls through.  */
1302                     {
1303                       /* make sure there's only one successor */
1304                       gcc_assert (single_succ_p (src));
1305                       
1306                       /* Find label in dest block.  */
1307                       label = block_label (dest);
1308                       
1309                       new_jump = emit_jump_insn_after (gen_jump (label), 
1310                                                        BB_END (src));
1311                       barrier = emit_barrier_after (new_jump);
1312                       JUMP_LABEL (new_jump) = label;
1313                       LABEL_NUSES (label) += 1;
1314                       src->rbi->footer = unlink_insn_chain (barrier, barrier);
1315                       /* Mark edge as non-fallthru.  */
1316                       crossing_edges[i]->flags &= ~EDGE_FALLTHRU;
1317                     } /* end: 'if (GET_CODE ... '  */
1318                 } /* end: 'if (src && src->index...'  */
1319             } /* end: 'if (dest && dest->index...'  */
1320         } /* end: 'if (crossing_edges[i]...'  */
1321     } /* end for loop  */
1322 }
1323
1324 /* Find any bb's where the fall-through edge is a crossing edge (note that
1325    these bb's must also contain a conditional jump; we've already
1326    dealt with fall-through edges for blocks that didn't have a
1327    conditional jump in the call to add_labels_and_missing_jumps).
1328    Convert the fall-through edge to non-crossing edge by inserting a
1329    new bb to fall-through into.  The new bb will contain an
1330    unconditional jump (crossing edge) to the original fall through
1331    destination.  */
1332
1333 static void 
1334 fix_up_fall_thru_edges (void)
1335 {
1336   basic_block cur_bb;
1337   basic_block new_bb;
1338   edge succ1;
1339   edge succ2;
1340   edge fall_thru;
1341   edge cond_jump = NULL;
1342   edge e;
1343   bool cond_jump_crosses;
1344   int invert_worked;
1345   rtx old_jump;
1346   rtx fall_thru_label;
1347   rtx barrier;
1348   
1349   FOR_EACH_BB (cur_bb)
1350     {
1351       fall_thru = NULL;
1352       if (EDGE_COUNT (cur_bb->succs) > 0)
1353         succ1 = EDGE_SUCC (cur_bb, 0);
1354       else
1355         succ1 = NULL;
1356
1357       if (EDGE_COUNT (cur_bb->succs) > 1)
1358         succ2 = EDGE_SUCC (cur_bb, 1);
1359       else
1360         succ2 = NULL;
1361       
1362       /* Find the fall-through edge.  */
1363       
1364       if (succ1 
1365           && (succ1->flags & EDGE_FALLTHRU))
1366         {
1367           fall_thru = succ1;
1368           cond_jump = succ2;
1369         }
1370       else if (succ2 
1371                && (succ2->flags & EDGE_FALLTHRU))
1372         {
1373           fall_thru = succ2;
1374           cond_jump = succ1;
1375         }
1376       
1377       if (fall_thru && (fall_thru->dest != EXIT_BLOCK_PTR))
1378         {
1379           /* Check to see if the fall-thru edge is a crossing edge.  */
1380         
1381           if (fall_thru->flags & EDGE_CROSSING)
1382             {
1383               /* The fall_thru edge crosses; now check the cond jump edge, if
1384                  it exists.  */
1385               
1386               cond_jump_crosses = true;
1387               invert_worked  = 0;
1388               old_jump = BB_END (cur_bb);
1389               
1390               /* Find the jump instruction, if there is one.  */
1391               
1392               if (cond_jump)
1393                 {
1394                   if (!(cond_jump->flags & EDGE_CROSSING))
1395                     cond_jump_crosses = false;
1396                   
1397                   /* We know the fall-thru edge crosses; if the cond
1398                      jump edge does NOT cross, and its destination is the
1399                      next block in the bb order, invert the jump
1400                      (i.e. fix it so the fall thru does not cross and
1401                      the cond jump does).  */
1402                   
1403                   if (!cond_jump_crosses
1404                       && cur_bb->rbi->next == cond_jump->dest)
1405                     {
1406                       /* Find label in fall_thru block. We've already added
1407                          any missing labels, so there must be one.  */
1408                       
1409                       fall_thru_label = block_label (fall_thru->dest);
1410
1411                       if (old_jump && fall_thru_label)
1412                         invert_worked = invert_jump (old_jump, 
1413                                                      fall_thru_label,0);
1414                       if (invert_worked)
1415                         {
1416                           fall_thru->flags &= ~EDGE_FALLTHRU;
1417                           cond_jump->flags |= EDGE_FALLTHRU;
1418                           update_br_prob_note (cur_bb);
1419                           e = fall_thru;
1420                           fall_thru = cond_jump;
1421                           cond_jump = e;
1422                           cond_jump->flags |= EDGE_CROSSING;
1423                           fall_thru->flags &= ~EDGE_CROSSING;
1424                         }
1425                     }
1426                 }
1427               
1428               if (cond_jump_crosses || !invert_worked)
1429                 {
1430                   /* This is the case where both edges out of the basic
1431                      block are crossing edges. Here we will fix up the
1432                      fall through edge. The jump edge will be taken care
1433                      of later.  */
1434                   
1435                   new_bb = force_nonfallthru (fall_thru);  
1436                   
1437                   if (new_bb)
1438                     {
1439                       new_bb->rbi->next = cur_bb->rbi->next;
1440                       cur_bb->rbi->next = new_bb;
1441                       
1442                       /* Make sure new fall-through bb is in same 
1443                          partition as bb it's falling through from.  */
1444
1445                       BB_COPY_PARTITION (new_bb, cur_bb);
1446                       single_succ_edge (new_bb)->flags |= EDGE_CROSSING;
1447                     }
1448                   
1449                   /* Add barrier after new jump */
1450                   
1451                   if (new_bb)
1452                     {
1453                       barrier = emit_barrier_after (BB_END (new_bb));
1454                       new_bb->rbi->footer = unlink_insn_chain (barrier, 
1455                                                                barrier);
1456                     }
1457                   else
1458                     {
1459                       barrier = emit_barrier_after (BB_END (cur_bb));
1460                       cur_bb->rbi->footer = unlink_insn_chain (barrier,
1461                                                                barrier);
1462                     }
1463                 }
1464             }
1465         }
1466     }
1467 }
1468
1469 /* This function checks the destination blockof a "crossing jump" to
1470    see if it has any crossing predecessors that begin with a code label
1471    and end with an unconditional jump.  If so, it returns that predecessor
1472    block.  (This is to avoid creating lots of new basic blocks that all
1473    contain unconditional jumps to the same destination).  */
1474
1475 static basic_block
1476 find_jump_block (basic_block jump_dest) 
1477
1478   basic_block source_bb = NULL; 
1479   edge e;
1480   rtx insn;
1481   edge_iterator ei;
1482
1483   FOR_EACH_EDGE (e, ei, jump_dest->preds)
1484     if (e->flags & EDGE_CROSSING)
1485       {
1486         basic_block src = e->src;
1487         
1488         /* Check each predecessor to see if it has a label, and contains
1489            only one executable instruction, which is an unconditional jump.
1490            If so, we can use it.  */
1491         
1492         if (LABEL_P (BB_HEAD (src)))
1493           for (insn = BB_HEAD (src); 
1494                !INSN_P (insn) && insn != NEXT_INSN (BB_END (src));
1495                insn = NEXT_INSN (insn))
1496             {
1497               if (INSN_P (insn)
1498                   && insn == BB_END (src)
1499                   && JUMP_P (insn)
1500                   && !any_condjump_p (insn))
1501                 {
1502                   source_bb = src;
1503                   break;
1504                 }
1505             }
1506         
1507         if (source_bb)
1508           break;
1509       }
1510
1511   return source_bb;
1512 }
1513
1514 /* Find all BB's with conditional jumps that are crossing edges;
1515    insert a new bb and make the conditional jump branch to the new
1516    bb instead (make the new bb same color so conditional branch won't
1517    be a 'crossing' edge).  Insert an unconditional jump from the
1518    new bb to the original destination of the conditional jump.  */
1519
1520 static void
1521 fix_crossing_conditional_branches (void)
1522 {
1523   basic_block cur_bb;
1524   basic_block new_bb;
1525   basic_block last_bb;
1526   basic_block dest;
1527   basic_block prev_bb;
1528   edge succ1;
1529   edge succ2;
1530   edge crossing_edge;
1531   edge new_edge;
1532   rtx old_jump;
1533   rtx set_src;
1534   rtx old_label = NULL_RTX;
1535   rtx new_label;
1536   rtx new_jump;
1537   rtx barrier;
1538
1539  last_bb = EXIT_BLOCK_PTR->prev_bb;
1540   
1541   FOR_EACH_BB (cur_bb)
1542     {
1543       crossing_edge = NULL;
1544       if (EDGE_COUNT (cur_bb->succs) > 0)
1545         succ1 = EDGE_SUCC (cur_bb, 0);
1546       else
1547         succ1 = NULL;
1548     
1549       if (EDGE_COUNT (cur_bb->succs) > 1)
1550         succ2 = EDGE_SUCC (cur_bb, 1);
1551       else
1552         succ2 = NULL;
1553       
1554       /* We already took care of fall-through edges, so only one successor
1555          can be a crossing edge.  */
1556       
1557       if (succ1 && (succ1->flags & EDGE_CROSSING))
1558         crossing_edge = succ1;
1559       else if (succ2 && (succ2->flags & EDGE_CROSSING))
1560         crossing_edge = succ2;
1561       
1562       if (crossing_edge) 
1563         {
1564           old_jump = BB_END (cur_bb);
1565           
1566           /* Check to make sure the jump instruction is a
1567              conditional jump.  */
1568           
1569           set_src = NULL_RTX;
1570
1571           if (any_condjump_p (old_jump))
1572             {
1573               if (GET_CODE (PATTERN (old_jump)) == SET)
1574                 set_src = SET_SRC (PATTERN (old_jump));
1575               else if (GET_CODE (PATTERN (old_jump)) == PARALLEL)
1576                 {
1577                   set_src = XVECEXP (PATTERN (old_jump), 0,0);
1578                   if (GET_CODE (set_src) == SET)
1579                     set_src = SET_SRC (set_src);
1580                   else
1581                     set_src = NULL_RTX;
1582                 }
1583             }
1584
1585           if (set_src && (GET_CODE (set_src) == IF_THEN_ELSE))
1586             {
1587               if (GET_CODE (XEXP (set_src, 1)) == PC)
1588                 old_label = XEXP (set_src, 2);
1589               else if (GET_CODE (XEXP (set_src, 2)) == PC)
1590                 old_label = XEXP (set_src, 1);
1591               
1592               /* Check to see if new bb for jumping to that dest has
1593                  already been created; if so, use it; if not, create
1594                  a new one.  */
1595
1596               new_bb = find_jump_block (crossing_edge->dest);
1597               
1598               if (new_bb)
1599                 new_label = block_label (new_bb);
1600               else
1601                 {
1602                   /* Create new basic block to be dest for
1603                      conditional jump.  */
1604                   
1605                   new_bb = create_basic_block (NULL, NULL, last_bb);
1606                   new_bb->rbi->next = last_bb->rbi->next;
1607                   last_bb->rbi->next = new_bb;
1608                   prev_bb = last_bb;
1609                   last_bb = new_bb;
1610                   
1611                   /* Update register liveness information.  */
1612                   
1613                   new_bb->global_live_at_start = ALLOC_REG_SET (&reg_obstack);
1614                   new_bb->global_live_at_end = ALLOC_REG_SET (&reg_obstack);
1615                   COPY_REG_SET (new_bb->global_live_at_end,
1616                                 prev_bb->global_live_at_end);
1617                   COPY_REG_SET (new_bb->global_live_at_start,
1618                                 prev_bb->global_live_at_end);
1619                   
1620                   /* Put appropriate instructions in new bb.  */
1621                   
1622                   new_label = gen_label_rtx ();
1623                   emit_label_before (new_label, BB_HEAD (new_bb));
1624                   BB_HEAD (new_bb) = new_label;
1625                   
1626                   if (GET_CODE (old_label) == LABEL_REF)
1627                     {
1628                       old_label = JUMP_LABEL (old_jump);
1629                       new_jump = emit_jump_insn_after (gen_jump 
1630                                                        (old_label), 
1631                                                        BB_END (new_bb));
1632                     }
1633                   else
1634                     {
1635                       gcc_assert (HAVE_return
1636                                   && GET_CODE (old_label) == RETURN);
1637                       new_jump = emit_jump_insn_after (gen_return (), 
1638                                                        BB_END (new_bb));
1639                     }
1640                   
1641                   barrier = emit_barrier_after (new_jump);
1642                   JUMP_LABEL (new_jump) = old_label;
1643                   new_bb->rbi->footer = unlink_insn_chain (barrier, 
1644                                                            barrier);
1645                   
1646                   /* Make sure new bb is in same partition as source
1647                      of conditional branch.  */
1648                   BB_COPY_PARTITION (new_bb, cur_bb);
1649                 }
1650               
1651               /* Make old jump branch to new bb.  */
1652               
1653               redirect_jump (old_jump, new_label, 0);
1654               
1655               /* Remove crossing_edge as predecessor of 'dest'.  */
1656               
1657               dest = crossing_edge->dest;
1658               
1659               redirect_edge_succ (crossing_edge, new_bb);
1660               
1661               /* Make a new edge from new_bb to old dest; new edge
1662                  will be a successor for new_bb and a predecessor
1663                  for 'dest'.  */
1664               
1665               if (EDGE_COUNT (new_bb->succs) == 0)
1666                 new_edge = make_edge (new_bb, dest, 0);
1667               else
1668                 new_edge = EDGE_SUCC (new_bb, 0);
1669               
1670               crossing_edge->flags &= ~EDGE_CROSSING;
1671               new_edge->flags |= EDGE_CROSSING;
1672             }
1673         }
1674     }
1675 }
1676
1677 /* Find any unconditional branches that cross between hot and cold
1678    sections.  Convert them into indirect jumps instead.  */
1679
1680 static void
1681 fix_crossing_unconditional_branches (void)
1682 {
1683   basic_block cur_bb;
1684   rtx last_insn;
1685   rtx label;
1686   rtx label_addr;
1687   rtx indirect_jump_sequence;
1688   rtx jump_insn = NULL_RTX;
1689   rtx new_reg;
1690   rtx cur_insn;
1691   edge succ;
1692
1693   FOR_EACH_BB (cur_bb)
1694     {
1695       last_insn = BB_END (cur_bb);
1696
1697       if (EDGE_COUNT (cur_bb->succs) < 1)
1698         continue;
1699
1700       succ = EDGE_SUCC (cur_bb, 0);
1701
1702       /* Check to see if bb ends in a crossing (unconditional) jump.  At
1703          this point, no crossing jumps should be conditional.  */
1704
1705       if (JUMP_P (last_insn)
1706           && (succ->flags & EDGE_CROSSING))
1707         {
1708           rtx label2, table;
1709
1710           gcc_assert (!any_condjump_p (last_insn));
1711
1712           /* Make sure the jump is not already an indirect or table jump.  */
1713
1714           if (!computed_jump_p (last_insn)
1715               && !tablejump_p (last_insn, &label2, &table))
1716             {
1717               /* We have found a "crossing" unconditional branch.  Now
1718                  we must convert it to an indirect jump.  First create
1719                  reference of label, as target for jump.  */
1720               
1721               label = JUMP_LABEL (last_insn);
1722               label_addr = gen_rtx_LABEL_REF (Pmode, label);
1723               LABEL_NUSES (label) += 1;
1724               
1725               /* Get a register to use for the indirect jump.  */
1726               
1727               new_reg = gen_reg_rtx (Pmode);
1728               
1729               /* Generate indirect the jump sequence.  */
1730               
1731               start_sequence ();
1732               emit_move_insn (new_reg, label_addr);
1733               emit_indirect_jump (new_reg);
1734               indirect_jump_sequence = get_insns ();
1735               end_sequence ();
1736               
1737               /* Make sure every instruction in the new jump sequence has
1738                  its basic block set to be cur_bb.  */
1739               
1740               for (cur_insn = indirect_jump_sequence; cur_insn;
1741                    cur_insn = NEXT_INSN (cur_insn))
1742                 {
1743                   BLOCK_FOR_INSN (cur_insn) = cur_bb;
1744                   if (JUMP_P (cur_insn))
1745                     jump_insn = cur_insn;
1746                 }
1747               
1748               /* Insert the new (indirect) jump sequence immediately before
1749                  the unconditional jump, then delete the unconditional jump.  */
1750               
1751               emit_insn_before (indirect_jump_sequence, last_insn);
1752               delete_insn (last_insn);
1753               
1754               /* Make BB_END for cur_bb be the jump instruction (NOT the
1755                  barrier instruction at the end of the sequence...).  */
1756               
1757               BB_END (cur_bb) = jump_insn;
1758             }
1759         }
1760     }
1761 }
1762
1763 /* Add REG_CROSSING_JUMP note to all crossing jump insns.  */
1764
1765 static void
1766 add_reg_crossing_jump_notes (void)
1767 {
1768   basic_block bb;
1769   edge e;
1770   edge_iterator ei;
1771
1772   FOR_EACH_BB (bb)
1773     FOR_EACH_EDGE (e, ei, bb->succs)
1774       if ((e->flags & EDGE_CROSSING)
1775           && JUMP_P (BB_END (e->src)))
1776         REG_NOTES (BB_END (e->src)) = gen_rtx_EXPR_LIST (REG_CROSSING_JUMP, 
1777                                                          NULL_RTX, 
1778                                                          REG_NOTES (BB_END 
1779                                                                   (e->src)));
1780 }
1781
1782 /* Hot and cold basic blocks are partitioned and put in separate
1783    sections of the .o file, to reduce paging and improve cache
1784    performance (hopefully).  This can result in bits of code from the
1785    same function being widely separated in the .o file.  However this
1786    is not obvious to the current bb structure.  Therefore we must take
1787    care to ensure that: 1). There are no fall_thru edges that cross
1788    between sections; 2). For those architectures which have "short"
1789    conditional branches, all conditional branches that attempt to
1790    cross between sections are converted to unconditional branches;
1791    and, 3). For those architectures which have "short" unconditional
1792    branches, all unconditional branches that attempt to cross between
1793    sections are converted to indirect jumps.
1794
1795    The code for fixing up fall_thru edges that cross between hot and
1796    cold basic blocks does so by creating new basic blocks containing 
1797    unconditional branches to the appropriate label in the "other" 
1798    section.  The new basic block is then put in the same (hot or cold)
1799    section as the original conditional branch, and the fall_thru edge
1800    is modified to fall into the new basic block instead.  By adding
1801    this level of indirection we end up with only unconditional branches
1802    crossing between hot and cold sections.  
1803    
1804    Conditional branches are dealt with by adding a level of indirection.
1805    A new basic block is added in the same (hot/cold) section as the 
1806    conditional branch, and the conditional branch is retargeted to the
1807    new basic block.  The new basic block contains an unconditional branch
1808    to the original target of the conditional branch (in the other section).
1809
1810    Unconditional branches are dealt with by converting them into
1811    indirect jumps.  */
1812
1813 static void 
1814 fix_edges_for_rarely_executed_code (edge *crossing_edges, 
1815                                     int n_crossing_edges)
1816 {
1817   /* Make sure the source of any crossing edge ends in a jump and the
1818      destination of any crossing edge has a label.  */
1819   
1820   add_labels_and_missing_jumps (crossing_edges, n_crossing_edges);
1821   
1822   /* Convert all crossing fall_thru edges to non-crossing fall
1823      thrus to unconditional jumps (that jump to the original fall
1824      thru dest).  */
1825   
1826   fix_up_fall_thru_edges ();
1827   
1828   /* Only do the parts necessary for writing separate sections if
1829      the target architecture has the ability to write separate sections
1830      (i.e. it has named sections).  Otherwise, the hot/cold partitioning
1831      information will be used when reordering blocks to try to put all
1832      the hot blocks together, then all the cold blocks, but no actual
1833      section partitioning will be done.  */
1834
1835   if (targetm.have_named_sections)
1836     {
1837       /* If the architecture does not have conditional branches that can
1838          span all of memory, convert crossing conditional branches into
1839          crossing unconditional branches.  */
1840   
1841       if (!HAS_LONG_COND_BRANCH)
1842         fix_crossing_conditional_branches ();
1843   
1844       /* If the architecture does not have unconditional branches that
1845          can span all of memory, convert crossing unconditional branches
1846          into indirect jumps.  Since adding an indirect jump also adds
1847          a new register usage, update the register usage information as
1848          well.  */
1849       
1850       if (!HAS_LONG_UNCOND_BRANCH)
1851         {
1852           fix_crossing_unconditional_branches ();
1853           reg_scan (get_insns(), max_reg_num ());
1854         }
1855
1856       add_reg_crossing_jump_notes ();
1857     }
1858 }
1859
1860 /* Verify, in the basic block chain, that there is at most one switch
1861    between hot/cold partitions. This is modelled on
1862    rtl_verify_flow_info_1, but it cannot go inside that function
1863    because this condition will not be true until after
1864    reorder_basic_blocks is called.  */
1865
1866 static void
1867 verify_hot_cold_block_grouping (void)
1868 {
1869   basic_block bb;
1870   int err = 0;
1871   bool switched_sections = false;
1872   int current_partition = 0;
1873   
1874   FOR_EACH_BB (bb)
1875     {
1876       if (!current_partition)
1877         current_partition = BB_PARTITION (bb);
1878       if (BB_PARTITION (bb) != current_partition)
1879         {
1880           if (switched_sections)
1881             {
1882               error ("Multiple hot/cold transitions found (bb %i)",
1883                      bb->index);
1884               err = 1;
1885             }
1886           else
1887             {
1888               switched_sections = true;
1889               current_partition = BB_PARTITION (bb);
1890             }
1891         }
1892     }
1893   
1894   if (err)
1895     internal_error ("verify_hot_cold_block_grouping failed");
1896 }
1897
1898 /* Reorder basic blocks.  The main entry point to this file.  FLAGS is
1899    the set of flags to pass to cfg_layout_initialize().  */
1900
1901 void
1902 reorder_basic_blocks (unsigned int flags)
1903 {
1904   int n_traces;
1905   int i;
1906   struct trace *traces;
1907
1908   if (n_basic_blocks <= 1)
1909     return;
1910
1911   if (targetm.cannot_modify_jumps_p ())
1912     return;
1913
1914   timevar_push (TV_REORDER_BLOCKS);
1915
1916   cfg_layout_initialize (flags);
1917
1918   set_edge_can_fallthru_flag ();
1919   mark_dfs_back_edges ();
1920
1921   /* We are estimating the length of uncond jump insn only once since the code
1922      for getting the insn length always returns the minimal length now.  */
1923   if (uncond_jump_length == 0)
1924     uncond_jump_length = get_uncond_jump_length ();
1925
1926   /* We need to know some information for each basic block.  */
1927   array_size = GET_ARRAY_SIZE (last_basic_block);
1928   bbd = xmalloc (array_size * sizeof (bbro_basic_block_data));
1929   for (i = 0; i < array_size; i++)
1930     {
1931       bbd[i].start_of_trace = -1;
1932       bbd[i].in_trace = -1;
1933       bbd[i].end_of_trace = -1;
1934       bbd[i].heap = NULL;
1935       bbd[i].node = NULL;
1936     }
1937
1938   traces = xmalloc (n_basic_blocks * sizeof (struct trace));
1939   n_traces = 0;
1940   find_traces (&n_traces, traces);
1941   connect_traces (n_traces, traces);
1942   FREE (traces);
1943   FREE (bbd);
1944
1945   if (dump_file)
1946     dump_flow_info (dump_file);
1947
1948   cfg_layout_finalize ();
1949   verify_hot_cold_block_grouping ();
1950
1951   timevar_pop (TV_REORDER_BLOCKS);
1952 }
1953
1954 /* Determine which partition the first basic block in the function
1955    belongs to, then find the first basic block in the current function
1956    that belongs to a different section, and insert a
1957    NOTE_INSN_SWITCH_TEXT_SECTIONS note immediately before it in the
1958    instruction stream.  When writing out the assembly code,
1959    encountering this note will make the compiler switch between the
1960    hot and cold text sections.  */
1961
1962 void
1963 insert_section_boundary_note (void)
1964 {
1965   basic_block bb;
1966   rtx new_note;
1967   int first_partition = 0;
1968   
1969   if (flag_reorder_blocks_and_partition
1970       && targetm.have_named_sections)
1971     FOR_EACH_BB (bb)
1972     {
1973       if (!first_partition)
1974         first_partition = BB_PARTITION (bb);
1975       if (BB_PARTITION (bb) != first_partition)
1976         {
1977           new_note = emit_note_before (NOTE_INSN_SWITCH_TEXT_SECTIONS,
1978                                        BB_HEAD (bb));
1979           break;
1980         }
1981     }
1982 }
1983
1984 /* Duplicate the blocks containing computed gotos.  This basically unfactors
1985    computed gotos that were factored early on in the compilation process to
1986    speed up edge based data flow.  We used to not unfactoring them again,
1987    which can seriously pessimize code with many computed jumps in the source
1988    code, such as interpreters.  See e.g. PR15242.  */
1989
1990 void
1991 duplicate_computed_gotos (void)
1992 {
1993   basic_block bb, new_bb;
1994   bitmap candidates;
1995   int max_size;
1996
1997   if (n_basic_blocks <= 1)
1998     return;
1999
2000   if (targetm.cannot_modify_jumps_p ())
2001     return;
2002
2003   timevar_push (TV_REORDER_BLOCKS);
2004
2005   cfg_layout_initialize (0);
2006
2007   /* We are estimating the length of uncond jump insn only once
2008      since the code for getting the insn length always returns
2009      the minimal length now.  */
2010   if (uncond_jump_length == 0)
2011     uncond_jump_length = get_uncond_jump_length ();
2012
2013   max_size = uncond_jump_length * PARAM_VALUE (PARAM_MAX_GOTO_DUPLICATION_INSNS);
2014   candidates = BITMAP_ALLOC (NULL);
2015
2016   /* Build the reorder chain for the original order of blocks.
2017      Look for a computed jump while we are at it.  */
2018   FOR_EACH_BB (bb)
2019     {
2020       if (bb->next_bb != EXIT_BLOCK_PTR)
2021         bb->rbi->next = bb->next_bb;
2022
2023       /* If the block ends in a computed jump and it is small enough,
2024          make it a candidate for duplication.  */
2025       if (computed_jump_p (BB_END (bb))
2026           && !find_reg_note (BB_END (bb), REG_CROSSING_JUMP, NULL_RTX))
2027         {
2028           rtx insn;
2029           int size = 0;
2030
2031           FOR_BB_INSNS (bb, insn)
2032             if (INSN_P (insn))
2033               {
2034                 size += get_attr_length (insn);
2035                 if (size > max_size)
2036                   break;
2037               }
2038
2039           if (size <= max_size
2040               && can_duplicate_block_p (bb))
2041             bitmap_set_bit (candidates, bb->index);
2042         }
2043     }
2044
2045   /* Nothing to do if there is no computed jump here.  */
2046   if (bitmap_empty_p (candidates))
2047     goto done;
2048
2049   /* Duplicate computed gotos.  */
2050   FOR_EACH_BB (bb)
2051     {
2052       if (bb->rbi->visited)
2053         continue;
2054
2055       bb->rbi->visited = 1;
2056
2057       /* BB must have one outgoing edge.  That edge must not lead to
2058          the exit block or the next block.
2059          The destination must have more than one predecessor.  */
2060       if (!single_succ_p (bb)
2061           || single_succ (bb) == EXIT_BLOCK_PTR
2062           || single_succ (bb) == bb->next_bb
2063           || single_pred_p (single_succ (bb)))
2064         continue;
2065
2066       /* The successor block has to be a duplication candidate.  */
2067       if (!bitmap_bit_p (candidates, single_succ (bb)->index))
2068         continue;
2069
2070       new_bb = duplicate_block (single_succ (bb), single_succ_edge (bb));
2071       new_bb->rbi->next = bb->rbi->next;
2072       bb->rbi->next = new_bb;
2073       new_bb->rbi->visited = 1;
2074     }
2075
2076 done:
2077   cfg_layout_finalize ();
2078
2079   BITMAP_FREE (candidates);
2080
2081   timevar_pop (TV_REORDER_BLOCKS);
2082 }
2083
2084 /* This function is the main 'entrance' for the optimization that
2085    partitions hot and cold basic blocks into separate sections of the
2086    .o file (to improve performance and cache locality).  Ideally it
2087    would be called after all optimizations that rearrange the CFG have
2088    been called.  However part of this optimization may introduce new
2089    register usage, so it must be called before register allocation has
2090    occurred.  This means that this optimization is actually called
2091    well before the optimization that reorders basic blocks (see
2092    function above).
2093
2094    This optimization checks the feedback information to determine
2095    which basic blocks are hot/cold, updates flags on the basic blocks
2096    to indicate which section they belong in.  This information is
2097    later used for writing out sections in the .o file.  Because hot
2098    and cold sections can be arbitrarily large (within the bounds of
2099    memory), far beyond the size of a single function, it is necessary
2100    to fix up all edges that cross section boundaries, to make sure the
2101    instructions used can actually span the required distance.  The
2102    fixes are described below.
2103
2104    Fall-through edges must be changed into jumps; it is not safe or
2105    legal to fall through across a section boundary.  Whenever a
2106    fall-through edge crossing a section boundary is encountered, a new
2107    basic block is inserted (in the same section as the fall-through
2108    source), and the fall through edge is redirected to the new basic
2109    block.  The new basic block contains an unconditional jump to the
2110    original fall-through target.  (If the unconditional jump is
2111    insufficient to cross section boundaries, that is dealt with a
2112    little later, see below).
2113
2114    In order to deal with architectures that have short conditional
2115    branches (which cannot span all of memory) we take any conditional
2116    jump that attempts to cross a section boundary and add a level of
2117    indirection: it becomes a conditional jump to a new basic block, in
2118    the same section.  The new basic block contains an unconditional
2119    jump to the original target, in the other section.
2120
2121    For those architectures whose unconditional branch is also
2122    incapable of reaching all of memory, those unconditional jumps are
2123    converted into indirect jumps, through a register.
2124
2125    IMPORTANT NOTE: This optimization causes some messy interactions
2126    with the cfg cleanup optimizations; those optimizations want to
2127    merge blocks wherever possible, and to collapse indirect jump
2128    sequences (change "A jumps to B jumps to C" directly into "A jumps
2129    to C").  Those optimizations can undo the jump fixes that
2130    partitioning is required to make (see above), in order to ensure
2131    that jumps attempting to cross section boundaries are really able
2132    to cover whatever distance the jump requires (on many architectures
2133    conditional or unconditional jumps are not able to reach all of
2134    memory).  Therefore tests have to be inserted into each such
2135    optimization to make sure that it does not undo stuff necessary to
2136    cross partition boundaries.  This would be much less of a problem
2137    if we could perform this optimization later in the compilation, but
2138    unfortunately the fact that we may need to create indirect jumps
2139    (through registers) requires that this optimization be performed
2140    before register allocation.  */
2141
2142 void
2143 partition_hot_cold_basic_blocks (void)
2144 {
2145   basic_block cur_bb;
2146   edge *crossing_edges;
2147   int n_crossing_edges;
2148   int max_edges = 2 * last_basic_block;
2149   
2150   if (n_basic_blocks <= 1)
2151     return;
2152   
2153   crossing_edges = xcalloc (max_edges, sizeof (edge));
2154
2155   cfg_layout_initialize (0);
2156   
2157   FOR_EACH_BB (cur_bb)
2158     if (cur_bb->index >= 0
2159         && cur_bb->next_bb->index >= 0)
2160       cur_bb->rbi->next = cur_bb->next_bb;
2161   
2162   find_rarely_executed_basic_blocks_and_crossing_edges (crossing_edges, 
2163                                                         &n_crossing_edges, 
2164                                                         &max_edges);
2165
2166   if (n_crossing_edges > 0)
2167     fix_edges_for_rarely_executed_code (crossing_edges, n_crossing_edges);
2168   
2169   free (crossing_edges);
2170
2171   cfg_layout_finalize();
2172 }