OSDN Git Service

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