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