6b034aba5c9ec8059d353b0faabbff412be612fb
[platform/upstream/linaro-gcc.git] / gcc / bb-reorder.c
1 /* Basic block reordering routines for the GNU compiler.
2    Copyright (C) 2000-2013 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 3, 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 COPYING3.  If not see
18    <http://www.gnu.org/licenses/>.  */
19
20 /* This (greedy) algorithm constructs traces in several rounds.
21    The construction starts from "seeds".  The seed for the first round
22    is the entry point of the function.  When there are more than one seed,
23    the one with the lowest key in the heap is selected first (see bb_to_key).
24    Then the algorithm repeatedly adds the most probable successor to the end
25    of a trace.  Finally it connects the traces.
26
27    There are two parameters: Branch Threshold and Exec Threshold.
28    If the probability of an edge to a successor of the current basic block is
29    lower than Branch Threshold or its frequency is lower than Exec Threshold,
30    then the successor will be the seed in one of the next rounds.
31    Each round has these parameters lower than the previous one.
32    The last round has to have these parameters set to zero so that the
33    remaining blocks are picked up.
34
35    The algorithm selects the most probable successor from all unvisited
36    successors and successors that have been added to this trace.
37    The other successors (that has not been "sent" to the next round) will be
38    other seeds for this round and the secondary traces will start from them.
39    If the successor has not been visited in this trace, it is added to the
40    trace (however, there is some heuristic for simple branches).
41    If the successor has been visited in this trace, a loop has been found.
42    If the loop has many iterations, the loop is rotated so that the source
43    block of the most probable edge going out of the loop is the last block
44    of the trace.
45    If the loop has few iterations and there is no edge from the last block of
46    the loop going out of the loop, the loop header is duplicated.
47
48    When connecting traces, the algorithm first checks whether there is an edge
49    from the last block of a trace to the first block of another trace.
50    When there are still some unconnected traces it checks whether there exists
51    a basic block BB such that BB is a successor of the last block of a trace
52    and BB is a predecessor of the first block of another trace.  In this case,
53    BB is duplicated, added at the end of the first trace and the traces are
54    connected through it.
55    The rest of traces are simply connected so there will be a jump to the
56    beginning of the rest of traces.
57
58    The above description is for the full algorithm, which is used when the
59    function is optimized for speed.  When the function is optimized for size,
60    in order to reduce long jumps and connect more fallthru edges, the
61    algorithm is modified as follows:
62    (1) Break long traces to short ones.  A trace is broken at a block that has
63    multiple predecessors/ successors during trace discovery.  When connecting
64    traces, only connect Trace n with Trace n + 1.  This change reduces most
65    long jumps compared with the above algorithm.
66    (2) Ignore the edge probability and frequency for fallthru edges.
67    (3) Keep the original order of blocks when there is no chance to fall
68    through.  We rely on the results of cfg_cleanup.
69
70    To implement the change for code size optimization, block's index is
71    selected as the key and all traces are found in one round.
72
73    References:
74
75    "Software Trace Cache"
76    A. Ramirez, J. Larriba-Pey, C. Navarro, J. Torrellas and M. Valero; 1999
77    http://citeseer.nj.nec.com/15361.html
78
79 */
80
81 #include "config.h"
82 #include "system.h"
83 #include "coretypes.h"
84 #include "tm.h"
85 #include "rtl.h"
86 #include "regs.h"
87 #include "flags.h"
88 #include "output.h"
89 #include "fibheap.h"
90 #include "target.h"
91 #include "function.h"
92 #include "tm_p.h"
93 #include "obstack.h"
94 #include "expr.h"
95 #include "params.h"
96 #include "diagnostic-core.h"
97 #include "toplev.h" /* user_defined_section_attribute */
98 #include "tree-pass.h"
99 #include "df.h"
100 #include "bb-reorder.h"
101 #include "except.h"
102
103 /* The number of rounds.  In most cases there will only be 4 rounds, but
104    when partitioning hot and cold basic blocks into separate sections of
105    the object file there will be an extra round.  */
106 #define N_ROUNDS 5
107
108 /* Stubs in case we don't have a return insn.
109    We have to check at run time too, not only compile time.  */
110
111 #ifndef HAVE_return
112 #define HAVE_return 0
113 #define gen_return() NULL_RTX
114 #endif
115
116
117 struct target_bb_reorder default_target_bb_reorder;
118 #if SWITCHABLE_TARGET
119 struct target_bb_reorder *this_target_bb_reorder = &default_target_bb_reorder;
120 #endif
121
122 #define uncond_jump_length \
123   (this_target_bb_reorder->x_uncond_jump_length)
124
125 /* Branch thresholds in thousandths (per mille) of the REG_BR_PROB_BASE.  */
126 static const int branch_threshold[N_ROUNDS] = {400, 200, 100, 0, 0};
127
128 /* Exec thresholds in thousandths (per mille) of the frequency of bb 0.  */
129 static const int exec_threshold[N_ROUNDS] = {500, 200, 50, 0, 0};
130
131 /* If edge frequency is lower than DUPLICATION_THRESHOLD per mille of entry
132    block the edge destination is not duplicated while connecting traces.  */
133 #define DUPLICATION_THRESHOLD 100
134
135 /* Structure to hold needed information for each basic block.  */
136 typedef struct bbro_basic_block_data_def
137 {
138   /* Which trace is the bb start of (-1 means it is not a start of any).  */
139   int start_of_trace;
140
141   /* Which trace is the bb end of (-1 means it is not an end of any).  */
142   int end_of_trace;
143
144   /* Which trace is the bb in?  */
145   int in_trace;
146
147   /* Which trace was this bb visited in?  */
148   int visited;
149
150   /* Which heap is BB in (if any)?  */
151   fibheap_t heap;
152
153   /* Which heap node is BB in (if any)?  */
154   fibnode_t node;
155 } bbro_basic_block_data;
156
157 /* The current size of the following dynamic array.  */
158 static int array_size;
159
160 /* The array which holds needed information for basic blocks.  */
161 static bbro_basic_block_data *bbd;
162
163 /* To avoid frequent reallocation the size of arrays is greater than needed,
164    the number of elements is (not less than) 1.25 * size_wanted.  */
165 #define GET_ARRAY_SIZE(X) ((((X) / 4) + 1) * 5)
166
167 /* Free the memory and set the pointer to NULL.  */
168 #define FREE(P) (gcc_assert (P), free (P), P = 0)
169
170 /* Structure for holding information about a trace.  */
171 struct trace
172 {
173   /* First and last basic block of the trace.  */
174   basic_block first, last;
175
176   /* The round of the STC creation which this trace was found in.  */
177   int round;
178
179   /* The length (i.e. the number of basic blocks) of the trace.  */
180   int length;
181 };
182
183 /* Maximum frequency and count of one of the entry blocks.  */
184 static int max_entry_frequency;
185 static gcov_type max_entry_count;
186
187 /* Local function prototypes.  */
188 static void find_traces (int *, struct trace *);
189 static basic_block rotate_loop (edge, struct trace *, int);
190 static void mark_bb_visited (basic_block, int);
191 static void find_traces_1_round (int, int, gcov_type, struct trace *, int *,
192                                  int, fibheap_t *, int);
193 static basic_block copy_bb (basic_block, edge, basic_block, int);
194 static fibheapkey_t bb_to_key (basic_block);
195 static bool better_edge_p (const_basic_block, const_edge, int, int, int, int,
196                            const_edge);
197 static bool connect_better_edge_p (const_edge, bool, int, const_edge,
198                                    struct trace *);
199 static void connect_traces (int, struct trace *);
200 static bool copy_bb_p (const_basic_block, int);
201 static bool push_to_next_round_p (const_basic_block, int, int, int, gcov_type);
202 \f
203 /* Return the trace number in which BB was visited.  */
204
205 static int
206 bb_visited_trace (const_basic_block bb)
207 {
208   gcc_assert (bb->index < array_size);
209   return bbd[bb->index].visited;
210 }
211
212 /* This function marks BB that it was visited in trace number TRACE.  */
213
214 static void
215 mark_bb_visited (basic_block bb, int trace)
216 {
217   bbd[bb->index].visited = trace;
218   if (bbd[bb->index].heap)
219     {
220       fibheap_delete_node (bbd[bb->index].heap, bbd[bb->index].node);
221       bbd[bb->index].heap = NULL;
222       bbd[bb->index].node = NULL;
223     }
224 }
225
226 /* Check to see if bb should be pushed into the next round of trace
227    collections or not.  Reasons for pushing the block forward are 1).
228    If the block is cold, we are doing partitioning, and there will be
229    another round (cold partition blocks are not supposed to be
230    collected into traces until the very last round); or 2). There will
231    be another round, and the basic block is not "hot enough" for the
232    current round of trace collection.  */
233
234 static bool
235 push_to_next_round_p (const_basic_block bb, int round, int number_of_rounds,
236                       int exec_th, gcov_type count_th)
237 {
238   bool there_exists_another_round;
239   bool block_not_hot_enough;
240
241   there_exists_another_round = round < number_of_rounds - 1;
242
243   block_not_hot_enough = (bb->frequency < exec_th
244                           || bb->count < count_th
245                           || probably_never_executed_bb_p (cfun, bb));
246
247   if (there_exists_another_round
248       && block_not_hot_enough)
249     return true;
250   else
251     return false;
252 }
253
254 /* Find the traces for Software Trace Cache.  Chain each trace through
255    RBI()->next.  Store the number of traces to N_TRACES and description of
256    traces to TRACES.  */
257
258 static void
259 find_traces (int *n_traces, struct trace *traces)
260 {
261   int i;
262   int number_of_rounds;
263   edge e;
264   edge_iterator ei;
265   fibheap_t heap;
266
267   /* Add one extra round of trace collection when partitioning hot/cold
268      basic blocks into separate sections.  The last round is for all the
269      cold blocks (and ONLY the cold blocks).  */
270
271   number_of_rounds = N_ROUNDS - 1;
272
273   /* Insert entry points of function into heap.  */
274   heap = fibheap_new ();
275   max_entry_frequency = 0;
276   max_entry_count = 0;
277   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
278     {
279       bbd[e->dest->index].heap = heap;
280       bbd[e->dest->index].node = fibheap_insert (heap, bb_to_key (e->dest),
281                                                     e->dest);
282       if (e->dest->frequency > max_entry_frequency)
283         max_entry_frequency = e->dest->frequency;
284       if (e->dest->count > max_entry_count)
285         max_entry_count = e->dest->count;
286     }
287
288   /* Find the traces.  */
289   for (i = 0; i < number_of_rounds; i++)
290     {
291       gcov_type count_threshold;
292
293       if (dump_file)
294         fprintf (dump_file, "STC - round %d\n", i + 1);
295
296       if (max_entry_count < INT_MAX / 1000)
297         count_threshold = max_entry_count * exec_threshold[i] / 1000;
298       else
299         count_threshold = max_entry_count / 1000 * exec_threshold[i];
300
301       find_traces_1_round (REG_BR_PROB_BASE * branch_threshold[i] / 1000,
302                            max_entry_frequency * exec_threshold[i] / 1000,
303                            count_threshold, traces, n_traces, i, &heap,
304                            number_of_rounds);
305     }
306   fibheap_delete (heap);
307
308   if (dump_file)
309     {
310       for (i = 0; i < *n_traces; i++)
311         {
312           basic_block bb;
313           fprintf (dump_file, "Trace %d (round %d):  ", i + 1,
314                    traces[i].round + 1);
315           for (bb = traces[i].first;
316                bb != traces[i].last;
317                bb = (basic_block) bb->aux)
318             fprintf (dump_file, "%d [%d] ", bb->index, bb->frequency);
319           fprintf (dump_file, "%d [%d]\n", bb->index, bb->frequency);
320         }
321       fflush (dump_file);
322     }
323 }
324
325 /* Rotate loop whose back edge is BACK_EDGE in the tail of trace TRACE
326    (with sequential number TRACE_N).  */
327
328 static basic_block
329 rotate_loop (edge back_edge, struct trace *trace, int trace_n)
330 {
331   basic_block bb;
332
333   /* Information about the best end (end after rotation) of the loop.  */
334   basic_block best_bb = NULL;
335   edge best_edge = NULL;
336   int best_freq = -1;
337   gcov_type best_count = -1;
338   /* The best edge is preferred when its destination is not visited yet
339      or is a start block of some trace.  */
340   bool is_preferred = false;
341
342   /* Find the most frequent edge that goes out from current trace.  */
343   bb = back_edge->dest;
344   do
345     {
346       edge e;
347       edge_iterator ei;
348
349       FOR_EACH_EDGE (e, ei, bb->succs)
350         if (e->dest != EXIT_BLOCK_PTR
351             && bb_visited_trace (e->dest) != trace_n
352             && (e->flags & EDGE_CAN_FALLTHRU)
353             && !(e->flags & EDGE_COMPLEX))
354         {
355           if (is_preferred)
356             {
357               /* The best edge is preferred.  */
358               if (!bb_visited_trace (e->dest)
359                   || bbd[e->dest->index].start_of_trace >= 0)
360                 {
361                   /* The current edge E is also preferred.  */
362                   int freq = EDGE_FREQUENCY (e);
363                   if (freq > best_freq || e->count > best_count)
364                     {
365                       best_freq = freq;
366                       best_count = e->count;
367                       best_edge = e;
368                       best_bb = bb;
369                     }
370                 }
371             }
372           else
373             {
374               if (!bb_visited_trace (e->dest)
375                   || bbd[e->dest->index].start_of_trace >= 0)
376                 {
377                   /* The current edge E is preferred.  */
378                   is_preferred = true;
379                   best_freq = EDGE_FREQUENCY (e);
380                   best_count = e->count;
381                   best_edge = e;
382                   best_bb = bb;
383                 }
384               else
385                 {
386                   int freq = EDGE_FREQUENCY (e);
387                   if (!best_edge || freq > best_freq || e->count > best_count)
388                     {
389                       best_freq = freq;
390                       best_count = e->count;
391                       best_edge = e;
392                       best_bb = bb;
393                     }
394                 }
395             }
396         }
397       bb = (basic_block) bb->aux;
398     }
399   while (bb != back_edge->dest);
400
401   if (best_bb)
402     {
403       /* Rotate the loop so that the BEST_EDGE goes out from the last block of
404          the trace.  */
405       if (back_edge->dest == trace->first)
406         {
407           trace->first = (basic_block) best_bb->aux;
408         }
409       else
410         {
411           basic_block prev_bb;
412
413           for (prev_bb = trace->first;
414                prev_bb->aux != back_edge->dest;
415                prev_bb = (basic_block) prev_bb->aux)
416             ;
417           prev_bb->aux = best_bb->aux;
418
419           /* Try to get rid of uncond jump to cond jump.  */
420           if (single_succ_p (prev_bb))
421             {
422               basic_block header = single_succ (prev_bb);
423
424               /* Duplicate HEADER if it is a small block containing cond jump
425                  in the end.  */
426               if (any_condjump_p (BB_END (header)) && copy_bb_p (header, 0)
427                   && !find_reg_note (BB_END (header), REG_CROSSING_JUMP,
428                                      NULL_RTX))
429                 copy_bb (header, single_succ_edge (prev_bb), prev_bb, trace_n);
430             }
431         }
432     }
433   else
434     {
435       /* We have not found suitable loop tail so do no rotation.  */
436       best_bb = back_edge->src;
437     }
438   best_bb->aux = NULL;
439   return best_bb;
440 }
441
442 /* One round of finding traces.  Find traces for BRANCH_TH and EXEC_TH i.e. do
443    not include basic blocks whose probability is lower than BRANCH_TH or whose
444    frequency is lower than EXEC_TH into traces (or whose count is lower than
445    COUNT_TH).  Store the new traces into TRACES and modify the number of
446    traces *N_TRACES.  Set the round (which the trace belongs to) to ROUND.
447    The function expects starting basic blocks to be in *HEAP and will delete
448    *HEAP and store starting points for the next round into new *HEAP.  */
449
450 static void
451 find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
452                      struct trace *traces, int *n_traces, int round,
453                      fibheap_t *heap, int number_of_rounds)
454 {
455   /* Heap for discarded basic blocks which are possible starting points for
456      the next round.  */
457   fibheap_t new_heap = fibheap_new ();
458   bool for_size = optimize_function_for_size_p (cfun);
459
460   while (!fibheap_empty (*heap))
461     {
462       basic_block bb;
463       struct trace *trace;
464       edge best_edge, e;
465       fibheapkey_t key;
466       edge_iterator ei;
467
468       bb = (basic_block) fibheap_extract_min (*heap);
469       bbd[bb->index].heap = NULL;
470       bbd[bb->index].node = NULL;
471
472       if (dump_file)
473         fprintf (dump_file, "Getting bb %d\n", bb->index);
474
475       /* If the BB's frequency is too low, send BB to the next round.  When
476          partitioning hot/cold blocks into separate sections, make sure all
477          the cold blocks (and ONLY the cold blocks) go into the (extra) final
478          round.  When optimizing for size, do not push to next round.  */
479
480       if (!for_size
481           && push_to_next_round_p (bb, round, number_of_rounds, exec_th,
482                                    count_th))
483         {
484           int key = bb_to_key (bb);
485           bbd[bb->index].heap = new_heap;
486           bbd[bb->index].node = fibheap_insert (new_heap, key, bb);
487
488           if (dump_file)
489             fprintf (dump_file,
490                      "  Possible start point of next round: %d (key: %d)\n",
491                      bb->index, key);
492           continue;
493         }
494
495       trace = traces + *n_traces;
496       trace->first = bb;
497       trace->round = round;
498       trace->length = 0;
499       bbd[bb->index].in_trace = *n_traces;
500       (*n_traces)++;
501
502       do
503         {
504           int prob, freq;
505           bool ends_in_call;
506
507           /* The probability and frequency of the best edge.  */
508           int best_prob = INT_MIN / 2;
509           int best_freq = INT_MIN / 2;
510
511           best_edge = NULL;
512           mark_bb_visited (bb, *n_traces);
513           trace->length++;
514
515           if (dump_file)
516             fprintf (dump_file, "Basic block %d was visited in trace %d\n",
517                      bb->index, *n_traces - 1);
518
519           ends_in_call = block_ends_with_call_p (bb);
520
521           /* Select the successor that will be placed after BB.  */
522           FOR_EACH_EDGE (e, ei, bb->succs)
523             {
524               gcc_assert (!(e->flags & EDGE_FAKE));
525
526               if (e->dest == EXIT_BLOCK_PTR)
527                 continue;
528
529               if (bb_visited_trace (e->dest)
530                   && bb_visited_trace (e->dest) != *n_traces)
531                 continue;
532
533               if (BB_PARTITION (e->dest) != BB_PARTITION (bb))
534                 continue;
535
536               prob = e->probability;
537               freq = e->dest->frequency;
538
539               /* The only sensible preference for a call instruction is the
540                  fallthru edge.  Don't bother selecting anything else.  */
541               if (ends_in_call)
542                 {
543                   if (e->flags & EDGE_CAN_FALLTHRU)
544                     {
545                       best_edge = e;
546                       best_prob = prob;
547                       best_freq = freq;
548                     }
549                   continue;
550                 }
551
552               /* Edge that cannot be fallthru or improbable or infrequent
553                  successor (i.e. it is unsuitable successor).  When optimizing
554                  for size, ignore the probability and frequency.  */
555               if (!(e->flags & EDGE_CAN_FALLTHRU) || (e->flags & EDGE_COMPLEX)
556                   || ((prob < branch_th || EDGE_FREQUENCY (e) < exec_th
557                       || e->count < count_th) && (!for_size)))
558                 continue;
559
560               /* If partitioning hot/cold basic blocks, don't consider edges
561                  that cross section boundaries.  */
562
563               if (better_edge_p (bb, e, prob, freq, best_prob, best_freq,
564                                  best_edge))
565                 {
566                   best_edge = e;
567                   best_prob = prob;
568                   best_freq = freq;
569                 }
570             }
571
572           /* If the best destination has multiple predecessors, and can be
573              duplicated cheaper than a jump, don't allow it to be added
574              to a trace.  We'll duplicate it when connecting traces.  */
575           if (best_edge && EDGE_COUNT (best_edge->dest->preds) >= 2
576               && copy_bb_p (best_edge->dest, 0))
577             best_edge = NULL;
578
579           /* If the best destination has multiple successors or predecessors,
580              don't allow it to be added when optimizing for size.  This makes
581              sure predecessors with smaller index are handled before the best
582              destinarion.  It breaks long trace and reduces long jumps.
583
584              Take if-then-else as an example.
585                 A
586                / \
587               B   C
588                \ /
589                 D
590              If we do not remove the best edge B->D/C->D, the final order might
591              be A B D ... C.  C is at the end of the program.  If D's successors
592              and D are complicated, might need long jumps for A->C and C->D.
593              Similar issue for order: A C D ... B.
594
595              After removing the best edge, the final result will be ABCD/ ACBD.
596              It does not add jump compared with the previous order.  But it
597              reduces the possibility of long jumps.  */
598           if (best_edge && for_size
599               && (EDGE_COUNT (best_edge->dest->succs) > 1
600                  || EDGE_COUNT (best_edge->dest->preds) > 1))
601             best_edge = NULL;
602
603           /* Add all non-selected successors to the heaps.  */
604           FOR_EACH_EDGE (e, ei, bb->succs)
605             {
606               if (e == best_edge
607                   || e->dest == EXIT_BLOCK_PTR
608                   || bb_visited_trace (e->dest))
609                 continue;
610
611               key = bb_to_key (e->dest);
612
613               if (bbd[e->dest->index].heap)
614                 {
615                   /* E->DEST is already in some heap.  */
616                   if (key != bbd[e->dest->index].node->key)
617                     {
618                       if (dump_file)
619                         {
620                           fprintf (dump_file,
621                                    "Changing key for bb %d from %ld to %ld.\n",
622                                    e->dest->index,
623                                    (long) bbd[e->dest->index].node->key,
624                                    key);
625                         }
626                       fibheap_replace_key (bbd[e->dest->index].heap,
627                                            bbd[e->dest->index].node, key);
628                     }
629                 }
630               else
631                 {
632                   fibheap_t which_heap = *heap;
633
634                   prob = e->probability;
635                   freq = EDGE_FREQUENCY (e);
636
637                   if (!(e->flags & EDGE_CAN_FALLTHRU)
638                       || (e->flags & EDGE_COMPLEX)
639                       || prob < branch_th || freq < exec_th
640                       || e->count < count_th)
641                     {
642                       /* When partitioning hot/cold basic blocks, make sure
643                          the cold blocks (and only the cold blocks) all get
644                          pushed to the last round of trace collection.  When
645                          optimizing for size, do not push to next round.  */
646
647                       if (!for_size && push_to_next_round_p (e->dest, round,
648                                                              number_of_rounds,
649                                                              exec_th, count_th))
650                         which_heap = new_heap;
651                     }
652
653                   bbd[e->dest->index].heap = which_heap;
654                   bbd[e->dest->index].node = fibheap_insert (which_heap,
655                                                                 key, e->dest);
656
657                   if (dump_file)
658                     {
659                       fprintf (dump_file,
660                                "  Possible start of %s round: %d (key: %ld)\n",
661                                (which_heap == new_heap) ? "next" : "this",
662                                e->dest->index, (long) key);
663                     }
664
665                 }
666             }
667
668           if (best_edge) /* Suitable successor was found.  */
669             {
670               if (bb_visited_trace (best_edge->dest) == *n_traces)
671                 {
672                   /* We do nothing with one basic block loops.  */
673                   if (best_edge->dest != bb)
674                     {
675                       if (EDGE_FREQUENCY (best_edge)
676                           > 4 * best_edge->dest->frequency / 5)
677                         {
678                           /* The loop has at least 4 iterations.  If the loop
679                              header is not the first block of the function
680                              we can rotate the loop.  */
681
682                           if (best_edge->dest != ENTRY_BLOCK_PTR->next_bb)
683                             {
684                               if (dump_file)
685                                 {
686                                   fprintf (dump_file,
687                                            "Rotating loop %d - %d\n",
688                                            best_edge->dest->index, bb->index);
689                                 }
690                               bb->aux = best_edge->dest;
691                               bbd[best_edge->dest->index].in_trace =
692                                                              (*n_traces) - 1;
693                               bb = rotate_loop (best_edge, trace, *n_traces);
694                             }
695                         }
696                       else
697                         {
698                           /* The loop has less than 4 iterations.  */
699
700                           if (single_succ_p (bb)
701                               && copy_bb_p (best_edge->dest,
702                                             optimize_edge_for_speed_p
703                                             (best_edge)))
704                             {
705                               bb = copy_bb (best_edge->dest, best_edge, bb,
706                                             *n_traces);
707                               trace->length++;
708                             }
709                         }
710                     }
711
712                   /* Terminate the trace.  */
713                   break;
714                 }
715               else
716                 {
717                   /* Check for a situation
718
719                     A
720                    /|
721                   B |
722                    \|
723                     C
724
725                   where
726                   EDGE_FREQUENCY (AB) + EDGE_FREQUENCY (BC)
727                     >= EDGE_FREQUENCY (AC).
728                   (i.e. 2 * B->frequency >= EDGE_FREQUENCY (AC) )
729                   Best ordering is then A B C.
730
731                   When optimizing for size, A B C is always the best order.
732
733                   This situation is created for example by:
734
735                   if (A) B;
736                   C;
737
738                   */
739
740                   FOR_EACH_EDGE (e, ei, bb->succs)
741                     if (e != best_edge
742                         && (e->flags & EDGE_CAN_FALLTHRU)
743                         && !(e->flags & EDGE_COMPLEX)
744                         && !bb_visited_trace (e->dest)
745                         && single_pred_p (e->dest)
746                         && !(e->flags & EDGE_CROSSING)
747                         && single_succ_p (e->dest)
748                         && (single_succ_edge (e->dest)->flags
749                             & EDGE_CAN_FALLTHRU)
750                         && !(single_succ_edge (e->dest)->flags & EDGE_COMPLEX)
751                         && single_succ (e->dest) == best_edge->dest
752                         && (2 * e->dest->frequency >= EDGE_FREQUENCY (best_edge)
753                             || for_size))
754                       {
755                         best_edge = e;
756                         if (dump_file)
757                           fprintf (dump_file, "Selecting BB %d\n",
758                                    best_edge->dest->index);
759                         break;
760                       }
761
762                   bb->aux = best_edge->dest;
763                   bbd[best_edge->dest->index].in_trace = (*n_traces) - 1;
764                   bb = best_edge->dest;
765                 }
766             }
767         }
768       while (best_edge);
769       trace->last = bb;
770       bbd[trace->first->index].start_of_trace = *n_traces - 1;
771       bbd[trace->last->index].end_of_trace = *n_traces - 1;
772
773       /* The trace is terminated so we have to recount the keys in heap
774          (some block can have a lower key because now one of its predecessors
775          is an end of the trace).  */
776       FOR_EACH_EDGE (e, ei, bb->succs)
777         {
778           if (e->dest == EXIT_BLOCK_PTR
779               || bb_visited_trace (e->dest))
780             continue;
781
782           if (bbd[e->dest->index].heap)
783             {
784               key = bb_to_key (e->dest);
785               if (key != bbd[e->dest->index].node->key)
786                 {
787                   if (dump_file)
788                     {
789                       fprintf (dump_file,
790                                "Changing key for bb %d from %ld to %ld.\n",
791                                e->dest->index,
792                                (long) bbd[e->dest->index].node->key, key);
793                     }
794                   fibheap_replace_key (bbd[e->dest->index].heap,
795                                        bbd[e->dest->index].node,
796                                        key);
797                 }
798             }
799         }
800     }
801
802   fibheap_delete (*heap);
803
804   /* "Return" the new heap.  */
805   *heap = new_heap;
806 }
807
808 /* Create a duplicate of the basic block OLD_BB and redirect edge E to it, add
809    it to trace after BB, mark OLD_BB visited and update pass' data structures
810    (TRACE is a number of trace which OLD_BB is duplicated to).  */
811
812 static basic_block
813 copy_bb (basic_block old_bb, edge e, basic_block bb, int trace)
814 {
815   basic_block new_bb;
816
817   new_bb = duplicate_block (old_bb, e, bb);
818   BB_COPY_PARTITION (new_bb, old_bb);
819
820   gcc_assert (e->dest == new_bb);
821
822   if (dump_file)
823     fprintf (dump_file,
824              "Duplicated bb %d (created bb %d)\n",
825              old_bb->index, new_bb->index);
826
827   if (new_bb->index >= array_size || last_basic_block > array_size)
828     {
829       int i;
830       int new_size;
831
832       new_size = MAX (last_basic_block, new_bb->index + 1);
833       new_size = GET_ARRAY_SIZE (new_size);
834       bbd = XRESIZEVEC (bbro_basic_block_data, bbd, new_size);
835       for (i = array_size; i < new_size; i++)
836         {
837           bbd[i].start_of_trace = -1;
838           bbd[i].end_of_trace = -1;
839           bbd[i].in_trace = -1;
840           bbd[i].visited = 0;
841           bbd[i].heap = NULL;
842           bbd[i].node = NULL;
843         }
844       array_size = new_size;
845
846       if (dump_file)
847         {
848           fprintf (dump_file,
849                    "Growing the dynamic array to %d elements.\n",
850                    array_size);
851         }
852     }
853
854   gcc_assert (!bb_visited_trace (e->dest));
855   mark_bb_visited (new_bb, trace);
856   new_bb->aux = bb->aux;
857   bb->aux = new_bb;
858
859   bbd[new_bb->index].in_trace = trace;
860
861   return new_bb;
862 }
863
864 /* Compute and return the key (for the heap) of the basic block BB.  */
865
866 static fibheapkey_t
867 bb_to_key (basic_block bb)
868 {
869   edge e;
870   edge_iterator ei;
871   int priority = 0;
872
873   /* Use index as key to align with its original order.  */
874   if (optimize_function_for_size_p (cfun))
875     return bb->index;
876
877   /* Do not start in probably never executed blocks.  */
878
879   if (BB_PARTITION (bb) == BB_COLD_PARTITION
880       || probably_never_executed_bb_p (cfun, bb))
881     return BB_FREQ_MAX;
882
883   /* Prefer blocks whose predecessor is an end of some trace
884      or whose predecessor edge is EDGE_DFS_BACK.  */
885   FOR_EACH_EDGE (e, ei, bb->preds)
886     {
887       if ((e->src != ENTRY_BLOCK_PTR && bbd[e->src->index].end_of_trace >= 0)
888           || (e->flags & EDGE_DFS_BACK))
889         {
890           int edge_freq = EDGE_FREQUENCY (e);
891
892           if (edge_freq > priority)
893             priority = edge_freq;
894         }
895     }
896
897   if (priority)
898     /* The block with priority should have significantly lower key.  */
899     return -(100 * BB_FREQ_MAX + 100 * priority + bb->frequency);
900
901   return -bb->frequency;
902 }
903
904 /* Return true when the edge E from basic block BB is better than the temporary
905    best edge (details are in function).  The probability of edge E is PROB. The
906    frequency of the successor is FREQ.  The current best probability is
907    BEST_PROB, the best frequency is BEST_FREQ.
908    The edge is considered to be equivalent when PROB does not differ much from
909    BEST_PROB; similarly for frequency.  */
910
911 static bool
912 better_edge_p (const_basic_block bb, const_edge e, int prob, int freq,
913                int best_prob, int best_freq, const_edge cur_best_edge)
914 {
915   bool is_better_edge;
916
917   /* The BEST_* values do not have to be best, but can be a bit smaller than
918      maximum values.  */
919   int diff_prob = best_prob / 10;
920   int diff_freq = best_freq / 10;
921
922   /* The smaller one is better to keep the original order.  */
923   if (optimize_function_for_size_p (cfun))
924     return !cur_best_edge
925            || cur_best_edge->dest->index > e->dest->index;
926
927   if (prob > best_prob + diff_prob)
928     /* The edge has higher probability than the temporary best edge.  */
929     is_better_edge = true;
930   else if (prob < best_prob - diff_prob)
931     /* The edge has lower probability than the temporary best edge.  */
932     is_better_edge = false;
933   else if (freq < best_freq - diff_freq)
934     /* The edge and the temporary best edge  have almost equivalent
935        probabilities.  The higher frequency of a successor now means
936        that there is another edge going into that successor.
937        This successor has lower frequency so it is better.  */
938     is_better_edge = true;
939   else if (freq > best_freq + diff_freq)
940     /* This successor has higher frequency so it is worse.  */
941     is_better_edge = false;
942   else if (e->dest->prev_bb == bb)
943     /* The edges have equivalent probabilities and the successors
944        have equivalent frequencies.  Select the previous successor.  */
945     is_better_edge = true;
946   else
947     is_better_edge = false;
948
949   /* If we are doing hot/cold partitioning, make sure that we always favor
950      non-crossing edges over crossing edges.  */
951
952   if (!is_better_edge
953       && flag_reorder_blocks_and_partition
954       && cur_best_edge
955       && (cur_best_edge->flags & EDGE_CROSSING)
956       && !(e->flags & EDGE_CROSSING))
957     is_better_edge = true;
958
959   return is_better_edge;
960 }
961
962 /* Return true when the edge E is better than the temporary best edge
963    CUR_BEST_EDGE.  If SRC_INDEX_P is true, the function compares the src bb of
964    E and CUR_BEST_EDGE; otherwise it will compare the dest bb.
965    BEST_LEN is the trace length of src (or dest) bb in CUR_BEST_EDGE.
966    TRACES record the information about traces.
967    When optimizing for size, the edge with smaller index is better.
968    When optimizing for speed, the edge with bigger probability or longer trace
969    is better.  */
970
971 static bool
972 connect_better_edge_p (const_edge e, bool src_index_p, int best_len,
973                        const_edge cur_best_edge, struct trace *traces)
974 {
975   int e_index;
976   int b_index;
977   bool is_better_edge;
978
979   if (!cur_best_edge)
980     return true;
981
982   if (optimize_function_for_size_p (cfun))
983     {
984       e_index = src_index_p ? e->src->index : e->dest->index;
985       b_index = src_index_p ? cur_best_edge->src->index
986                               : cur_best_edge->dest->index;
987       /* The smaller one is better to keep the original order.  */
988       return b_index > e_index;
989     }
990
991   if (src_index_p)
992     {
993       e_index = e->src->index;
994
995       if (e->probability > cur_best_edge->probability)
996         /* The edge has higher probability than the temporary best edge.  */
997         is_better_edge = true;
998       else if (e->probability < cur_best_edge->probability)
999         /* The edge has lower probability than the temporary best edge.  */
1000         is_better_edge = false;
1001       else if (traces[bbd[e_index].end_of_trace].length > best_len)
1002         /* The edge and the temporary best edge have equivalent probabilities.
1003            The edge with longer trace is better.  */
1004         is_better_edge = true;
1005       else
1006         is_better_edge = false;
1007     }
1008   else
1009     {
1010       e_index = e->dest->index;
1011
1012       if (e->probability > cur_best_edge->probability)
1013         /* The edge has higher probability than the temporary best edge.  */
1014         is_better_edge = true;
1015       else if (e->probability < cur_best_edge->probability)
1016         /* The edge has lower probability than the temporary best edge.  */
1017         is_better_edge = false;
1018       else if (traces[bbd[e_index].start_of_trace].length > best_len)
1019         /* The edge and the temporary best edge have equivalent probabilities.
1020            The edge with longer trace is better.  */
1021         is_better_edge = true;
1022       else
1023         is_better_edge = false;
1024     }
1025
1026   return is_better_edge;
1027 }
1028
1029 /* Connect traces in array TRACES, N_TRACES is the count of traces.  */
1030
1031 static void
1032 connect_traces (int n_traces, struct trace *traces)
1033 {
1034   int i;
1035   bool *connected;
1036   bool two_passes;
1037   int last_trace;
1038   int current_pass;
1039   int current_partition;
1040   int freq_threshold;
1041   gcov_type count_threshold;
1042   bool for_size = optimize_function_for_size_p (cfun);
1043
1044   freq_threshold = max_entry_frequency * DUPLICATION_THRESHOLD / 1000;
1045   if (max_entry_count < INT_MAX / 1000)
1046     count_threshold = max_entry_count * DUPLICATION_THRESHOLD / 1000;
1047   else
1048     count_threshold = max_entry_count / 1000 * DUPLICATION_THRESHOLD;
1049
1050   connected = XCNEWVEC (bool, n_traces);
1051   last_trace = -1;
1052   current_pass = 1;
1053   current_partition = BB_PARTITION (traces[0].first);
1054   two_passes = false;
1055
1056   if (crtl->has_bb_partition)
1057     for (i = 0; i < n_traces && !two_passes; i++)
1058       if (BB_PARTITION (traces[0].first)
1059           != BB_PARTITION (traces[i].first))
1060         two_passes = true;
1061
1062   for (i = 0; i < n_traces || (two_passes && current_pass == 1) ; i++)
1063     {
1064       int t = i;
1065       int t2;
1066       edge e, best;
1067       int best_len;
1068
1069       if (i >= n_traces)
1070         {
1071           gcc_assert (two_passes && current_pass == 1);
1072           i = 0;
1073           t = i;
1074           current_pass = 2;
1075           if (current_partition == BB_HOT_PARTITION)
1076             current_partition = BB_COLD_PARTITION;
1077           else
1078             current_partition = BB_HOT_PARTITION;
1079         }
1080
1081       if (connected[t])
1082         continue;
1083
1084       if (two_passes
1085           && BB_PARTITION (traces[t].first) != current_partition)
1086         continue;
1087
1088       connected[t] = true;
1089
1090       /* Find the predecessor traces.  */
1091       for (t2 = t; t2 > 0;)
1092         {
1093           edge_iterator ei;
1094           best = NULL;
1095           best_len = 0;
1096           FOR_EACH_EDGE (e, ei, traces[t2].first->preds)
1097             {
1098               int si = e->src->index;
1099
1100               if (e->src != ENTRY_BLOCK_PTR
1101                   && (e->flags & EDGE_CAN_FALLTHRU)
1102                   && !(e->flags & EDGE_COMPLEX)
1103                   && bbd[si].end_of_trace >= 0
1104                   && !connected[bbd[si].end_of_trace]
1105                   && (BB_PARTITION (e->src) == current_partition)
1106                   && connect_better_edge_p (e, true, best_len, best, traces))
1107                 {
1108                   best = e;
1109                   best_len = traces[bbd[si].end_of_trace].length;
1110                 }
1111             }
1112           if (best)
1113             {
1114               best->src->aux = best->dest;
1115               t2 = bbd[best->src->index].end_of_trace;
1116               connected[t2] = true;
1117
1118               if (dump_file)
1119                 {
1120                   fprintf (dump_file, "Connection: %d %d\n",
1121                            best->src->index, best->dest->index);
1122                 }
1123             }
1124           else
1125             break;
1126         }
1127
1128       if (last_trace >= 0)
1129         traces[last_trace].last->aux = traces[t2].first;
1130       last_trace = t;
1131
1132       /* Find the successor traces.  */
1133       while (1)
1134         {
1135           /* Find the continuation of the chain.  */
1136           edge_iterator ei;
1137           best = NULL;
1138           best_len = 0;
1139           FOR_EACH_EDGE (e, ei, traces[t].last->succs)
1140             {
1141               int di = e->dest->index;
1142
1143               if (e->dest != EXIT_BLOCK_PTR
1144                   && (e->flags & EDGE_CAN_FALLTHRU)
1145                   && !(e->flags & EDGE_COMPLEX)
1146                   && bbd[di].start_of_trace >= 0
1147                   && !connected[bbd[di].start_of_trace]
1148                   && (BB_PARTITION (e->dest) == current_partition)
1149                   && connect_better_edge_p (e, false, best_len, best, traces))
1150                 {
1151                   best = e;
1152                   best_len = traces[bbd[di].start_of_trace].length;
1153                 }
1154             }
1155
1156           if (for_size)
1157             {
1158               if (!best)
1159                 /* Stop finding the successor traces.  */
1160                 break;
1161
1162               /* It is OK to connect block n with block n + 1 or a block
1163                  before n.  For others, only connect to the loop header.  */
1164               if (best->dest->index > (traces[t].last->index + 1))
1165                 {
1166                   int count = EDGE_COUNT (best->dest->preds);
1167
1168                   FOR_EACH_EDGE (e, ei, best->dest->preds)
1169                     if (e->flags & EDGE_DFS_BACK)
1170                       count--;
1171
1172                   /* If dest has multiple predecessors, skip it.  We expect
1173                      that one predecessor with smaller index connects with it
1174                      later.  */
1175                   if (count != 1) 
1176                     break;
1177                 }
1178
1179               /* Only connect Trace n with Trace n + 1.  It is conservative
1180                  to keep the order as close as possible to the original order.
1181                  It also helps to reduce long jumps.  */
1182               if (last_trace != bbd[best->dest->index].start_of_trace - 1)
1183                 break;
1184
1185               if (dump_file)
1186                 fprintf (dump_file, "Connection: %d %d\n",
1187                          best->src->index, best->dest->index);
1188
1189               t = bbd[best->dest->index].start_of_trace;
1190               traces[last_trace].last->aux = traces[t].first;
1191               connected[t] = true;
1192               last_trace = t;
1193             }
1194           else if (best)
1195             {
1196               if (dump_file)
1197                 {
1198                   fprintf (dump_file, "Connection: %d %d\n",
1199                            best->src->index, best->dest->index);
1200                 }
1201               t = bbd[best->dest->index].start_of_trace;
1202               traces[last_trace].last->aux = traces[t].first;
1203               connected[t] = true;
1204               last_trace = t;
1205             }
1206           else
1207             {
1208               /* Try to connect the traces by duplication of 1 block.  */
1209               edge e2;
1210               basic_block next_bb = NULL;
1211               bool try_copy = false;
1212
1213               FOR_EACH_EDGE (e, ei, traces[t].last->succs)
1214                 if (e->dest != EXIT_BLOCK_PTR
1215                     && (e->flags & EDGE_CAN_FALLTHRU)
1216                     && !(e->flags & EDGE_COMPLEX)
1217                     && (!best || e->probability > best->probability))
1218                   {
1219                     edge_iterator ei;
1220                     edge best2 = NULL;
1221                     int best2_len = 0;
1222
1223                     /* If the destination is a start of a trace which is only
1224                        one block long, then no need to search the successor
1225                        blocks of the trace.  Accept it.  */
1226                     if (bbd[e->dest->index].start_of_trace >= 0
1227                         && traces[bbd[e->dest->index].start_of_trace].length
1228                            == 1)
1229                       {
1230                         best = e;
1231                         try_copy = true;
1232                         continue;
1233                       }
1234
1235                     FOR_EACH_EDGE (e2, ei, e->dest->succs)
1236                       {
1237                         int di = e2->dest->index;
1238
1239                         if (e2->dest == EXIT_BLOCK_PTR
1240                             || ((e2->flags & EDGE_CAN_FALLTHRU)
1241                                 && !(e2->flags & EDGE_COMPLEX)
1242                                 && bbd[di].start_of_trace >= 0
1243                                 && !connected[bbd[di].start_of_trace]
1244                                 && BB_PARTITION (e2->dest) == current_partition
1245                                 && EDGE_FREQUENCY (e2) >= freq_threshold
1246                                 && e2->count >= count_threshold
1247                                 && (!best2
1248                                     || e2->probability > best2->probability
1249                                     || (e2->probability == best2->probability
1250                                         && traces[bbd[di].start_of_trace].length
1251                                            > best2_len))))
1252                           {
1253                             best = e;
1254                             best2 = e2;
1255                             if (e2->dest != EXIT_BLOCK_PTR)
1256                               best2_len = traces[bbd[di].start_of_trace].length;
1257                             else
1258                               best2_len = INT_MAX;
1259                             next_bb = e2->dest;
1260                             try_copy = true;
1261                           }
1262                       }
1263                   }
1264
1265               if (crtl->has_bb_partition)
1266                 try_copy = false;
1267
1268               /* Copy tiny blocks always; copy larger blocks only when the
1269                  edge is traversed frequently enough.  */
1270               if (try_copy
1271                   && copy_bb_p (best->dest,
1272                                 optimize_edge_for_speed_p (best)
1273                                 && EDGE_FREQUENCY (best) >= freq_threshold
1274                                 && best->count >= count_threshold))
1275                 {
1276                   basic_block new_bb;
1277
1278                   if (dump_file)
1279                     {
1280                       fprintf (dump_file, "Connection: %d %d ",
1281                                traces[t].last->index, best->dest->index);
1282                       if (!next_bb)
1283                         fputc ('\n', dump_file);
1284                       else if (next_bb == EXIT_BLOCK_PTR)
1285                         fprintf (dump_file, "exit\n");
1286                       else
1287                         fprintf (dump_file, "%d\n", next_bb->index);
1288                     }
1289
1290                   new_bb = copy_bb (best->dest, best, traces[t].last, t);
1291                   traces[t].last = new_bb;
1292                   if (next_bb && next_bb != EXIT_BLOCK_PTR)
1293                     {
1294                       t = bbd[next_bb->index].start_of_trace;
1295                       traces[last_trace].last->aux = traces[t].first;
1296                       connected[t] = true;
1297                       last_trace = t;
1298                     }
1299                   else
1300                     break;      /* Stop finding the successor traces.  */
1301                 }
1302               else
1303                 break;  /* Stop finding the successor traces.  */
1304             }
1305         }
1306     }
1307
1308   if (dump_file)
1309     {
1310       basic_block bb;
1311
1312       fprintf (dump_file, "Final order:\n");
1313       for (bb = traces[0].first; bb; bb = (basic_block) bb->aux)
1314         fprintf (dump_file, "%d ", bb->index);
1315       fprintf (dump_file, "\n");
1316       fflush (dump_file);
1317     }
1318
1319   FREE (connected);
1320 }
1321
1322 /* Return true when BB can and should be copied. CODE_MAY_GROW is true
1323    when code size is allowed to grow by duplication.  */
1324
1325 static bool
1326 copy_bb_p (const_basic_block bb, int code_may_grow)
1327 {
1328   int size = 0;
1329   int max_size = uncond_jump_length;
1330   rtx insn;
1331
1332   if (!bb->frequency)
1333     return false;
1334   if (EDGE_COUNT (bb->preds) < 2)
1335     return false;
1336   if (!can_duplicate_block_p (bb))
1337     return false;
1338
1339   /* Avoid duplicating blocks which have many successors (PR/13430).  */
1340   if (EDGE_COUNT (bb->succs) > 8)
1341     return false;
1342
1343   if (code_may_grow && optimize_bb_for_speed_p (bb))
1344     max_size *= PARAM_VALUE (PARAM_MAX_GROW_COPY_BB_INSNS);
1345
1346   FOR_BB_INSNS (bb, insn)
1347     {
1348       if (INSN_P (insn))
1349         size += get_attr_min_length (insn);
1350     }
1351
1352   if (size <= max_size)
1353     return true;
1354
1355   if (dump_file)
1356     {
1357       fprintf (dump_file,
1358                "Block %d can't be copied because its size = %d.\n",
1359                bb->index, size);
1360     }
1361
1362   return false;
1363 }
1364
1365 /* Return the length of unconditional jump instruction.  */
1366
1367 int
1368 get_uncond_jump_length (void)
1369 {
1370   rtx label, jump;
1371   int length;
1372
1373   label = emit_label_before (gen_label_rtx (), get_insns ());
1374   jump = emit_jump_insn (gen_jump (label));
1375
1376   length = get_attr_min_length (jump);
1377
1378   delete_insn (jump);
1379   delete_insn (label);
1380   return length;
1381 }
1382
1383 /* The landing pad OLD_LP, in block OLD_BB, has edges from both partitions.
1384    Duplicate the landing pad and split the edges so that no EH edge
1385    crosses partitions.  */
1386
1387 static void
1388 fix_up_crossing_landing_pad (eh_landing_pad old_lp, basic_block old_bb)
1389 {
1390   eh_landing_pad new_lp;
1391   basic_block new_bb, last_bb, post_bb;
1392   rtx new_label, jump, post_label;
1393   unsigned new_partition;
1394   edge_iterator ei;
1395   edge e;
1396
1397   /* Generate the new landing-pad structure.  */
1398   new_lp = gen_eh_landing_pad (old_lp->region);
1399   new_lp->post_landing_pad = old_lp->post_landing_pad;
1400   new_lp->landing_pad = gen_label_rtx ();
1401   LABEL_PRESERVE_P (new_lp->landing_pad) = 1;
1402
1403   /* Put appropriate instructions in new bb.  */
1404   new_label = emit_label (new_lp->landing_pad);
1405
1406   expand_dw2_landing_pad_for_region (old_lp->region);
1407
1408   post_bb = BLOCK_FOR_INSN (old_lp->landing_pad);
1409   post_bb = single_succ (post_bb);
1410   post_label = block_label (post_bb);
1411   jump = emit_jump_insn (gen_jump (post_label));
1412   JUMP_LABEL (jump) = post_label;
1413
1414   /* Create new basic block to be dest for lp.  */
1415   last_bb = EXIT_BLOCK_PTR->prev_bb;
1416   new_bb = create_basic_block (new_label, jump, last_bb);
1417   new_bb->aux = last_bb->aux;
1418   last_bb->aux = new_bb;
1419
1420   emit_barrier_after_bb (new_bb);
1421
1422   make_edge (new_bb, post_bb, 0);
1423
1424   /* Make sure new bb is in the other partition.  */
1425   new_partition = BB_PARTITION (old_bb);
1426   new_partition ^= BB_HOT_PARTITION | BB_COLD_PARTITION;
1427   BB_SET_PARTITION (new_bb, new_partition);
1428
1429   /* Fix up the edges.  */
1430   for (ei = ei_start (old_bb->preds); (e = ei_safe_edge (ei)) != NULL; )
1431     if (BB_PARTITION (e->src) == new_partition)
1432       {
1433         rtx insn = BB_END (e->src);
1434         rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
1435
1436         gcc_assert (note != NULL);
1437         gcc_checking_assert (INTVAL (XEXP (note, 0)) == old_lp->index);
1438         XEXP (note, 0) = GEN_INT (new_lp->index);
1439
1440         /* Adjust the edge to the new destination.  */
1441         redirect_edge_succ (e, new_bb);
1442       }
1443     else
1444       ei_next (&ei);
1445 }
1446
1447
1448 /* Ensure that all hot bbs are included in a hot path through the
1449    procedure. This is done by calling this function twice, once
1450    with WALK_UP true (to look for paths from the entry to hot bbs) and
1451    once with WALK_UP false (to look for paths from hot bbs to the exit).
1452    Returns the updated value of COLD_BB_COUNT and adds newly-hot bbs
1453    to BBS_IN_HOT_PARTITION.  */
1454
1455 static unsigned int
1456 sanitize_hot_paths (bool walk_up, unsigned int cold_bb_count,
1457                     vec<basic_block> *bbs_in_hot_partition)
1458 {
1459   /* Callers check this.  */
1460   gcc_checking_assert (cold_bb_count);
1461
1462   /* Keep examining hot bbs while we still have some left to check
1463      and there are remaining cold bbs.  */
1464   vec<basic_block> hot_bbs_to_check = bbs_in_hot_partition->copy ();
1465   while (! hot_bbs_to_check.is_empty ()
1466          && cold_bb_count)
1467     {
1468       basic_block bb = hot_bbs_to_check.pop ();
1469       vec<edge, va_gc> *edges = walk_up ? bb->preds : bb->succs;
1470       edge e;
1471       edge_iterator ei;
1472       int highest_probability = 0;
1473       int highest_freq = 0;
1474       gcov_type highest_count = 0;
1475       bool found = false;
1476
1477       /* Walk the preds/succs and check if there is at least one already
1478          marked hot. Keep track of the most frequent pred/succ so that we
1479          can mark it hot if we don't find one.  */
1480       FOR_EACH_EDGE (e, ei, edges)
1481         {
1482           basic_block reach_bb = walk_up ? e->src : e->dest;
1483
1484           if (e->flags & EDGE_DFS_BACK)
1485             continue;
1486
1487           if (BB_PARTITION (reach_bb) != BB_COLD_PARTITION)
1488           {
1489             found = true;
1490             break;
1491           }
1492           /* The following loop will look for the hottest edge via
1493              the edge count, if it is non-zero, then fallback to the edge
1494              frequency and finally the edge probability.  */
1495           if (e->count > highest_count)
1496             highest_count = e->count;
1497           int edge_freq = EDGE_FREQUENCY (e);
1498           if (edge_freq > highest_freq)
1499             highest_freq = edge_freq;
1500           if (e->probability > highest_probability)
1501             highest_probability = e->probability;
1502         }
1503
1504       /* If bb is reached by (or reaches, in the case of !WALK_UP) another hot
1505          block (or unpartitioned, e.g. the entry block) then it is ok. If not,
1506          then the most frequent pred (or succ) needs to be adjusted.  In the
1507          case where multiple preds/succs have the same frequency (e.g. a
1508          50-50 branch), then both will be adjusted.  */
1509       if (found)
1510         continue;
1511
1512       FOR_EACH_EDGE (e, ei, edges)
1513         {
1514           if (e->flags & EDGE_DFS_BACK)
1515             continue;
1516           /* Select the hottest edge using the edge count, if it is non-zero,
1517              then fallback to the edge frequency and finally the edge
1518              probability.  */
1519           if (highest_count)
1520             {
1521               if (e->count < highest_count)
1522                 continue;
1523             }
1524           else if (highest_freq)
1525             {
1526               if (EDGE_FREQUENCY (e) < highest_freq)
1527                 continue;
1528             }
1529           else if (e->probability < highest_probability)
1530             continue;
1531
1532           basic_block reach_bb = walk_up ? e->src : e->dest;
1533
1534           /* We have a hot bb with an immediate dominator that is cold.
1535              The dominator needs to be re-marked hot.  */
1536           BB_SET_PARTITION (reach_bb, BB_HOT_PARTITION);
1537           cold_bb_count--;
1538
1539           /* Now we need to examine newly-hot reach_bb to see if it is also
1540              dominated by a cold bb.  */
1541           bbs_in_hot_partition->safe_push (reach_bb);
1542           hot_bbs_to_check.safe_push (reach_bb);
1543         }
1544     }
1545
1546   return cold_bb_count;
1547 }
1548
1549
1550 /* Find the basic blocks that are rarely executed and need to be moved to
1551    a separate section of the .o file (to cut down on paging and improve
1552    cache locality).  Return a vector of all edges that cross.  */
1553
1554 static vec<edge>
1555 find_rarely_executed_basic_blocks_and_crossing_edges (void)
1556 {
1557   vec<edge> crossing_edges = vNULL;
1558   basic_block bb;
1559   edge e;
1560   edge_iterator ei;
1561   unsigned int cold_bb_count = 0;
1562   vec<basic_block> bbs_in_hot_partition = vNULL;
1563
1564   /* Mark which partition (hot/cold) each basic block belongs in.  */
1565   FOR_EACH_BB (bb)
1566     {
1567       if (probably_never_executed_bb_p (cfun, bb))
1568         {
1569           BB_SET_PARTITION (bb, BB_COLD_PARTITION);
1570           cold_bb_count++;
1571         }
1572       else
1573         {
1574           BB_SET_PARTITION (bb, BB_HOT_PARTITION);
1575           bbs_in_hot_partition.safe_push (bb);
1576         }
1577     }
1578
1579   /* Ensure that hot bbs are included along a hot path from the entry to exit.
1580      Several different possibilities may include cold bbs along all paths
1581      to/from a hot bb. One is that there are edge weight insanities
1582      due to optimization phases that do not properly update basic block profile
1583      counts. The second is that the entry of the function may not be hot, because
1584      it is entered fewer times than the number of profile training runs, but there
1585      is a loop inside the function that causes blocks within the function to be
1586      above the threshold for hotness. This is fixed by walking up from hot bbs
1587      to the entry block, and then down from hot bbs to the exit, performing
1588      partitioning fixups as necessary.  */
1589   if (cold_bb_count)
1590     {
1591       mark_dfs_back_edges ();
1592       cold_bb_count = sanitize_hot_paths (true, cold_bb_count,
1593                                           &bbs_in_hot_partition);
1594       if (cold_bb_count)
1595         sanitize_hot_paths (false, cold_bb_count, &bbs_in_hot_partition);
1596     }
1597
1598   /* The format of .gcc_except_table does not allow landing pads to
1599      be in a different partition as the throw.  Fix this by either
1600      moving or duplicating the landing pads.  */
1601   if (cfun->eh->lp_array)
1602     {
1603       unsigned i;
1604       eh_landing_pad lp;
1605
1606       FOR_EACH_VEC_ELT (*cfun->eh->lp_array, i, lp)
1607         {
1608           bool all_same, all_diff;
1609
1610           if (lp == NULL
1611               || lp->landing_pad == NULL_RTX
1612               || !LABEL_P (lp->landing_pad))
1613             continue;
1614
1615           all_same = all_diff = true;
1616           bb = BLOCK_FOR_INSN (lp->landing_pad);
1617           FOR_EACH_EDGE (e, ei, bb->preds)
1618             {
1619               gcc_assert (e->flags & EDGE_EH);
1620               if (BB_PARTITION (bb) == BB_PARTITION (e->src))
1621                 all_diff = false;
1622               else
1623                 all_same = false;
1624             }
1625
1626           if (all_same)
1627             ;
1628           else if (all_diff)
1629             {
1630               int which = BB_PARTITION (bb);
1631               which ^= BB_HOT_PARTITION | BB_COLD_PARTITION;
1632               BB_SET_PARTITION (bb, which);
1633             }
1634           else
1635             fix_up_crossing_landing_pad (lp, bb);
1636         }
1637     }
1638
1639   /* Mark every edge that crosses between sections.  */
1640
1641   FOR_EACH_BB (bb)
1642     FOR_EACH_EDGE (e, ei, bb->succs)
1643       {
1644         unsigned int flags = e->flags;
1645
1646         /* We should never have EDGE_CROSSING set yet.  */
1647         gcc_checking_assert ((flags & EDGE_CROSSING) == 0);
1648
1649         if (e->src != ENTRY_BLOCK_PTR
1650             && e->dest != EXIT_BLOCK_PTR
1651             && BB_PARTITION (e->src) != BB_PARTITION (e->dest))
1652           {
1653             crossing_edges.safe_push (e);
1654             flags |= EDGE_CROSSING;
1655           }
1656
1657         /* Now that we've split eh edges as appropriate, allow landing pads
1658            to be merged with the post-landing pads.  */
1659         flags &= ~EDGE_PRESERVE;
1660
1661         e->flags = flags;
1662       }
1663
1664   return crossing_edges;
1665 }
1666
1667 /* Set the flag EDGE_CAN_FALLTHRU for edges that can be fallthru.  */
1668
1669 static void
1670 set_edge_can_fallthru_flag (void)
1671 {
1672   basic_block bb;
1673
1674   FOR_EACH_BB (bb)
1675     {
1676       edge e;
1677       edge_iterator ei;
1678
1679       FOR_EACH_EDGE (e, ei, bb->succs)
1680         {
1681           e->flags &= ~EDGE_CAN_FALLTHRU;
1682
1683           /* The FALLTHRU edge is also CAN_FALLTHRU edge.  */
1684           if (e->flags & EDGE_FALLTHRU)
1685             e->flags |= EDGE_CAN_FALLTHRU;
1686         }
1687
1688       /* If the BB ends with an invertible condjump all (2) edges are
1689          CAN_FALLTHRU edges.  */
1690       if (EDGE_COUNT (bb->succs) != 2)
1691         continue;
1692       if (!any_condjump_p (BB_END (bb)))
1693         continue;
1694       if (!invert_jump (BB_END (bb), JUMP_LABEL (BB_END (bb)), 0))
1695         continue;
1696       invert_jump (BB_END (bb), JUMP_LABEL (BB_END (bb)), 0);
1697       EDGE_SUCC (bb, 0)->flags |= EDGE_CAN_FALLTHRU;
1698       EDGE_SUCC (bb, 1)->flags |= EDGE_CAN_FALLTHRU;
1699     }
1700 }
1701
1702 /* If any destination of a crossing edge does not have a label, add label;
1703    Convert any easy fall-through crossing edges to unconditional jumps.  */
1704
1705 static void
1706 add_labels_and_missing_jumps (vec<edge> crossing_edges)
1707 {
1708   size_t i;
1709   edge e;
1710
1711   FOR_EACH_VEC_ELT (crossing_edges, i, e)
1712     {
1713       basic_block src = e->src;
1714       basic_block dest = e->dest;
1715       rtx label, new_jump;
1716
1717       if (dest == EXIT_BLOCK_PTR)
1718         continue;
1719
1720       /* Make sure dest has a label.  */
1721       label = block_label (dest);
1722
1723       /* Nothing to do for non-fallthru edges.  */
1724       if (src == ENTRY_BLOCK_PTR)
1725         continue;
1726       if ((e->flags & EDGE_FALLTHRU) == 0)
1727         continue;
1728
1729       /* If the block does not end with a control flow insn, then we
1730          can trivially add a jump to the end to fixup the crossing.
1731          Otherwise the jump will have to go in a new bb, which will
1732          be handled by fix_up_fall_thru_edges function.  */
1733       if (control_flow_insn_p (BB_END (src)))
1734         continue;
1735
1736       /* Make sure there's only one successor.  */
1737       gcc_assert (single_succ_p (src));
1738
1739       new_jump = emit_jump_insn_after (gen_jump (label), BB_END (src));
1740       BB_END (src) = new_jump;
1741       JUMP_LABEL (new_jump) = label;
1742       LABEL_NUSES (label) += 1;
1743
1744       emit_barrier_after_bb (src);
1745
1746       /* Mark edge as non-fallthru.  */
1747       e->flags &= ~EDGE_FALLTHRU;
1748     }
1749 }
1750
1751 /* Find any bb's where the fall-through edge is a crossing edge (note that
1752    these bb's must also contain a conditional jump or end with a call
1753    instruction; we've already dealt with fall-through edges for blocks
1754    that didn't have a conditional jump or didn't end with call instruction
1755    in the call to add_labels_and_missing_jumps).  Convert the fall-through
1756    edge to non-crossing edge by inserting a new bb to fall-through into.
1757    The new bb will contain an unconditional jump (crossing edge) to the
1758    original fall through destination.  */
1759
1760 static void
1761 fix_up_fall_thru_edges (void)
1762 {
1763   basic_block cur_bb;
1764   basic_block new_bb;
1765   edge succ1;
1766   edge succ2;
1767   edge fall_thru;
1768   edge cond_jump = NULL;
1769   edge e;
1770   bool cond_jump_crosses;
1771   int invert_worked;
1772   rtx old_jump;
1773   rtx fall_thru_label;
1774
1775   FOR_EACH_BB (cur_bb)
1776     {
1777       fall_thru = NULL;
1778       if (EDGE_COUNT (cur_bb->succs) > 0)
1779         succ1 = EDGE_SUCC (cur_bb, 0);
1780       else
1781         succ1 = NULL;
1782
1783       if (EDGE_COUNT (cur_bb->succs) > 1)
1784         succ2 = EDGE_SUCC (cur_bb, 1);
1785       else
1786         succ2 = NULL;
1787
1788       /* Find the fall-through edge.  */
1789
1790       if (succ1
1791           && (succ1->flags & EDGE_FALLTHRU))
1792         {
1793           fall_thru = succ1;
1794           cond_jump = succ2;
1795         }
1796       else if (succ2
1797                && (succ2->flags & EDGE_FALLTHRU))
1798         {
1799           fall_thru = succ2;
1800           cond_jump = succ1;
1801         }
1802       else if (succ1
1803                && (block_ends_with_call_p (cur_bb)
1804                    || can_throw_internal (BB_END (cur_bb))))
1805         {
1806           edge e;
1807           edge_iterator ei;
1808
1809           /* Find EDGE_CAN_FALLTHRU edge.  */
1810           FOR_EACH_EDGE (e, ei, cur_bb->succs)
1811             if (e->flags & EDGE_CAN_FALLTHRU)
1812               {
1813                 fall_thru = e;
1814                 break;
1815               }
1816         }
1817
1818       if (fall_thru && (fall_thru->dest != EXIT_BLOCK_PTR))
1819         {
1820           /* Check to see if the fall-thru edge is a crossing edge.  */
1821
1822           if (fall_thru->flags & EDGE_CROSSING)
1823             {
1824               /* The fall_thru edge crosses; now check the cond jump edge, if
1825                  it exists.  */
1826
1827               cond_jump_crosses = true;
1828               invert_worked  = 0;
1829               old_jump = BB_END (cur_bb);
1830
1831               /* Find the jump instruction, if there is one.  */
1832
1833               if (cond_jump)
1834                 {
1835                   if (!(cond_jump->flags & EDGE_CROSSING))
1836                     cond_jump_crosses = false;
1837
1838                   /* We know the fall-thru edge crosses; if the cond
1839                      jump edge does NOT cross, and its destination is the
1840                      next block in the bb order, invert the jump
1841                      (i.e. fix it so the fall through does not cross and
1842                      the cond jump does).  */
1843
1844                   if (!cond_jump_crosses)
1845                     {
1846                       /* Find label in fall_thru block. We've already added
1847                          any missing labels, so there must be one.  */
1848
1849                       fall_thru_label = block_label (fall_thru->dest);
1850
1851                       if (old_jump && JUMP_P (old_jump) && fall_thru_label)
1852                         invert_worked = invert_jump (old_jump,
1853                                                      fall_thru_label,0);
1854                       if (invert_worked)
1855                         {
1856                           fall_thru->flags &= ~EDGE_FALLTHRU;
1857                           cond_jump->flags |= EDGE_FALLTHRU;
1858                           update_br_prob_note (cur_bb);
1859                           e = fall_thru;
1860                           fall_thru = cond_jump;
1861                           cond_jump = e;
1862                           cond_jump->flags |= EDGE_CROSSING;
1863                           fall_thru->flags &= ~EDGE_CROSSING;
1864                         }
1865                     }
1866                 }
1867
1868               if (cond_jump_crosses || !invert_worked)
1869                 {
1870                   /* This is the case where both edges out of the basic
1871                      block are crossing edges. Here we will fix up the
1872                      fall through edge. The jump edge will be taken care
1873                      of later.  The EDGE_CROSSING flag of fall_thru edge
1874                      is unset before the call to force_nonfallthru
1875                      function because if a new basic-block is created
1876                      this edge remains in the current section boundary
1877                      while the edge between new_bb and the fall_thru->dest
1878                      becomes EDGE_CROSSING.  */
1879
1880                   fall_thru->flags &= ~EDGE_CROSSING;
1881                   new_bb = force_nonfallthru (fall_thru);
1882
1883                   if (new_bb)
1884                     {
1885                       new_bb->aux = cur_bb->aux;
1886                       cur_bb->aux = new_bb;
1887
1888                       /* This is done by force_nonfallthru_and_redirect.  */
1889                       gcc_assert (BB_PARTITION (new_bb)
1890                                   == BB_PARTITION (cur_bb));
1891
1892                       single_succ_edge (new_bb)->flags |= EDGE_CROSSING;
1893                     }
1894                   else
1895                     {
1896                       /* If a new basic-block was not created; restore
1897                          the EDGE_CROSSING flag.  */
1898                       fall_thru->flags |= EDGE_CROSSING;
1899                     }
1900
1901                   /* Add barrier after new jump */
1902                   emit_barrier_after_bb (new_bb ? new_bb : cur_bb);
1903                 }
1904             }
1905         }
1906     }
1907 }
1908
1909 /* This function checks the destination block of a "crossing jump" to
1910    see if it has any crossing predecessors that begin with a code label
1911    and end with an unconditional jump.  If so, it returns that predecessor
1912    block.  (This is to avoid creating lots of new basic blocks that all
1913    contain unconditional jumps to the same destination).  */
1914
1915 static basic_block
1916 find_jump_block (basic_block jump_dest)
1917 {
1918   basic_block source_bb = NULL;
1919   edge e;
1920   rtx insn;
1921   edge_iterator ei;
1922
1923   FOR_EACH_EDGE (e, ei, jump_dest->preds)
1924     if (e->flags & EDGE_CROSSING)
1925       {
1926         basic_block src = e->src;
1927
1928         /* Check each predecessor to see if it has a label, and contains
1929            only one executable instruction, which is an unconditional jump.
1930            If so, we can use it.  */
1931
1932         if (LABEL_P (BB_HEAD (src)))
1933           for (insn = BB_HEAD (src);
1934                !INSN_P (insn) && insn != NEXT_INSN (BB_END (src));
1935                insn = NEXT_INSN (insn))
1936             {
1937               if (INSN_P (insn)
1938                   && insn == BB_END (src)
1939                   && JUMP_P (insn)
1940                   && !any_condjump_p (insn))
1941                 {
1942                   source_bb = src;
1943                   break;
1944                 }
1945             }
1946
1947         if (source_bb)
1948           break;
1949       }
1950
1951   return source_bb;
1952 }
1953
1954 /* Find all BB's with conditional jumps that are crossing edges;
1955    insert a new bb and make the conditional jump branch to the new
1956    bb instead (make the new bb same color so conditional branch won't
1957    be a 'crossing' edge).  Insert an unconditional jump from the
1958    new bb to the original destination of the conditional jump.  */
1959
1960 static void
1961 fix_crossing_conditional_branches (void)
1962 {
1963   basic_block cur_bb;
1964   basic_block new_bb;
1965   basic_block dest;
1966   edge succ1;
1967   edge succ2;
1968   edge crossing_edge;
1969   edge new_edge;
1970   rtx old_jump;
1971   rtx set_src;
1972   rtx old_label = NULL_RTX;
1973   rtx new_label;
1974
1975   FOR_EACH_BB (cur_bb)
1976     {
1977       crossing_edge = NULL;
1978       if (EDGE_COUNT (cur_bb->succs) > 0)
1979         succ1 = EDGE_SUCC (cur_bb, 0);
1980       else
1981         succ1 = NULL;
1982
1983       if (EDGE_COUNT (cur_bb->succs) > 1)
1984         succ2 = EDGE_SUCC (cur_bb, 1);
1985       else
1986         succ2 = NULL;
1987
1988       /* We already took care of fall-through edges, so only one successor
1989          can be a crossing edge.  */
1990
1991       if (succ1 && (succ1->flags & EDGE_CROSSING))
1992         crossing_edge = succ1;
1993       else if (succ2 && (succ2->flags & EDGE_CROSSING))
1994         crossing_edge = succ2;
1995
1996       if (crossing_edge)
1997         {
1998           old_jump = BB_END (cur_bb);
1999
2000           /* Check to make sure the jump instruction is a
2001              conditional jump.  */
2002
2003           set_src = NULL_RTX;
2004
2005           if (any_condjump_p (old_jump))
2006             {
2007               if (GET_CODE (PATTERN (old_jump)) == SET)
2008                 set_src = SET_SRC (PATTERN (old_jump));
2009               else if (GET_CODE (PATTERN (old_jump)) == PARALLEL)
2010                 {
2011                   set_src = XVECEXP (PATTERN (old_jump), 0,0);
2012                   if (GET_CODE (set_src) == SET)
2013                     set_src = SET_SRC (set_src);
2014                   else
2015                     set_src = NULL_RTX;
2016                 }
2017             }
2018
2019           if (set_src && (GET_CODE (set_src) == IF_THEN_ELSE))
2020             {
2021               if (GET_CODE (XEXP (set_src, 1)) == PC)
2022                 old_label = XEXP (set_src, 2);
2023               else if (GET_CODE (XEXP (set_src, 2)) == PC)
2024                 old_label = XEXP (set_src, 1);
2025
2026               /* Check to see if new bb for jumping to that dest has
2027                  already been created; if so, use it; if not, create
2028                  a new one.  */
2029
2030               new_bb = find_jump_block (crossing_edge->dest);
2031
2032               if (new_bb)
2033                 new_label = block_label (new_bb);
2034               else
2035                 {
2036                   basic_block last_bb;
2037                   rtx new_jump;
2038
2039                   /* Create new basic block to be dest for
2040                      conditional jump.  */
2041
2042                   /* Put appropriate instructions in new bb.  */
2043
2044                   new_label = gen_label_rtx ();
2045                   emit_label (new_label);
2046
2047                   gcc_assert (GET_CODE (old_label) == LABEL_REF);
2048                   old_label = JUMP_LABEL (old_jump);
2049                   new_jump = emit_jump_insn (gen_jump (old_label));
2050                   JUMP_LABEL (new_jump) = old_label;
2051
2052                   last_bb = EXIT_BLOCK_PTR->prev_bb;
2053                   new_bb = create_basic_block (new_label, new_jump, last_bb);
2054                   new_bb->aux = last_bb->aux;
2055                   last_bb->aux = new_bb;
2056
2057                   emit_barrier_after_bb (new_bb);
2058
2059                   /* Make sure new bb is in same partition as source
2060                      of conditional branch.  */
2061                   BB_COPY_PARTITION (new_bb, cur_bb);
2062                 }
2063
2064               /* Make old jump branch to new bb.  */
2065
2066               redirect_jump (old_jump, new_label, 0);
2067
2068               /* Remove crossing_edge as predecessor of 'dest'.  */
2069
2070               dest = crossing_edge->dest;
2071
2072               redirect_edge_succ (crossing_edge, new_bb);
2073
2074               /* Make a new edge from new_bb to old dest; new edge
2075                  will be a successor for new_bb and a predecessor
2076                  for 'dest'.  */
2077
2078               if (EDGE_COUNT (new_bb->succs) == 0)
2079                 new_edge = make_edge (new_bb, dest, 0);
2080               else
2081                 new_edge = EDGE_SUCC (new_bb, 0);
2082
2083               crossing_edge->flags &= ~EDGE_CROSSING;
2084               new_edge->flags |= EDGE_CROSSING;
2085             }
2086         }
2087     }
2088 }
2089
2090 /* Find any unconditional branches that cross between hot and cold
2091    sections.  Convert them into indirect jumps instead.  */
2092
2093 static void
2094 fix_crossing_unconditional_branches (void)
2095 {
2096   basic_block cur_bb;
2097   rtx last_insn;
2098   rtx label;
2099   rtx label_addr;
2100   rtx indirect_jump_sequence;
2101   rtx jump_insn = NULL_RTX;
2102   rtx new_reg;
2103   rtx cur_insn;
2104   edge succ;
2105
2106   FOR_EACH_BB (cur_bb)
2107     {
2108       last_insn = BB_END (cur_bb);
2109
2110       if (EDGE_COUNT (cur_bb->succs) < 1)
2111         continue;
2112
2113       succ = EDGE_SUCC (cur_bb, 0);
2114
2115       /* Check to see if bb ends in a crossing (unconditional) jump.  At
2116          this point, no crossing jumps should be conditional.  */
2117
2118       if (JUMP_P (last_insn)
2119           && (succ->flags & EDGE_CROSSING))
2120         {
2121           gcc_assert (!any_condjump_p (last_insn));
2122
2123           /* Make sure the jump is not already an indirect or table jump.  */
2124
2125           if (!computed_jump_p (last_insn)
2126               && !tablejump_p (last_insn, NULL, NULL))
2127             {
2128               /* We have found a "crossing" unconditional branch.  Now
2129                  we must convert it to an indirect jump.  First create
2130                  reference of label, as target for jump.  */
2131
2132               label = JUMP_LABEL (last_insn);
2133               label_addr = gen_rtx_LABEL_REF (Pmode, label);
2134               LABEL_NUSES (label) += 1;
2135
2136               /* Get a register to use for the indirect jump.  */
2137
2138               new_reg = gen_reg_rtx (Pmode);
2139
2140               /* Generate indirect the jump sequence.  */
2141
2142               start_sequence ();
2143               emit_move_insn (new_reg, label_addr);
2144               emit_indirect_jump (new_reg);
2145               indirect_jump_sequence = get_insns ();
2146               end_sequence ();
2147
2148               /* Make sure every instruction in the new jump sequence has
2149                  its basic block set to be cur_bb.  */
2150
2151               for (cur_insn = indirect_jump_sequence; cur_insn;
2152                    cur_insn = NEXT_INSN (cur_insn))
2153                 {
2154                   if (!BARRIER_P (cur_insn))
2155                     BLOCK_FOR_INSN (cur_insn) = cur_bb;
2156                   if (JUMP_P (cur_insn))
2157                     jump_insn = cur_insn;
2158                 }
2159
2160               /* Insert the new (indirect) jump sequence immediately before
2161                  the unconditional jump, then delete the unconditional jump.  */
2162
2163               emit_insn_before (indirect_jump_sequence, last_insn);
2164               delete_insn (last_insn);
2165
2166               /* Make BB_END for cur_bb be the jump instruction (NOT the
2167                  barrier instruction at the end of the sequence...).  */
2168
2169               BB_END (cur_bb) = jump_insn;
2170             }
2171         }
2172     }
2173 }
2174
2175 /* Add REG_CROSSING_JUMP note to all crossing jump insns.  */
2176
2177 static void
2178 add_reg_crossing_jump_notes (void)
2179 {
2180   basic_block bb;
2181   edge e;
2182   edge_iterator ei;
2183
2184   FOR_EACH_BB (bb)
2185     FOR_EACH_EDGE (e, ei, bb->succs)
2186       if ((e->flags & EDGE_CROSSING)
2187           && JUMP_P (BB_END (e->src))
2188           /* Some notes were added during fix_up_fall_thru_edges, via
2189              force_nonfallthru_and_redirect.  */
2190           && !find_reg_note (BB_END (e->src), REG_CROSSING_JUMP, NULL_RTX))
2191         add_reg_note (BB_END (e->src), REG_CROSSING_JUMP, NULL_RTX);
2192 }
2193
2194 /* Reorder basic blocks.  The main entry point to this file.  FLAGS is
2195    the set of flags to pass to cfg_layout_initialize().  */
2196
2197 static void
2198 reorder_basic_blocks (void)
2199 {
2200   int n_traces;
2201   int i;
2202   struct trace *traces;
2203
2204   gcc_assert (current_ir_type () == IR_RTL_CFGLAYOUT);
2205
2206   if (n_basic_blocks <= NUM_FIXED_BLOCKS + 1)
2207     return;
2208
2209   set_edge_can_fallthru_flag ();
2210   mark_dfs_back_edges ();
2211
2212   /* We are estimating the length of uncond jump insn only once since the code
2213      for getting the insn length always returns the minimal length now.  */
2214   if (uncond_jump_length == 0)
2215     uncond_jump_length = get_uncond_jump_length ();
2216
2217   /* We need to know some information for each basic block.  */
2218   array_size = GET_ARRAY_SIZE (last_basic_block);
2219   bbd = XNEWVEC (bbro_basic_block_data, array_size);
2220   for (i = 0; i < array_size; i++)
2221     {
2222       bbd[i].start_of_trace = -1;
2223       bbd[i].end_of_trace = -1;
2224       bbd[i].in_trace = -1;
2225       bbd[i].visited = 0;
2226       bbd[i].heap = NULL;
2227       bbd[i].node = NULL;
2228     }
2229
2230   traces = XNEWVEC (struct trace, n_basic_blocks);
2231   n_traces = 0;
2232   find_traces (&n_traces, traces);
2233   connect_traces (n_traces, traces);
2234   FREE (traces);
2235   FREE (bbd);
2236
2237   relink_block_chain (/*stay_in_cfglayout_mode=*/true);
2238
2239   if (dump_file)
2240     {
2241       if (dump_flags & TDF_DETAILS)
2242         dump_reg_info (dump_file);
2243       dump_flow_info (dump_file, dump_flags);
2244     }
2245
2246   /* Signal that rtl_verify_flow_info_1 can now verify that there
2247      is at most one switch between hot/cold sections.  */
2248   crtl->bb_reorder_complete = true;
2249 }
2250
2251 /* Determine which partition the first basic block in the function
2252    belongs to, then find the first basic block in the current function
2253    that belongs to a different section, and insert a
2254    NOTE_INSN_SWITCH_TEXT_SECTIONS note immediately before it in the
2255    instruction stream.  When writing out the assembly code,
2256    encountering this note will make the compiler switch between the
2257    hot and cold text sections.  */
2258
2259 void
2260 insert_section_boundary_note (void)
2261 {
2262   basic_block bb;
2263   bool switched_sections = false;
2264   int current_partition = 0;
2265
2266   if (!crtl->has_bb_partition)
2267     return;
2268
2269   FOR_EACH_BB (bb)
2270     {
2271       if (!current_partition)
2272         current_partition = BB_PARTITION (bb);
2273       if (BB_PARTITION (bb) != current_partition)
2274         {
2275           gcc_assert (!switched_sections);
2276           switched_sections = true;
2277           emit_note_before (NOTE_INSN_SWITCH_TEXT_SECTIONS, BB_HEAD (bb));
2278           current_partition = BB_PARTITION (bb);
2279         }
2280     }
2281 }
2282
2283 static bool
2284 gate_handle_reorder_blocks (void)
2285 {
2286   if (targetm.cannot_modify_jumps_p ())
2287     return false;
2288   return (optimize > 0
2289           && (flag_reorder_blocks || flag_reorder_blocks_and_partition));
2290 }
2291
2292 static unsigned int
2293 rest_of_handle_reorder_blocks (void)
2294 {
2295   basic_block bb;
2296
2297   /* Last attempt to optimize CFG, as scheduling, peepholing and insn
2298      splitting possibly introduced more crossjumping opportunities.  */
2299   cfg_layout_initialize (CLEANUP_EXPENSIVE);
2300
2301   reorder_basic_blocks ();
2302   cleanup_cfg (CLEANUP_EXPENSIVE);
2303
2304   FOR_EACH_BB (bb)
2305     if (bb->next_bb != EXIT_BLOCK_PTR)
2306       bb->aux = bb->next_bb;
2307   cfg_layout_finalize ();
2308
2309   return 0;
2310 }
2311
2312 namespace {
2313
2314 const pass_data pass_data_reorder_blocks =
2315 {
2316   RTL_PASS, /* type */
2317   "bbro", /* name */
2318   OPTGROUP_NONE, /* optinfo_flags */
2319   true, /* has_gate */
2320   true, /* has_execute */
2321   TV_REORDER_BLOCKS, /* tv_id */
2322   0, /* properties_required */
2323   0, /* properties_provided */
2324   0, /* properties_destroyed */
2325   0, /* todo_flags_start */
2326   TODO_verify_rtl_sharing, /* todo_flags_finish */
2327 };
2328
2329 class pass_reorder_blocks : public rtl_opt_pass
2330 {
2331 public:
2332   pass_reorder_blocks(gcc::context *ctxt)
2333     : rtl_opt_pass(pass_data_reorder_blocks, ctxt)
2334   {}
2335
2336   /* opt_pass methods: */
2337   bool gate () { return gate_handle_reorder_blocks (); }
2338   unsigned int execute () { return rest_of_handle_reorder_blocks (); }
2339
2340 }; // class pass_reorder_blocks
2341
2342 } // anon namespace
2343
2344 rtl_opt_pass *
2345 make_pass_reorder_blocks (gcc::context *ctxt)
2346 {
2347   return new pass_reorder_blocks (ctxt);
2348 }
2349
2350 /* Duplicate the blocks containing computed gotos.  This basically unfactors
2351    computed gotos that were factored early on in the compilation process to
2352    speed up edge based data flow.  We used to not unfactoring them again,
2353    which can seriously pessimize code with many computed jumps in the source
2354    code, such as interpreters.  See e.g. PR15242.  */
2355
2356 static bool
2357 gate_duplicate_computed_gotos (void)
2358 {
2359   if (targetm.cannot_modify_jumps_p ())
2360     return false;
2361   return (optimize > 0
2362           && flag_expensive_optimizations
2363           && ! optimize_function_for_size_p (cfun));
2364 }
2365
2366
2367 static unsigned int
2368 duplicate_computed_gotos (void)
2369 {
2370   basic_block bb, new_bb;
2371   bitmap candidates;
2372   int max_size;
2373
2374   if (n_basic_blocks <= NUM_FIXED_BLOCKS + 1)
2375     return 0;
2376
2377   clear_bb_flags ();
2378   cfg_layout_initialize (0);
2379
2380   /* We are estimating the length of uncond jump insn only once
2381      since the code for getting the insn length always returns
2382      the minimal length now.  */
2383   if (uncond_jump_length == 0)
2384     uncond_jump_length = get_uncond_jump_length ();
2385
2386   max_size
2387     = uncond_jump_length * PARAM_VALUE (PARAM_MAX_GOTO_DUPLICATION_INSNS);
2388   candidates = BITMAP_ALLOC (NULL);
2389
2390   /* Look for blocks that end in a computed jump, and see if such blocks
2391      are suitable for unfactoring.  If a block is a candidate for unfactoring,
2392      mark it in the candidates.  */
2393   FOR_EACH_BB (bb)
2394     {
2395       rtx insn;
2396       edge e;
2397       edge_iterator ei;
2398       int size, all_flags;
2399
2400       /* Build the reorder chain for the original order of blocks.  */
2401       if (bb->next_bb != EXIT_BLOCK_PTR)
2402         bb->aux = bb->next_bb;
2403
2404       /* Obviously the block has to end in a computed jump.  */
2405       if (!computed_jump_p (BB_END (bb)))
2406         continue;
2407
2408       /* Only consider blocks that can be duplicated.  */
2409       if (find_reg_note (BB_END (bb), REG_CROSSING_JUMP, NULL_RTX)
2410           || !can_duplicate_block_p (bb))
2411         continue;
2412
2413       /* Make sure that the block is small enough.  */
2414       size = 0;
2415       FOR_BB_INSNS (bb, insn)
2416         if (INSN_P (insn))
2417           {
2418             size += get_attr_min_length (insn);
2419             if (size > max_size)
2420                break;
2421           }
2422       if (size > max_size)
2423         continue;
2424
2425       /* Final check: there must not be any incoming abnormal edges.  */
2426       all_flags = 0;
2427       FOR_EACH_EDGE (e, ei, bb->preds)
2428         all_flags |= e->flags;
2429       if (all_flags & EDGE_COMPLEX)
2430         continue;
2431
2432       bitmap_set_bit (candidates, bb->index);
2433     }
2434
2435   /* Nothing to do if there is no computed jump here.  */
2436   if (bitmap_empty_p (candidates))
2437     goto done;
2438
2439   /* Duplicate computed gotos.  */
2440   FOR_EACH_BB (bb)
2441     {
2442       if (bb->flags & BB_VISITED)
2443         continue;
2444
2445       bb->flags |= BB_VISITED;
2446
2447       /* BB must have one outgoing edge.  That edge must not lead to
2448          the exit block or the next block.
2449          The destination must have more than one predecessor.  */
2450       if (!single_succ_p (bb)
2451           || single_succ (bb) == EXIT_BLOCK_PTR
2452           || single_succ (bb) == bb->next_bb
2453           || single_pred_p (single_succ (bb)))
2454         continue;
2455
2456       /* The successor block has to be a duplication candidate.  */
2457       if (!bitmap_bit_p (candidates, single_succ (bb)->index))
2458         continue;
2459
2460       /* Don't duplicate a partition crossing edge, which requires difficult
2461          fixup.  */
2462       if (find_reg_note (BB_END (bb), REG_CROSSING_JUMP, NULL_RTX))
2463         continue;
2464
2465       new_bb = duplicate_block (single_succ (bb), single_succ_edge (bb), bb);
2466       new_bb->aux = bb->aux;
2467       bb->aux = new_bb;
2468       new_bb->flags |= BB_VISITED;
2469     }
2470
2471 done:
2472   cfg_layout_finalize ();
2473
2474   BITMAP_FREE (candidates);
2475   return 0;
2476 }
2477
2478 namespace {
2479
2480 const pass_data pass_data_duplicate_computed_gotos =
2481 {
2482   RTL_PASS, /* type */
2483   "compgotos", /* name */
2484   OPTGROUP_NONE, /* optinfo_flags */
2485   true, /* has_gate */
2486   true, /* has_execute */
2487   TV_REORDER_BLOCKS, /* tv_id */
2488   0, /* properties_required */
2489   0, /* properties_provided */
2490   0, /* properties_destroyed */
2491   0, /* todo_flags_start */
2492   TODO_verify_rtl_sharing, /* todo_flags_finish */
2493 };
2494
2495 class pass_duplicate_computed_gotos : public rtl_opt_pass
2496 {
2497 public:
2498   pass_duplicate_computed_gotos(gcc::context *ctxt)
2499     : rtl_opt_pass(pass_data_duplicate_computed_gotos, ctxt)
2500   {}
2501
2502   /* opt_pass methods: */
2503   bool gate () { return gate_duplicate_computed_gotos (); }
2504   unsigned int execute () { return duplicate_computed_gotos (); }
2505
2506 }; // class pass_duplicate_computed_gotos
2507
2508 } // anon namespace
2509
2510 rtl_opt_pass *
2511 make_pass_duplicate_computed_gotos (gcc::context *ctxt)
2512 {
2513   return new pass_duplicate_computed_gotos (ctxt);
2514 }
2515
2516 static bool
2517 gate_handle_partition_blocks (void)
2518 {
2519   /* The optimization to partition hot/cold basic blocks into separate
2520      sections of the .o file does not work well with linkonce or with
2521      user defined section attributes.  Don't call it if either case
2522      arises.  */
2523   return (flag_reorder_blocks_and_partition
2524           && optimize
2525           /* See gate_handle_reorder_blocks.  We should not partition if
2526              we are going to omit the reordering.  */
2527           && optimize_function_for_speed_p (cfun)
2528           && !DECL_ONE_ONLY (current_function_decl)
2529           && !user_defined_section_attribute);
2530 }
2531
2532 /* This function is the main 'entrance' for the optimization that
2533    partitions hot and cold basic blocks into separate sections of the
2534    .o file (to improve performance and cache locality).  Ideally it
2535    would be called after all optimizations that rearrange the CFG have
2536    been called.  However part of this optimization may introduce new
2537    register usage, so it must be called before register allocation has
2538    occurred.  This means that this optimization is actually called
2539    well before the optimization that reorders basic blocks (see
2540    function above).
2541
2542    This optimization checks the feedback information to determine
2543    which basic blocks are hot/cold, updates flags on the basic blocks
2544    to indicate which section they belong in.  This information is
2545    later used for writing out sections in the .o file.  Because hot
2546    and cold sections can be arbitrarily large (within the bounds of
2547    memory), far beyond the size of a single function, it is necessary
2548    to fix up all edges that cross section boundaries, to make sure the
2549    instructions used can actually span the required distance.  The
2550    fixes are described below.
2551
2552    Fall-through edges must be changed into jumps; it is not safe or
2553    legal to fall through across a section boundary.  Whenever a
2554    fall-through edge crossing a section boundary is encountered, a new
2555    basic block is inserted (in the same section as the fall-through
2556    source), and the fall through edge is redirected to the new basic
2557    block.  The new basic block contains an unconditional jump to the
2558    original fall-through target.  (If the unconditional jump is
2559    insufficient to cross section boundaries, that is dealt with a
2560    little later, see below).
2561
2562    In order to deal with architectures that have short conditional
2563    branches (which cannot span all of memory) we take any conditional
2564    jump that attempts to cross a section boundary and add a level of
2565    indirection: it becomes a conditional jump to a new basic block, in
2566    the same section.  The new basic block contains an unconditional
2567    jump to the original target, in the other section.
2568
2569    For those architectures whose unconditional branch is also
2570    incapable of reaching all of memory, those unconditional jumps are
2571    converted into indirect jumps, through a register.
2572
2573    IMPORTANT NOTE: This optimization causes some messy interactions
2574    with the cfg cleanup optimizations; those optimizations want to
2575    merge blocks wherever possible, and to collapse indirect jump
2576    sequences (change "A jumps to B jumps to C" directly into "A jumps
2577    to C").  Those optimizations can undo the jump fixes that
2578    partitioning is required to make (see above), in order to ensure
2579    that jumps attempting to cross section boundaries are really able
2580    to cover whatever distance the jump requires (on many architectures
2581    conditional or unconditional jumps are not able to reach all of
2582    memory).  Therefore tests have to be inserted into each such
2583    optimization to make sure that it does not undo stuff necessary to
2584    cross partition boundaries.  This would be much less of a problem
2585    if we could perform this optimization later in the compilation, but
2586    unfortunately the fact that we may need to create indirect jumps
2587    (through registers) requires that this optimization be performed
2588    before register allocation.
2589
2590    Hot and cold basic blocks are partitioned and put in separate
2591    sections of the .o file, to reduce paging and improve cache
2592    performance (hopefully).  This can result in bits of code from the
2593    same function being widely separated in the .o file.  However this
2594    is not obvious to the current bb structure.  Therefore we must take
2595    care to ensure that: 1). There are no fall_thru edges that cross
2596    between sections; 2). For those architectures which have "short"
2597    conditional branches, all conditional branches that attempt to
2598    cross between sections are converted to unconditional branches;
2599    and, 3). For those architectures which have "short" unconditional
2600    branches, all unconditional branches that attempt to cross between
2601    sections are converted to indirect jumps.
2602
2603    The code for fixing up fall_thru edges that cross between hot and
2604    cold basic blocks does so by creating new basic blocks containing
2605    unconditional branches to the appropriate label in the "other"
2606    section.  The new basic block is then put in the same (hot or cold)
2607    section as the original conditional branch, and the fall_thru edge
2608    is modified to fall into the new basic block instead.  By adding
2609    this level of indirection we end up with only unconditional branches
2610    crossing between hot and cold sections.
2611
2612    Conditional branches are dealt with by adding a level of indirection.
2613    A new basic block is added in the same (hot/cold) section as the
2614    conditional branch, and the conditional branch is retargeted to the
2615    new basic block.  The new basic block contains an unconditional branch
2616    to the original target of the conditional branch (in the other section).
2617
2618    Unconditional branches are dealt with by converting them into
2619    indirect jumps.  */
2620
2621 static unsigned
2622 partition_hot_cold_basic_blocks (void)
2623 {
2624   vec<edge> crossing_edges;
2625
2626   if (n_basic_blocks <= NUM_FIXED_BLOCKS + 1)
2627     return 0;
2628
2629   df_set_flags (DF_DEFER_INSN_RESCAN);
2630
2631   crossing_edges = find_rarely_executed_basic_blocks_and_crossing_edges ();
2632   if (!crossing_edges.exists ())
2633     return 0;
2634
2635   crtl->has_bb_partition = true;
2636
2637   /* Make sure the source of any crossing edge ends in a jump and the
2638      destination of any crossing edge has a label.  */
2639   add_labels_and_missing_jumps (crossing_edges);
2640
2641   /* Convert all crossing fall_thru edges to non-crossing fall
2642      thrus to unconditional jumps (that jump to the original fall
2643      through dest).  */
2644   fix_up_fall_thru_edges ();
2645
2646   /* If the architecture does not have conditional branches that can
2647      span all of memory, convert crossing conditional branches into
2648      crossing unconditional branches.  */
2649   if (!HAS_LONG_COND_BRANCH)
2650     fix_crossing_conditional_branches ();
2651
2652   /* If the architecture does not have unconditional branches that
2653      can span all of memory, convert crossing unconditional branches
2654      into indirect jumps.  Since adding an indirect jump also adds
2655      a new register usage, update the register usage information as
2656      well.  */
2657   if (!HAS_LONG_UNCOND_BRANCH)
2658     fix_crossing_unconditional_branches ();
2659
2660   add_reg_crossing_jump_notes ();
2661
2662   /* Clear bb->aux fields that the above routines were using.  */
2663   clear_aux_for_blocks ();
2664
2665   crossing_edges.release ();
2666
2667   /* ??? FIXME: DF generates the bb info for a block immediately.
2668      And by immediately, I mean *during* creation of the block.
2669
2670         #0  df_bb_refs_collect
2671         #1  in df_bb_refs_record
2672         #2  in create_basic_block_structure
2673
2674      Which means that the bb_has_eh_pred test in df_bb_refs_collect
2675      will *always* fail, because no edges can have been added to the
2676      block yet.  Which of course means we don't add the right 
2677      artificial refs, which means we fail df_verify (much) later.
2678
2679      Cleanest solution would seem to make DF_DEFER_INSN_RESCAN imply
2680      that we also shouldn't grab data from the new blocks those new
2681      insns are in either.  In this way one can create the block, link
2682      it up properly, and have everything Just Work later, when deferred
2683      insns are processed.
2684
2685      In the meantime, we have no other option but to throw away all
2686      of the DF data and recompute it all.  */
2687   if (cfun->eh->lp_array)
2688     {
2689       df_finish_pass (true);
2690       df_scan_alloc (NULL);
2691       df_scan_blocks ();
2692       /* Not all post-landing pads use all of the EH_RETURN_DATA_REGNO
2693          data.  We blindly generated all of them when creating the new
2694          landing pad.  Delete those assignments we don't use.  */
2695       df_set_flags (DF_LR_RUN_DCE);
2696       df_analyze ();
2697     }
2698
2699   return TODO_verify_flow | TODO_verify_rtl_sharing;
2700 }
2701
2702 namespace {
2703
2704 const pass_data pass_data_partition_blocks =
2705 {
2706   RTL_PASS, /* type */
2707   "bbpart", /* name */
2708   OPTGROUP_NONE, /* optinfo_flags */
2709   true, /* has_gate */
2710   true, /* has_execute */
2711   TV_REORDER_BLOCKS, /* tv_id */
2712   PROP_cfglayout, /* properties_required */
2713   0, /* properties_provided */
2714   0, /* properties_destroyed */
2715   0, /* todo_flags_start */
2716   0, /* todo_flags_finish */
2717 };
2718
2719 class pass_partition_blocks : public rtl_opt_pass
2720 {
2721 public:
2722   pass_partition_blocks(gcc::context *ctxt)
2723     : rtl_opt_pass(pass_data_partition_blocks, ctxt)
2724   {}
2725
2726   /* opt_pass methods: */
2727   bool gate () { return gate_handle_partition_blocks (); }
2728   unsigned int execute () { return partition_hot_cold_basic_blocks (); }
2729
2730 }; // class pass_partition_blocks
2731
2732 } // anon namespace
2733
2734 rtl_opt_pass *
2735 make_pass_partition_blocks (gcc::context *ctxt)
2736 {
2737   return new pass_partition_blocks (ctxt);
2738 }