Home | History | Annotate | Line # | Download | only in gcc
      1  1.1  mrg /* Hooks for cfg representation specific functions.
      2  1.1  mrg    Copyright (C) 2003-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by Sebastian Pop <s.pop (at) laposte.net>
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify
      8  1.1  mrg it under the terms of the GNU General Public License as published by
      9  1.1  mrg the Free Software Foundation; either version 3, or (at your option)
     10  1.1  mrg any later version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful,
     13  1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  1.1  mrg GNU General Public License for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License
     18  1.1  mrg along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg #include "config.h"
     22  1.1  mrg #include "system.h"
     23  1.1  mrg #include "coretypes.h"
     24  1.1  mrg #include "backend.h"
     25  1.1  mrg #include "rtl.h"
     26  1.1  mrg #include "cfghooks.h"
     27  1.1  mrg #include "timevar.h"
     28  1.1  mrg #include "pretty-print.h"
     29  1.1  mrg #include "diagnostic-core.h"
     30  1.1  mrg #include "dumpfile.h"
     31  1.1  mrg #include "cfganal.h"
     32  1.1  mrg #include "tree.h"
     33  1.1  mrg #include "tree-ssa.h"
     34  1.1  mrg #include "cfgloop.h"
     35  1.1  mrg #include "sreal.h"
     36  1.1  mrg #include "profile.h"
     37  1.1  mrg 
     38  1.1  mrg /* Disable warnings about missing quoting in GCC diagnostics.  */
     39  1.1  mrg #if __GNUC__ >= 10
     40  1.1  mrg #  pragma GCC diagnostic push
     41  1.1  mrg #  pragma GCC diagnostic ignored "-Wformat-diag"
     42  1.1  mrg #endif
     43  1.1  mrg 
     44  1.1  mrg /* A pointer to one of the hooks containers.  */
     45  1.1  mrg static struct cfg_hooks *cfg_hooks;
     46  1.1  mrg 
     47  1.1  mrg /* Initialization of functions specific to the rtl IR.  */
     48  1.1  mrg void
     49  1.1  mrg rtl_register_cfg_hooks (void)
     50  1.1  mrg {
     51  1.1  mrg   cfg_hooks = &rtl_cfg_hooks;
     52  1.1  mrg }
     53  1.1  mrg 
     54  1.1  mrg /* Initialization of functions specific to the rtl IR.  */
     55  1.1  mrg void
     56  1.1  mrg cfg_layout_rtl_register_cfg_hooks (void)
     57  1.1  mrg {
     58  1.1  mrg   cfg_hooks = &cfg_layout_rtl_cfg_hooks;
     59  1.1  mrg }
     60  1.1  mrg 
     61  1.1  mrg /* Initialization of functions specific to the tree IR.  */
     62  1.1  mrg 
     63  1.1  mrg void
     64  1.1  mrg gimple_register_cfg_hooks (void)
     65  1.1  mrg {
     66  1.1  mrg   cfg_hooks = &gimple_cfg_hooks;
     67  1.1  mrg }
     68  1.1  mrg 
     69  1.1  mrg struct cfg_hooks
     70  1.1  mrg get_cfg_hooks (void)
     71  1.1  mrg {
     72  1.1  mrg   return *cfg_hooks;
     73  1.1  mrg }
     74  1.1  mrg 
     75  1.1  mrg void
     76  1.1  mrg set_cfg_hooks (struct cfg_hooks new_cfg_hooks)
     77  1.1  mrg {
     78  1.1  mrg   *cfg_hooks = new_cfg_hooks;
     79  1.1  mrg }
     80  1.1  mrg 
     81  1.1  mrg /* Returns current ir type.  */
     82  1.1  mrg 
     83  1.1  mrg enum ir_type
     84  1.1  mrg current_ir_type (void)
     85  1.1  mrg {
     86  1.1  mrg   if (cfg_hooks == &gimple_cfg_hooks)
     87  1.1  mrg     return IR_GIMPLE;
     88  1.1  mrg   else if (cfg_hooks == &rtl_cfg_hooks)
     89  1.1  mrg     return IR_RTL_CFGRTL;
     90  1.1  mrg   else if (cfg_hooks == &cfg_layout_rtl_cfg_hooks)
     91  1.1  mrg     return IR_RTL_CFGLAYOUT;
     92  1.1  mrg   else
     93  1.1  mrg     gcc_unreachable ();
     94  1.1  mrg }
     95  1.1  mrg 
     96  1.1  mrg /* Verify the CFG consistency.
     97  1.1  mrg 
     98  1.1  mrg    Currently it does following: checks edge and basic block list correctness
     99  1.1  mrg    and calls into IL dependent checking then.  */
    100  1.1  mrg 
    101  1.1  mrg DEBUG_FUNCTION void
    102  1.1  mrg verify_flow_info (void)
    103  1.1  mrg {
    104  1.1  mrg   size_t *edge_checksum;
    105  1.1  mrg   int err = 0;
    106  1.1  mrg   basic_block bb, last_bb_seen;
    107  1.1  mrg   basic_block *last_visited;
    108  1.1  mrg 
    109  1.1  mrg   timevar_push (TV_CFG_VERIFY);
    110  1.1  mrg   last_visited = XCNEWVEC (basic_block, last_basic_block_for_fn (cfun));
    111  1.1  mrg   edge_checksum = XCNEWVEC (size_t, last_basic_block_for_fn (cfun));
    112  1.1  mrg 
    113  1.1  mrg   /* Check bb chain & numbers.  */
    114  1.1  mrg   last_bb_seen = ENTRY_BLOCK_PTR_FOR_FN (cfun);
    115  1.1  mrg   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb, NULL, next_bb)
    116  1.1  mrg     {
    117  1.1  mrg       if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
    118  1.1  mrg 	  && bb != BASIC_BLOCK_FOR_FN (cfun, bb->index))
    119  1.1  mrg 	{
    120  1.1  mrg 	  error ("bb %d on wrong place", bb->index);
    121  1.1  mrg 	  err = 1;
    122  1.1  mrg 	}
    123  1.1  mrg 
    124  1.1  mrg       if (bb->prev_bb != last_bb_seen)
    125  1.1  mrg 	{
    126  1.1  mrg 	  error ("prev_bb of %d should be %d, not %d",
    127  1.1  mrg 		 bb->index, last_bb_seen->index, bb->prev_bb->index);
    128  1.1  mrg 	  err = 1;
    129  1.1  mrg 	}
    130  1.1  mrg 
    131  1.1  mrg       last_bb_seen = bb;
    132  1.1  mrg     }
    133  1.1  mrg 
    134  1.1  mrg   /* Now check the basic blocks (boundaries etc.) */
    135  1.1  mrg   FOR_EACH_BB_REVERSE_FN (bb, cfun)
    136  1.1  mrg     {
    137  1.1  mrg       int n_fallthru = 0;
    138  1.1  mrg       edge e;
    139  1.1  mrg       edge_iterator ei;
    140  1.1  mrg 
    141  1.1  mrg       if (bb->loop_father != NULL && current_loops == NULL)
    142  1.1  mrg 	{
    143  1.1  mrg 	  error ("verify_flow_info: Block %i has loop_father, but there are no loops",
    144  1.1  mrg 		 bb->index);
    145  1.1  mrg 	  err = 1;
    146  1.1  mrg 	}
    147  1.1  mrg       if (bb->loop_father == NULL && current_loops != NULL)
    148  1.1  mrg 	{
    149  1.1  mrg 	  error ("verify_flow_info: Block %i lacks loop_father", bb->index);
    150  1.1  mrg 	  err = 1;
    151  1.1  mrg 	}
    152  1.1  mrg 
    153  1.1  mrg       if (!bb->count.verify ())
    154  1.1  mrg 	{
    155  1.1  mrg 	  error ("verify_flow_info: Wrong count of block %i", bb->index);
    156  1.1  mrg 	  err = 1;
    157  1.1  mrg 	}
    158  1.1  mrg       /* FIXME: Graphite and SLJL and target code still tends to produce
    159  1.1  mrg 	 edges with no probability.  */
    160  1.1  mrg       if (profile_status_for_fn (cfun) >= PROFILE_GUESSED
    161  1.1  mrg           && !bb->count.initialized_p () && !flag_graphite && 0)
    162  1.1  mrg 	{
    163  1.1  mrg 	  error ("verify_flow_info: Missing count of block %i", bb->index);
    164  1.1  mrg 	  err = 1;
    165  1.1  mrg 	}
    166  1.1  mrg 
    167  1.1  mrg       if (bb->flags & ~cfun->cfg->bb_flags_allocated)
    168  1.1  mrg 	{
    169  1.1  mrg 	  error ("verify_flow_info: unallocated flag set on BB %d", bb->index);
    170  1.1  mrg 	  err = 1;
    171  1.1  mrg 	}
    172  1.1  mrg 
    173  1.1  mrg       FOR_EACH_EDGE (e, ei, bb->succs)
    174  1.1  mrg 	{
    175  1.1  mrg 	  if (last_visited [e->dest->index] == bb)
    176  1.1  mrg 	    {
    177  1.1  mrg 	      error ("verify_flow_info: Duplicate edge %i->%i",
    178  1.1  mrg 		     e->src->index, e->dest->index);
    179  1.1  mrg 	      err = 1;
    180  1.1  mrg 	    }
    181  1.1  mrg 	  /* FIXME: Graphite and SLJL and target code still tends to produce
    182  1.1  mrg 	     edges with no probability.  */
    183  1.1  mrg 	  if (profile_status_for_fn (cfun) >= PROFILE_GUESSED
    184  1.1  mrg 	      && !e->probability.initialized_p () && !flag_graphite && 0)
    185  1.1  mrg 	    {
    186  1.1  mrg 	      error ("Uninitialized probability of edge %i->%i", e->src->index,
    187  1.1  mrg 		     e->dest->index);
    188  1.1  mrg 	      err = 1;
    189  1.1  mrg 	    }
    190  1.1  mrg 	  if (!e->probability.verify ())
    191  1.1  mrg 	    {
    192  1.1  mrg 	      error ("verify_flow_info: Wrong probability of edge %i->%i",
    193  1.1  mrg 		     e->src->index, e->dest->index);
    194  1.1  mrg 	      err = 1;
    195  1.1  mrg 	    }
    196  1.1  mrg 
    197  1.1  mrg 	  last_visited [e->dest->index] = bb;
    198  1.1  mrg 
    199  1.1  mrg 	  if (e->flags & EDGE_FALLTHRU)
    200  1.1  mrg 	    n_fallthru++;
    201  1.1  mrg 
    202  1.1  mrg 	  if (e->src != bb)
    203  1.1  mrg 	    {
    204  1.1  mrg 	      error ("verify_flow_info: Basic block %d succ edge is corrupted",
    205  1.1  mrg 		     bb->index);
    206  1.1  mrg 	      fprintf (stderr, "Predecessor: ");
    207  1.1  mrg 	      dump_edge_info (stderr, e, TDF_DETAILS, 0);
    208  1.1  mrg 	      fprintf (stderr, "\nSuccessor: ");
    209  1.1  mrg 	      dump_edge_info (stderr, e, TDF_DETAILS, 1);
    210  1.1  mrg 	      fprintf (stderr, "\n");
    211  1.1  mrg 	      err = 1;
    212  1.1  mrg 	    }
    213  1.1  mrg 
    214  1.1  mrg 	  if (e->flags & ~cfun->cfg->edge_flags_allocated)
    215  1.1  mrg 	    {
    216  1.1  mrg 	      error ("verify_flow_info: unallocated edge flag set on %d -> %d",
    217  1.1  mrg 		     e->src->index, e->dest->index);
    218  1.1  mrg 	      err = 1;
    219  1.1  mrg 	    }
    220  1.1  mrg 
    221  1.1  mrg 	  edge_checksum[e->dest->index] += (size_t) e;
    222  1.1  mrg 	}
    223  1.1  mrg       if (n_fallthru > 1)
    224  1.1  mrg 	{
    225  1.1  mrg 	  error ("wrong amount of branch edges after unconditional jump %i", bb->index);
    226  1.1  mrg 	  err = 1;
    227  1.1  mrg 	}
    228  1.1  mrg 
    229  1.1  mrg       FOR_EACH_EDGE (e, ei, bb->preds)
    230  1.1  mrg 	{
    231  1.1  mrg 	  if (e->dest != bb)
    232  1.1  mrg 	    {
    233  1.1  mrg 	      error ("basic block %d pred edge is corrupted", bb->index);
    234  1.1  mrg 	      fputs ("Predecessor: ", stderr);
    235  1.1  mrg 	      dump_edge_info (stderr, e, TDF_DETAILS, 0);
    236  1.1  mrg 	      fputs ("\nSuccessor: ", stderr);
    237  1.1  mrg 	      dump_edge_info (stderr, e, TDF_DETAILS, 1);
    238  1.1  mrg 	      fputc ('\n', stderr);
    239  1.1  mrg 	      err = 1;
    240  1.1  mrg 	    }
    241  1.1  mrg 
    242  1.1  mrg 	  if (ei.index != e->dest_idx)
    243  1.1  mrg 	    {
    244  1.1  mrg 	      error ("basic block %d pred edge is corrupted", bb->index);
    245  1.1  mrg 	      error ("its dest_idx should be %d, not %d",
    246  1.1  mrg 		     ei.index, e->dest_idx);
    247  1.1  mrg 	      fputs ("Predecessor: ", stderr);
    248  1.1  mrg 	      dump_edge_info (stderr, e, TDF_DETAILS, 0);
    249  1.1  mrg 	      fputs ("\nSuccessor: ", stderr);
    250  1.1  mrg 	      dump_edge_info (stderr, e, TDF_DETAILS, 1);
    251  1.1  mrg 	      fputc ('\n', stderr);
    252  1.1  mrg 	      err = 1;
    253  1.1  mrg 	    }
    254  1.1  mrg 
    255  1.1  mrg 	  edge_checksum[e->dest->index] -= (size_t) e;
    256  1.1  mrg 	}
    257  1.1  mrg     }
    258  1.1  mrg 
    259  1.1  mrg   /* Complete edge checksumming for ENTRY and EXIT.  */
    260  1.1  mrg   {
    261  1.1  mrg     edge e;
    262  1.1  mrg     edge_iterator ei;
    263  1.1  mrg 
    264  1.1  mrg     FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs)
    265  1.1  mrg       edge_checksum[e->dest->index] += (size_t) e;
    266  1.1  mrg 
    267  1.1  mrg     FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
    268  1.1  mrg       edge_checksum[e->dest->index] -= (size_t) e;
    269  1.1  mrg   }
    270  1.1  mrg 
    271  1.1  mrg   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun), NULL, next_bb)
    272  1.1  mrg     if (edge_checksum[bb->index])
    273  1.1  mrg       {
    274  1.1  mrg 	error ("basic block %i edge lists are corrupted", bb->index);
    275  1.1  mrg 	err = 1;
    276  1.1  mrg       }
    277  1.1  mrg 
    278  1.1  mrg   /* Clean up.  */
    279  1.1  mrg   free (last_visited);
    280  1.1  mrg   free (edge_checksum);
    281  1.1  mrg 
    282  1.1  mrg   if (cfg_hooks->verify_flow_info)
    283  1.1  mrg     err |= cfg_hooks->verify_flow_info ();
    284  1.1  mrg   if (err)
    285  1.1  mrg     internal_error ("verify_flow_info failed");
    286  1.1  mrg   timevar_pop (TV_CFG_VERIFY);
    287  1.1  mrg }
    288  1.1  mrg 
    289  1.1  mrg /* Print out one basic block BB to file OUTF.  INDENT is printed at the
    290  1.1  mrg    start of each new line.  FLAGS are the TDF_* flags in dumpfile.h.
    291  1.1  mrg 
    292  1.1  mrg    This function takes care of the purely graph related information.
    293  1.1  mrg    The cfg hook for the active representation should dump
    294  1.1  mrg    representation-specific information.  */
    295  1.1  mrg 
    296  1.1  mrg void
    297  1.1  mrg dump_bb (FILE *outf, basic_block bb, int indent, dump_flags_t flags)
    298  1.1  mrg {
    299  1.1  mrg   if (flags & TDF_BLOCKS)
    300  1.1  mrg     dump_bb_info (outf, bb, indent, flags, true, false);
    301  1.1  mrg   if (cfg_hooks->dump_bb)
    302  1.1  mrg     cfg_hooks->dump_bb (outf, bb, indent, flags);
    303  1.1  mrg   if (flags & TDF_BLOCKS)
    304  1.1  mrg     dump_bb_info (outf, bb, indent, flags, false, true);
    305  1.1  mrg   fputc ('\n', outf);
    306  1.1  mrg }
    307  1.1  mrg 
    308  1.1  mrg DEBUG_FUNCTION void
    309  1.1  mrg debug (basic_block_def &ref)
    310  1.1  mrg {
    311  1.1  mrg   dump_bb (stderr, &ref, 0, TDF_NONE);
    312  1.1  mrg }
    313  1.1  mrg 
    314  1.1  mrg DEBUG_FUNCTION void
    315  1.1  mrg debug (basic_block_def *ptr)
    316  1.1  mrg {
    317  1.1  mrg   if (ptr)
    318  1.1  mrg     debug (*ptr);
    319  1.1  mrg   else
    320  1.1  mrg     fprintf (stderr, "<nil>\n");
    321  1.1  mrg }
    322  1.1  mrg 
    323  1.1  mrg static void
    324  1.1  mrg debug_slim (basic_block ptr)
    325  1.1  mrg {
    326  1.1  mrg   fprintf (stderr, "<basic_block %p (%d)>", (void *) ptr, ptr->index);
    327  1.1  mrg }
    328  1.1  mrg 
    329  1.1  mrg DEFINE_DEBUG_VEC (basic_block_def *)
    330  1.1  mrg DEFINE_DEBUG_HASH_SET (basic_block_def *)
    331  1.1  mrg 
    332  1.1  mrg /* Dumps basic block BB to pretty-printer PP, for use as a label of
    333  1.1  mrg    a DOT graph record-node.  The implementation of this hook is
    334  1.1  mrg    expected to write the label to the stream that is attached to PP.
    335  1.1  mrg    Field separators between instructions are pipe characters printed
    336  1.1  mrg    verbatim.  Instructions should be written with some characters
    337  1.1  mrg    escaped, using pp_write_text_as_dot_label_to_stream().  */
    338  1.1  mrg 
    339  1.1  mrg void
    340  1.1  mrg dump_bb_for_graph (pretty_printer *pp, basic_block bb)
    341  1.1  mrg {
    342  1.1  mrg   if (!cfg_hooks->dump_bb_for_graph)
    343  1.1  mrg     internal_error ("%s does not support dump_bb_for_graph",
    344  1.1  mrg 		    cfg_hooks->name);
    345  1.1  mrg   /* TODO: Add pretty printer for counter.  */
    346  1.1  mrg   if (bb->count.initialized_p ())
    347  1.1  mrg     pp_printf (pp, "COUNT:" "%" PRId64, bb->count.to_gcov_type ());
    348  1.1  mrg   pp_write_text_to_stream (pp);
    349  1.1  mrg   if (!(dump_flags & TDF_SLIM))
    350  1.1  mrg     cfg_hooks->dump_bb_for_graph (pp, bb);
    351  1.1  mrg }
    352  1.1  mrg 
    353  1.1  mrg /* Dump the complete CFG to FILE.  FLAGS are the TDF_* flags in dumpfile.h.  */
    354  1.1  mrg void
    355  1.1  mrg dump_flow_info (FILE *file, dump_flags_t flags)
    356  1.1  mrg {
    357  1.1  mrg   basic_block bb;
    358  1.1  mrg 
    359  1.1  mrg   fprintf (file, "\n%d basic blocks, %d edges.\n", n_basic_blocks_for_fn (cfun),
    360  1.1  mrg 	   n_edges_for_fn (cfun));
    361  1.1  mrg   FOR_ALL_BB_FN (bb, cfun)
    362  1.1  mrg     dump_bb (file, bb, 0, flags);
    363  1.1  mrg 
    364  1.1  mrg   putc ('\n', file);
    365  1.1  mrg }
    366  1.1  mrg 
    367  1.1  mrg /* Like above, but dump to stderr.  To be called from debuggers.  */
    368  1.1  mrg void debug_flow_info (void);
    369  1.1  mrg DEBUG_FUNCTION void
    370  1.1  mrg debug_flow_info (void)
    371  1.1  mrg {
    372  1.1  mrg   dump_flow_info (stderr, TDF_DETAILS);
    373  1.1  mrg }
    374  1.1  mrg 
    375  1.1  mrg /* Redirect edge E to the given basic block DEST and update underlying program
    376  1.1  mrg    representation.  Returns edge representing redirected branch (that may not
    377  1.1  mrg    be equivalent to E in the case of duplicate edges being removed) or NULL
    378  1.1  mrg    if edge is not easily redirectable for whatever reason.  */
    379  1.1  mrg 
    380  1.1  mrg edge
    381  1.1  mrg redirect_edge_and_branch (edge e, basic_block dest)
    382  1.1  mrg {
    383  1.1  mrg   edge ret;
    384  1.1  mrg 
    385  1.1  mrg   if (!cfg_hooks->redirect_edge_and_branch)
    386  1.1  mrg     internal_error ("%s does not support redirect_edge_and_branch",
    387  1.1  mrg 		    cfg_hooks->name);
    388  1.1  mrg 
    389  1.1  mrg   ret = cfg_hooks->redirect_edge_and_branch (e, dest);
    390  1.1  mrg 
    391  1.1  mrg   /* If RET != E, then either the redirection failed, or the edge E
    392  1.1  mrg      was removed since RET already lead to the same destination.  */
    393  1.1  mrg   if (current_loops != NULL && ret == e)
    394  1.1  mrg     rescan_loop_exit (e, false, false);
    395  1.1  mrg 
    396  1.1  mrg   return ret;
    397  1.1  mrg }
    398  1.1  mrg 
    399  1.1  mrg /* Returns true if it is possible to remove the edge E by redirecting it
    400  1.1  mrg    to the destination of the other edge going from its source.  */
    401  1.1  mrg 
    402  1.1  mrg bool
    403  1.1  mrg can_remove_branch_p (const_edge e)
    404  1.1  mrg {
    405  1.1  mrg   if (!cfg_hooks->can_remove_branch_p)
    406  1.1  mrg     internal_error ("%s does not support can_remove_branch_p",
    407  1.1  mrg 		    cfg_hooks->name);
    408  1.1  mrg 
    409  1.1  mrg   if (EDGE_COUNT (e->src->succs) != 2)
    410  1.1  mrg     return false;
    411  1.1  mrg 
    412  1.1  mrg   return cfg_hooks->can_remove_branch_p (e);
    413  1.1  mrg }
    414  1.1  mrg 
    415  1.1  mrg /* Removes E, by redirecting it to the destination of the other edge going
    416  1.1  mrg    from its source.  Can_remove_branch_p must be true for E, hence this
    417  1.1  mrg    operation cannot fail.  */
    418  1.1  mrg 
    419  1.1  mrg void
    420  1.1  mrg remove_branch (edge e)
    421  1.1  mrg {
    422  1.1  mrg   edge other;
    423  1.1  mrg   basic_block src = e->src;
    424  1.1  mrg   int irr;
    425  1.1  mrg 
    426  1.1  mrg   gcc_assert (EDGE_COUNT (e->src->succs) == 2);
    427  1.1  mrg 
    428  1.1  mrg   other = EDGE_SUCC (src, EDGE_SUCC (src, 0) == e);
    429  1.1  mrg   irr = other->flags & EDGE_IRREDUCIBLE_LOOP;
    430  1.1  mrg 
    431  1.1  mrg   e = redirect_edge_and_branch (e, other->dest);
    432  1.1  mrg   gcc_assert (e != NULL);
    433  1.1  mrg 
    434  1.1  mrg   e->flags &= ~EDGE_IRREDUCIBLE_LOOP;
    435  1.1  mrg   e->flags |= irr;
    436  1.1  mrg }
    437  1.1  mrg 
    438  1.1  mrg /* Removes edge E from cfg.  Unlike remove_branch, it does not update IL.  */
    439  1.1  mrg 
    440  1.1  mrg void
    441  1.1  mrg remove_edge (edge e)
    442  1.1  mrg {
    443  1.1  mrg   if (current_loops != NULL)
    444  1.1  mrg     {
    445  1.1  mrg       rescan_loop_exit (e, false, true);
    446  1.1  mrg 
    447  1.1  mrg       /* Removal of an edge inside an irreducible region or which leads
    448  1.1  mrg 	 to an irreducible region can turn the region into a natural loop.
    449  1.1  mrg 	 In that case, ask for the loop structure fixups.
    450  1.1  mrg 
    451  1.1  mrg 	 FIXME: Note that LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS is not always
    452  1.1  mrg 	 set, so always ask for fixups when removing an edge in that case.  */
    453  1.1  mrg       if (!loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
    454  1.1  mrg 	  || (e->flags & EDGE_IRREDUCIBLE_LOOP)
    455  1.1  mrg 	  || (e->dest->flags & BB_IRREDUCIBLE_LOOP))
    456  1.1  mrg 	loops_state_set (LOOPS_NEED_FIXUP);
    457  1.1  mrg     }
    458  1.1  mrg 
    459  1.1  mrg   /* This is probably not needed, but it doesn't hurt.  */
    460  1.1  mrg   /* FIXME: This should be called via a remove_edge hook.  */
    461  1.1  mrg   if (current_ir_type () == IR_GIMPLE)
    462  1.1  mrg     redirect_edge_var_map_clear (e);
    463  1.1  mrg 
    464  1.1  mrg   remove_edge_raw (e);
    465  1.1  mrg }
    466  1.1  mrg 
    467  1.1  mrg /* Like redirect_edge_succ but avoid possible duplicate edge.  */
    468  1.1  mrg 
    469  1.1  mrg edge
    470  1.1  mrg redirect_edge_succ_nodup (edge e, basic_block new_succ)
    471  1.1  mrg {
    472  1.1  mrg   edge s;
    473  1.1  mrg 
    474  1.1  mrg   s = find_edge (e->src, new_succ);
    475  1.1  mrg   if (s && s != e)
    476  1.1  mrg     {
    477  1.1  mrg       s->flags |= e->flags;
    478  1.1  mrg       s->probability += e->probability;
    479  1.1  mrg       /* FIXME: This should be called via a hook and only for IR_GIMPLE.  */
    480  1.1  mrg       redirect_edge_var_map_dup (s, e);
    481  1.1  mrg       remove_edge (e);
    482  1.1  mrg       e = s;
    483  1.1  mrg     }
    484  1.1  mrg   else
    485  1.1  mrg     redirect_edge_succ (e, new_succ);
    486  1.1  mrg 
    487  1.1  mrg   return e;
    488  1.1  mrg }
    489  1.1  mrg 
    490  1.1  mrg /* Redirect the edge E to basic block DEST even if it requires creating
    491  1.1  mrg    of a new basic block; then it returns the newly created basic block.
    492  1.1  mrg    Aborts when redirection is impossible.  */
    493  1.1  mrg 
    494  1.1  mrg basic_block
    495  1.1  mrg redirect_edge_and_branch_force (edge e, basic_block dest)
    496  1.1  mrg {
    497  1.1  mrg   basic_block ret, src = e->src;
    498  1.1  mrg 
    499  1.1  mrg   if (!cfg_hooks->redirect_edge_and_branch_force)
    500  1.1  mrg     internal_error ("%s does not support redirect_edge_and_branch_force",
    501  1.1  mrg 		    cfg_hooks->name);
    502  1.1  mrg 
    503  1.1  mrg   if (current_loops != NULL)
    504  1.1  mrg     rescan_loop_exit (e, false, true);
    505  1.1  mrg 
    506  1.1  mrg   ret = cfg_hooks->redirect_edge_and_branch_force (e, dest);
    507  1.1  mrg 
    508  1.1  mrg   if (ret != NULL && dom_info_available_p (CDI_DOMINATORS))
    509  1.1  mrg     set_immediate_dominator (CDI_DOMINATORS, ret, src);
    510  1.1  mrg 
    511  1.1  mrg   if (current_loops != NULL)
    512  1.1  mrg     {
    513  1.1  mrg       if (ret != NULL)
    514  1.1  mrg 	{
    515  1.1  mrg 	  class loop *loop
    516  1.1  mrg 	    = find_common_loop (single_pred (ret)->loop_father,
    517  1.1  mrg 				single_succ (ret)->loop_father);
    518  1.1  mrg 	  add_bb_to_loop (ret, loop);
    519  1.1  mrg 	}
    520  1.1  mrg       else if (find_edge (src, dest) == e)
    521  1.1  mrg 	rescan_loop_exit (e, true, false);
    522  1.1  mrg     }
    523  1.1  mrg 
    524  1.1  mrg   return ret;
    525  1.1  mrg }
    526  1.1  mrg 
    527  1.1  mrg /* Splits basic block BB after the specified instruction I (but at least after
    528  1.1  mrg    the labels).  If I is NULL, splits just after labels.  The newly created edge
    529  1.1  mrg    is returned.  The new basic block is created just after the old one.  */
    530  1.1  mrg 
    531  1.1  mrg static edge
    532  1.1  mrg split_block_1 (basic_block bb, void *i)
    533  1.1  mrg {
    534  1.1  mrg   basic_block new_bb;
    535  1.1  mrg   edge res;
    536  1.1  mrg 
    537  1.1  mrg   if (!cfg_hooks->split_block)
    538  1.1  mrg     internal_error ("%s does not support split_block", cfg_hooks->name);
    539  1.1  mrg 
    540  1.1  mrg   new_bb = cfg_hooks->split_block (bb, i);
    541  1.1  mrg   if (!new_bb)
    542  1.1  mrg     return NULL;
    543  1.1  mrg 
    544  1.1  mrg   new_bb->count = bb->count;
    545  1.1  mrg   new_bb->discriminator = bb->discriminator;
    546  1.1  mrg 
    547  1.1  mrg   if (dom_info_available_p (CDI_DOMINATORS))
    548  1.1  mrg     {
    549  1.1  mrg       redirect_immediate_dominators (CDI_DOMINATORS, bb, new_bb);
    550  1.1  mrg       set_immediate_dominator (CDI_DOMINATORS, new_bb, bb);
    551  1.1  mrg     }
    552  1.1  mrg 
    553  1.1  mrg   if (current_loops != NULL)
    554  1.1  mrg     {
    555  1.1  mrg       edge_iterator ei;
    556  1.1  mrg       edge e;
    557  1.1  mrg       add_bb_to_loop (new_bb, bb->loop_father);
    558  1.1  mrg       /* Identify all loops bb may have been the latch of and adjust them.  */
    559  1.1  mrg       FOR_EACH_EDGE (e, ei, new_bb->succs)
    560  1.1  mrg 	if (e->dest->loop_father->latch == bb)
    561  1.1  mrg 	  e->dest->loop_father->latch = new_bb;
    562  1.1  mrg     }
    563  1.1  mrg 
    564  1.1  mrg   res = make_single_succ_edge (bb, new_bb, EDGE_FALLTHRU);
    565  1.1  mrg 
    566  1.1  mrg   if (bb->flags & BB_IRREDUCIBLE_LOOP)
    567  1.1  mrg     {
    568  1.1  mrg       new_bb->flags |= BB_IRREDUCIBLE_LOOP;
    569  1.1  mrg       res->flags |= EDGE_IRREDUCIBLE_LOOP;
    570  1.1  mrg     }
    571  1.1  mrg 
    572  1.1  mrg   return res;
    573  1.1  mrg }
    574  1.1  mrg 
    575  1.1  mrg edge
    576  1.1  mrg split_block (basic_block bb, gimple *i)
    577  1.1  mrg {
    578  1.1  mrg   return split_block_1 (bb, i);
    579  1.1  mrg }
    580  1.1  mrg 
    581  1.1  mrg edge
    582  1.1  mrg split_block (basic_block bb, rtx i)
    583  1.1  mrg {
    584  1.1  mrg   return split_block_1 (bb, i);
    585  1.1  mrg }
    586  1.1  mrg 
    587  1.1  mrg /* Splits block BB just after labels.  The newly created edge is returned.  */
    588  1.1  mrg 
    589  1.1  mrg edge
    590  1.1  mrg split_block_after_labels (basic_block bb)
    591  1.1  mrg {
    592  1.1  mrg   return split_block_1 (bb, NULL);
    593  1.1  mrg }
    594  1.1  mrg 
    595  1.1  mrg /* Moves block BB immediately after block AFTER.  Returns false if the
    596  1.1  mrg    movement was impossible.  */
    597  1.1  mrg 
    598  1.1  mrg bool
    599  1.1  mrg move_block_after (basic_block bb, basic_block after)
    600  1.1  mrg {
    601  1.1  mrg   bool ret;
    602  1.1  mrg 
    603  1.1  mrg   if (!cfg_hooks->move_block_after)
    604  1.1  mrg     internal_error ("%s does not support move_block_after", cfg_hooks->name);
    605  1.1  mrg 
    606  1.1  mrg   ret = cfg_hooks->move_block_after (bb, after);
    607  1.1  mrg 
    608  1.1  mrg   return ret;
    609  1.1  mrg }
    610  1.1  mrg 
    611  1.1  mrg /* Deletes the basic block BB.  */
    612  1.1  mrg 
    613  1.1  mrg void
    614  1.1  mrg delete_basic_block (basic_block bb)
    615  1.1  mrg {
    616  1.1  mrg   if (!cfg_hooks->delete_basic_block)
    617  1.1  mrg     internal_error ("%s does not support delete_basic_block", cfg_hooks->name);
    618  1.1  mrg 
    619  1.1  mrg   cfg_hooks->delete_basic_block (bb);
    620  1.1  mrg 
    621  1.1  mrg   if (current_loops != NULL)
    622  1.1  mrg     {
    623  1.1  mrg       class loop *loop = bb->loop_father;
    624  1.1  mrg 
    625  1.1  mrg       /* If we remove the header or the latch of a loop, mark the loop for
    626  1.1  mrg 	 removal.  */
    627  1.1  mrg       if (loop->latch == bb
    628  1.1  mrg 	  || loop->header == bb)
    629  1.1  mrg 	mark_loop_for_removal (loop);
    630  1.1  mrg 
    631  1.1  mrg       remove_bb_from_loops (bb);
    632  1.1  mrg     }
    633  1.1  mrg 
    634  1.1  mrg   /* Remove the edges into and out of this block.  Note that there may
    635  1.1  mrg      indeed be edges in, if we are removing an unreachable loop.  */
    636  1.1  mrg   while (EDGE_COUNT (bb->preds) != 0)
    637  1.1  mrg     remove_edge (EDGE_PRED (bb, 0));
    638  1.1  mrg   while (EDGE_COUNT (bb->succs) != 0)
    639  1.1  mrg     remove_edge (EDGE_SUCC (bb, 0));
    640  1.1  mrg 
    641  1.1  mrg   if (dom_info_available_p (CDI_DOMINATORS))
    642  1.1  mrg     delete_from_dominance_info (CDI_DOMINATORS, bb);
    643  1.1  mrg   if (dom_info_available_p (CDI_POST_DOMINATORS))
    644  1.1  mrg     delete_from_dominance_info (CDI_POST_DOMINATORS, bb);
    645  1.1  mrg 
    646  1.1  mrg   /* Remove the basic block from the array.  */
    647  1.1  mrg   expunge_block (bb);
    648  1.1  mrg }
    649  1.1  mrg 
    650  1.1  mrg /* Splits edge E and returns the newly created basic block.  */
    651  1.1  mrg 
    652  1.1  mrg basic_block
    653  1.1  mrg split_edge (edge e)
    654  1.1  mrg {
    655  1.1  mrg   basic_block ret;
    656  1.1  mrg   profile_count count = e->count ();
    657  1.1  mrg   edge f;
    658  1.1  mrg   bool irr = (e->flags & EDGE_IRREDUCIBLE_LOOP) != 0;
    659  1.1  mrg   bool back = (e->flags & EDGE_DFS_BACK) != 0;
    660  1.1  mrg   class loop *loop;
    661  1.1  mrg   basic_block src = e->src, dest = e->dest;
    662  1.1  mrg 
    663  1.1  mrg   if (!cfg_hooks->split_edge)
    664  1.1  mrg     internal_error ("%s does not support split_edge", cfg_hooks->name);
    665  1.1  mrg 
    666  1.1  mrg   if (current_loops != NULL)
    667  1.1  mrg     rescan_loop_exit (e, false, true);
    668  1.1  mrg 
    669  1.1  mrg   ret = cfg_hooks->split_edge (e);
    670  1.1  mrg   ret->count = count;
    671  1.1  mrg   single_succ_edge (ret)->probability = profile_probability::always ();
    672  1.1  mrg 
    673  1.1  mrg   if (irr)
    674  1.1  mrg     {
    675  1.1  mrg       ret->flags |= BB_IRREDUCIBLE_LOOP;
    676  1.1  mrg       single_pred_edge (ret)->flags |= EDGE_IRREDUCIBLE_LOOP;
    677  1.1  mrg       single_succ_edge (ret)->flags |= EDGE_IRREDUCIBLE_LOOP;
    678  1.1  mrg     }
    679  1.1  mrg   if (back)
    680  1.1  mrg     {
    681  1.1  mrg       single_pred_edge (ret)->flags &= ~EDGE_DFS_BACK;
    682  1.1  mrg       single_succ_edge (ret)->flags |= EDGE_DFS_BACK;
    683  1.1  mrg     }
    684  1.1  mrg 
    685  1.1  mrg   if (dom_info_available_p (CDI_DOMINATORS))
    686  1.1  mrg     set_immediate_dominator (CDI_DOMINATORS, ret, single_pred (ret));
    687  1.1  mrg 
    688  1.1  mrg   if (dom_info_state (CDI_DOMINATORS) >= DOM_NO_FAST_QUERY)
    689  1.1  mrg     {
    690  1.1  mrg       /* There are two cases:
    691  1.1  mrg 
    692  1.1  mrg 	 If the immediate dominator of e->dest is not e->src, it
    693  1.1  mrg 	 remains unchanged.
    694  1.1  mrg 
    695  1.1  mrg 	 If immediate dominator of e->dest is e->src, it may become
    696  1.1  mrg 	 ret, provided that all other predecessors of e->dest are
    697  1.1  mrg 	 dominated by e->dest.  */
    698  1.1  mrg 
    699  1.1  mrg       if (get_immediate_dominator (CDI_DOMINATORS, single_succ (ret))
    700  1.1  mrg 	  == single_pred (ret))
    701  1.1  mrg 	{
    702  1.1  mrg 	  edge_iterator ei;
    703  1.1  mrg 	  FOR_EACH_EDGE (f, ei, single_succ (ret)->preds)
    704  1.1  mrg 	    {
    705  1.1  mrg 	      if (f == single_succ_edge (ret))
    706  1.1  mrg 		continue;
    707  1.1  mrg 
    708  1.1  mrg 	      if (!dominated_by_p (CDI_DOMINATORS, f->src,
    709  1.1  mrg 				   single_succ (ret)))
    710  1.1  mrg 		break;
    711  1.1  mrg 	    }
    712  1.1  mrg 
    713  1.1  mrg 	  if (!f)
    714  1.1  mrg 	    set_immediate_dominator (CDI_DOMINATORS, single_succ (ret), ret);
    715  1.1  mrg 	}
    716  1.1  mrg     }
    717  1.1  mrg 
    718  1.1  mrg   if (current_loops != NULL)
    719  1.1  mrg     {
    720  1.1  mrg       loop = find_common_loop (src->loop_father, dest->loop_father);
    721  1.1  mrg       add_bb_to_loop (ret, loop);
    722  1.1  mrg 
    723  1.1  mrg       /* If we split the latch edge of loop adjust the latch block.  */
    724  1.1  mrg       if (loop->latch == src
    725  1.1  mrg 	  && loop->header == dest)
    726  1.1  mrg 	loop->latch = ret;
    727  1.1  mrg     }
    728  1.1  mrg 
    729  1.1  mrg   return ret;
    730  1.1  mrg }
    731  1.1  mrg 
    732  1.1  mrg /* Creates a new basic block just after the basic block AFTER.
    733  1.1  mrg    HEAD and END are the first and the last statement belonging
    734  1.1  mrg    to the block.  If both are NULL, an empty block is created.  */
    735  1.1  mrg 
    736  1.1  mrg static basic_block
    737  1.1  mrg create_basic_block_1 (void *head, void *end, basic_block after)
    738  1.1  mrg {
    739  1.1  mrg   basic_block ret;
    740  1.1  mrg 
    741  1.1  mrg   if (!cfg_hooks->create_basic_block)
    742  1.1  mrg     internal_error ("%s does not support create_basic_block", cfg_hooks->name);
    743  1.1  mrg 
    744  1.1  mrg   ret = cfg_hooks->create_basic_block (head, end, after);
    745  1.1  mrg 
    746  1.1  mrg   if (dom_info_available_p (CDI_DOMINATORS))
    747  1.1  mrg     add_to_dominance_info (CDI_DOMINATORS, ret);
    748  1.1  mrg   if (dom_info_available_p (CDI_POST_DOMINATORS))
    749  1.1  mrg     add_to_dominance_info (CDI_POST_DOMINATORS, ret);
    750  1.1  mrg 
    751  1.1  mrg   return ret;
    752  1.1  mrg }
    753  1.1  mrg 
    754  1.1  mrg basic_block
    755  1.1  mrg create_basic_block (gimple_seq seq, basic_block after)
    756  1.1  mrg {
    757  1.1  mrg   return create_basic_block_1 (seq, NULL, after);
    758  1.1  mrg }
    759  1.1  mrg 
    760  1.1  mrg basic_block
    761  1.1  mrg create_basic_block (rtx head, rtx end, basic_block after)
    762  1.1  mrg {
    763  1.1  mrg   return create_basic_block_1 (head, end, after);
    764  1.1  mrg }
    765  1.1  mrg 
    766  1.1  mrg 
    767  1.1  mrg /* Creates an empty basic block just after basic block AFTER.  */
    768  1.1  mrg 
    769  1.1  mrg basic_block
    770  1.1  mrg create_empty_bb (basic_block after)
    771  1.1  mrg {
    772  1.1  mrg   return create_basic_block_1 (NULL, NULL, after);
    773  1.1  mrg }
    774  1.1  mrg 
    775  1.1  mrg /* Checks whether we may merge blocks BB1 and BB2.  */
    776  1.1  mrg 
    777  1.1  mrg bool
    778  1.1  mrg can_merge_blocks_p (basic_block bb1, basic_block bb2)
    779  1.1  mrg {
    780  1.1  mrg   bool ret;
    781  1.1  mrg 
    782  1.1  mrg   if (!cfg_hooks->can_merge_blocks_p)
    783  1.1  mrg     internal_error ("%s does not support can_merge_blocks_p", cfg_hooks->name);
    784  1.1  mrg 
    785  1.1  mrg   ret = cfg_hooks->can_merge_blocks_p (bb1, bb2);
    786  1.1  mrg 
    787  1.1  mrg   return ret;
    788  1.1  mrg }
    789  1.1  mrg 
    790  1.1  mrg void
    791  1.1  mrg predict_edge (edge e, enum br_predictor predictor, int probability)
    792  1.1  mrg {
    793  1.1  mrg   if (!cfg_hooks->predict_edge)
    794  1.1  mrg     internal_error ("%s does not support predict_edge", cfg_hooks->name);
    795  1.1  mrg 
    796  1.1  mrg   cfg_hooks->predict_edge (e, predictor, probability);
    797  1.1  mrg }
    798  1.1  mrg 
    799  1.1  mrg bool
    800  1.1  mrg predicted_by_p (const_basic_block bb, enum br_predictor predictor)
    801  1.1  mrg {
    802  1.1  mrg   if (!cfg_hooks->predict_edge)
    803  1.1  mrg     internal_error ("%s does not support predicted_by_p", cfg_hooks->name);
    804  1.1  mrg 
    805  1.1  mrg   return cfg_hooks->predicted_by_p (bb, predictor);
    806  1.1  mrg }
    807  1.1  mrg 
    808  1.1  mrg /* Merges basic block B into basic block A.  */
    809  1.1  mrg 
    810  1.1  mrg void
    811  1.1  mrg merge_blocks (basic_block a, basic_block b)
    812  1.1  mrg {
    813  1.1  mrg   edge e;
    814  1.1  mrg   edge_iterator ei;
    815  1.1  mrg 
    816  1.1  mrg   if (!cfg_hooks->merge_blocks)
    817  1.1  mrg     internal_error ("%s does not support merge_blocks", cfg_hooks->name);
    818  1.1  mrg 
    819  1.1  mrg   cfg_hooks->merge_blocks (a, b);
    820  1.1  mrg 
    821  1.1  mrg   if (current_loops != NULL)
    822  1.1  mrg     {
    823  1.1  mrg       /* If the block we merge into is a loop header do nothing unless ... */
    824  1.1  mrg       if (a->loop_father->header == a)
    825  1.1  mrg 	{
    826  1.1  mrg 	  /* ... we merge two loop headers, in which case we kill
    827  1.1  mrg 	     the inner loop.  */
    828  1.1  mrg 	  if (b->loop_father->header == b)
    829  1.1  mrg 	    mark_loop_for_removal (b->loop_father);
    830  1.1  mrg 	}
    831  1.1  mrg       /* If we merge a loop header into its predecessor, update the loop
    832  1.1  mrg 	 structure.  */
    833  1.1  mrg       else if (b->loop_father->header == b)
    834  1.1  mrg 	{
    835  1.1  mrg 	  remove_bb_from_loops (a);
    836  1.1  mrg 	  add_bb_to_loop  (a, b->loop_father);
    837  1.1  mrg 	  a->loop_father->header = a;
    838  1.1  mrg 	}
    839  1.1  mrg       /* If we merge a loop latch into its predecessor, update the loop
    840  1.1  mrg          structure.  */
    841  1.1  mrg       if (b->loop_father->latch
    842  1.1  mrg 	  && b->loop_father->latch == b)
    843  1.1  mrg 	b->loop_father->latch = a;
    844  1.1  mrg       remove_bb_from_loops (b);
    845  1.1  mrg     }
    846  1.1  mrg 
    847  1.1  mrg   /* Normally there should only be one successor of A and that is B, but
    848  1.1  mrg      partway though the merge of blocks for conditional_execution we'll
    849  1.1  mrg      be merging a TEST block with THEN and ELSE successors.  Free the
    850  1.1  mrg      whole lot of them and hope the caller knows what they're doing.  */
    851  1.1  mrg 
    852  1.1  mrg   while (EDGE_COUNT (a->succs) != 0)
    853  1.1  mrg     remove_edge (EDGE_SUCC (a, 0));
    854  1.1  mrg 
    855  1.1  mrg   /* Adjust the edges out of B for the new owner.  */
    856  1.1  mrg   FOR_EACH_EDGE (e, ei, b->succs)
    857  1.1  mrg     {
    858  1.1  mrg       e->src = a;
    859  1.1  mrg       if (current_loops != NULL)
    860  1.1  mrg 	{
    861  1.1  mrg 	  /* If b was a latch, a now is.  */
    862  1.1  mrg 	  if (e->dest->loop_father->latch == b)
    863  1.1  mrg 	    e->dest->loop_father->latch = a;
    864  1.1  mrg 	  rescan_loop_exit (e, true, false);
    865  1.1  mrg 	}
    866  1.1  mrg     }
    867  1.1  mrg   a->succs = b->succs;
    868  1.1  mrg   a->flags |= b->flags;
    869  1.1  mrg 
    870  1.1  mrg   /* B hasn't quite yet ceased to exist.  Attempt to prevent mishap.  */
    871  1.1  mrg   b->preds = b->succs = NULL;
    872  1.1  mrg 
    873  1.1  mrg   if (dom_info_available_p (CDI_DOMINATORS))
    874  1.1  mrg     redirect_immediate_dominators (CDI_DOMINATORS, b, a);
    875  1.1  mrg 
    876  1.1  mrg   if (dom_info_available_p (CDI_DOMINATORS))
    877  1.1  mrg     delete_from_dominance_info (CDI_DOMINATORS, b);
    878  1.1  mrg   if (dom_info_available_p (CDI_POST_DOMINATORS))
    879  1.1  mrg     delete_from_dominance_info (CDI_POST_DOMINATORS, b);
    880  1.1  mrg 
    881  1.1  mrg   expunge_block (b);
    882  1.1  mrg }
    883  1.1  mrg 
    884  1.1  mrg /* Split BB into entry part and the rest (the rest is the newly created block).
    885  1.1  mrg    Redirect those edges for that REDIRECT_EDGE_P returns true to the entry
    886  1.1  mrg    part.  Returns the edge connecting the entry part to the rest.  */
    887  1.1  mrg 
    888  1.1  mrg edge
    889  1.1  mrg make_forwarder_block (basic_block bb, bool (*redirect_edge_p) (edge),
    890  1.1  mrg 		      void (*new_bb_cbk) (basic_block))
    891  1.1  mrg {
    892  1.1  mrg   edge e, fallthru;
    893  1.1  mrg   edge_iterator ei;
    894  1.1  mrg   basic_block dummy, jump;
    895  1.1  mrg   class loop *loop, *ploop, *cloop;
    896  1.1  mrg 
    897  1.1  mrg   if (!cfg_hooks->make_forwarder_block)
    898  1.1  mrg     internal_error ("%s does not support make_forwarder_block",
    899  1.1  mrg 		    cfg_hooks->name);
    900  1.1  mrg 
    901  1.1  mrg   fallthru = split_block_after_labels (bb);
    902  1.1  mrg   dummy = fallthru->src;
    903  1.1  mrg   dummy->count = profile_count::zero ();
    904  1.1  mrg   bb = fallthru->dest;
    905  1.1  mrg 
    906  1.1  mrg   /* Redirect back edges we want to keep.  */
    907  1.1  mrg   for (ei = ei_start (dummy->preds); (e = ei_safe_edge (ei)); )
    908  1.1  mrg     {
    909  1.1  mrg       basic_block e_src;
    910  1.1  mrg 
    911  1.1  mrg       if (redirect_edge_p (e))
    912  1.1  mrg 	{
    913  1.1  mrg 	  dummy->count += e->count ();
    914  1.1  mrg 	  ei_next (&ei);
    915  1.1  mrg 	  continue;
    916  1.1  mrg 	}
    917  1.1  mrg 
    918  1.1  mrg       e_src = e->src;
    919  1.1  mrg       jump = redirect_edge_and_branch_force (e, bb);
    920  1.1  mrg       if (jump != NULL)
    921  1.1  mrg         {
    922  1.1  mrg           /* If we redirected the loop latch edge, the JUMP block now acts like
    923  1.1  mrg              the new latch of the loop.  */
    924  1.1  mrg           if (current_loops != NULL
    925  1.1  mrg               && dummy->loop_father != NULL
    926  1.1  mrg               && dummy->loop_father->header == dummy
    927  1.1  mrg               && dummy->loop_father->latch == e_src)
    928  1.1  mrg             dummy->loop_father->latch = jump;
    929  1.1  mrg 
    930  1.1  mrg           if (new_bb_cbk != NULL)
    931  1.1  mrg             new_bb_cbk (jump);
    932  1.1  mrg         }
    933  1.1  mrg     }
    934  1.1  mrg 
    935  1.1  mrg   if (dom_info_available_p (CDI_DOMINATORS))
    936  1.1  mrg     {
    937  1.1  mrg       vec<basic_block> doms_to_fix;
    938  1.1  mrg       doms_to_fix.create (2);
    939  1.1  mrg       doms_to_fix.quick_push (dummy);
    940  1.1  mrg       doms_to_fix.quick_push (bb);
    941  1.1  mrg       iterate_fix_dominators (CDI_DOMINATORS, doms_to_fix, false);
    942  1.1  mrg       doms_to_fix.release ();
    943  1.1  mrg     }
    944  1.1  mrg 
    945  1.1  mrg   if (current_loops != NULL)
    946  1.1  mrg     {
    947  1.1  mrg       /* If we do not split a loop header, then both blocks belong to the
    948  1.1  mrg 	 same loop.  In case we split loop header and do not redirect the
    949  1.1  mrg 	 latch edge to DUMMY, then DUMMY belongs to the outer loop, and
    950  1.1  mrg 	 BB becomes the new header.  If latch is not recorded for the loop,
    951  1.1  mrg 	 we leave this updating on the caller (this may only happen during
    952  1.1  mrg 	 loop analysis).  */
    953  1.1  mrg       loop = dummy->loop_father;
    954  1.1  mrg       if (loop->header == dummy
    955  1.1  mrg 	  && loop->latch != NULL
    956  1.1  mrg 	  && find_edge (loop->latch, dummy) == NULL)
    957  1.1  mrg 	{
    958  1.1  mrg 	  remove_bb_from_loops (dummy);
    959  1.1  mrg 	  loop->header = bb;
    960  1.1  mrg 
    961  1.1  mrg 	  cloop = loop;
    962  1.1  mrg 	  FOR_EACH_EDGE (e, ei, dummy->preds)
    963  1.1  mrg 	    {
    964  1.1  mrg 	      cloop = find_common_loop (cloop, e->src->loop_father);
    965  1.1  mrg 	    }
    966  1.1  mrg 	  add_bb_to_loop (dummy, cloop);
    967  1.1  mrg 	}
    968  1.1  mrg 
    969  1.1  mrg       /* In case we split loop latch, update it.  */
    970  1.1  mrg       for (ploop = loop; ploop; ploop = loop_outer (ploop))
    971  1.1  mrg 	if (ploop->latch == dummy)
    972  1.1  mrg 	  ploop->latch = bb;
    973  1.1  mrg     }
    974  1.1  mrg 
    975  1.1  mrg   cfg_hooks->make_forwarder_block (fallthru);
    976  1.1  mrg 
    977  1.1  mrg   return fallthru;
    978  1.1  mrg }
    979  1.1  mrg 
    980  1.1  mrg /* Try to make the edge fallthru.  */
    981  1.1  mrg 
    982  1.1  mrg void
    983  1.1  mrg tidy_fallthru_edge (edge e)
    984  1.1  mrg {
    985  1.1  mrg   if (cfg_hooks->tidy_fallthru_edge)
    986  1.1  mrg     cfg_hooks->tidy_fallthru_edge (e);
    987  1.1  mrg }
    988  1.1  mrg 
    989  1.1  mrg /* Fix up edges that now fall through, or rather should now fall through
    990  1.1  mrg    but previously required a jump around now deleted blocks.  Simplify
    991  1.1  mrg    the search by only examining blocks numerically adjacent, since this
    992  1.1  mrg    is how they were created.
    993  1.1  mrg 
    994  1.1  mrg    ??? This routine is currently RTL specific.  */
    995  1.1  mrg 
    996  1.1  mrg void
    997  1.1  mrg tidy_fallthru_edges (void)
    998  1.1  mrg {
    999  1.1  mrg   basic_block b, c;
   1000  1.1  mrg 
   1001  1.1  mrg   if (!cfg_hooks->tidy_fallthru_edge)
   1002  1.1  mrg     return;
   1003  1.1  mrg 
   1004  1.1  mrg   if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
   1005  1.1  mrg     return;
   1006  1.1  mrg 
   1007  1.1  mrg   FOR_BB_BETWEEN (b, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb,
   1008  1.1  mrg 		  EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb, next_bb)
   1009  1.1  mrg     {
   1010  1.1  mrg       edge s;
   1011  1.1  mrg 
   1012  1.1  mrg       c = b->next_bb;
   1013  1.1  mrg 
   1014  1.1  mrg       /* We care about simple conditional or unconditional jumps with
   1015  1.1  mrg 	 a single successor.
   1016  1.1  mrg 
   1017  1.1  mrg 	 If we had a conditional branch to the next instruction when
   1018  1.1  mrg 	 CFG was built, then there will only be one out edge for the
   1019  1.1  mrg 	 block which ended with the conditional branch (since we do
   1020  1.1  mrg 	 not create duplicate edges).
   1021  1.1  mrg 
   1022  1.1  mrg 	 Furthermore, the edge will be marked as a fallthru because we
   1023  1.1  mrg 	 merge the flags for the duplicate edges.  So we do not want to
   1024  1.1  mrg 	 check that the edge is not a FALLTHRU edge.  */
   1025  1.1  mrg 
   1026  1.1  mrg       if (single_succ_p (b))
   1027  1.1  mrg 	{
   1028  1.1  mrg 	  s = single_succ_edge (b);
   1029  1.1  mrg 	  if (! (s->flags & EDGE_COMPLEX)
   1030  1.1  mrg 	      && s->dest == c
   1031  1.1  mrg 	      && !(JUMP_P (BB_END (b)) && CROSSING_JUMP_P (BB_END (b))))
   1032  1.1  mrg 	    tidy_fallthru_edge (s);
   1033  1.1  mrg 	}
   1034  1.1  mrg     }
   1035  1.1  mrg }
   1036  1.1  mrg 
   1037  1.1  mrg /* Edge E is assumed to be fallthru edge.  Emit needed jump instruction
   1038  1.1  mrg    (and possibly create new basic block) to make edge non-fallthru.
   1039  1.1  mrg    Return newly created BB or NULL if none.  */
   1040  1.1  mrg 
   1041  1.1  mrg basic_block
   1042  1.1  mrg force_nonfallthru (edge e)
   1043  1.1  mrg {
   1044  1.1  mrg   basic_block ret, src = e->src;
   1045  1.1  mrg 
   1046  1.1  mrg   if (!cfg_hooks->force_nonfallthru)
   1047  1.1  mrg     internal_error ("%s does not support force_nonfallthru",
   1048  1.1  mrg 		    cfg_hooks->name);
   1049  1.1  mrg 
   1050  1.1  mrg   ret = cfg_hooks->force_nonfallthru (e);
   1051  1.1  mrg   if (ret != NULL)
   1052  1.1  mrg     {
   1053  1.1  mrg       if (dom_info_available_p (CDI_DOMINATORS))
   1054  1.1  mrg 	set_immediate_dominator (CDI_DOMINATORS, ret, src);
   1055  1.1  mrg 
   1056  1.1  mrg       if (current_loops != NULL)
   1057  1.1  mrg 	{
   1058  1.1  mrg 	  basic_block pred = single_pred (ret);
   1059  1.1  mrg 	  basic_block succ = single_succ (ret);
   1060  1.1  mrg 	  class loop *loop
   1061  1.1  mrg 	    = find_common_loop (pred->loop_father, succ->loop_father);
   1062  1.1  mrg 	  rescan_loop_exit (e, false, true);
   1063  1.1  mrg 	  add_bb_to_loop (ret, loop);
   1064  1.1  mrg 
   1065  1.1  mrg 	  /* If we split the latch edge of loop adjust the latch block.  */
   1066  1.1  mrg 	  if (loop->latch == pred
   1067  1.1  mrg 	      && loop->header == succ)
   1068  1.1  mrg 	    loop->latch = ret;
   1069  1.1  mrg 	}
   1070  1.1  mrg     }
   1071  1.1  mrg 
   1072  1.1  mrg   return ret;
   1073  1.1  mrg }
   1074  1.1  mrg 
   1075  1.1  mrg /* Returns true if we can duplicate basic block BB.  */
   1076  1.1  mrg 
   1077  1.1  mrg bool
   1078  1.1  mrg can_duplicate_block_p (const_basic_block bb)
   1079  1.1  mrg {
   1080  1.1  mrg   if (!cfg_hooks->can_duplicate_block_p)
   1081  1.1  mrg     internal_error ("%s does not support can_duplicate_block_p",
   1082  1.1  mrg 		    cfg_hooks->name);
   1083  1.1  mrg 
   1084  1.1  mrg   if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun) || bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
   1085  1.1  mrg     return false;
   1086  1.1  mrg 
   1087  1.1  mrg   return cfg_hooks->can_duplicate_block_p (bb);
   1088  1.1  mrg }
   1089  1.1  mrg 
   1090  1.1  mrg /* Duplicates basic block BB and redirects edge E to it.  Returns the
   1091  1.1  mrg    new basic block.  The new basic block is placed after the basic block
   1092  1.1  mrg    AFTER.  */
   1093  1.1  mrg 
   1094  1.1  mrg basic_block
   1095  1.1  mrg duplicate_block (basic_block bb, edge e, basic_block after, copy_bb_data *id)
   1096  1.1  mrg {
   1097  1.1  mrg   edge s, n;
   1098  1.1  mrg   basic_block new_bb;
   1099  1.1  mrg   profile_count new_count = e ? e->count (): profile_count::uninitialized ();
   1100  1.1  mrg   edge_iterator ei;
   1101  1.1  mrg 
   1102  1.1  mrg   if (!cfg_hooks->duplicate_block)
   1103  1.1  mrg     internal_error ("%s does not support duplicate_block",
   1104  1.1  mrg 		    cfg_hooks->name);
   1105  1.1  mrg 
   1106  1.1  mrg   if (bb->count < new_count)
   1107  1.1  mrg     new_count = bb->count;
   1108  1.1  mrg 
   1109  1.1  mrg   gcc_checking_assert (can_duplicate_block_p (bb));
   1110  1.1  mrg 
   1111  1.1  mrg   new_bb = cfg_hooks->duplicate_block (bb, id);
   1112  1.1  mrg   if (after)
   1113  1.1  mrg     move_block_after (new_bb, after);
   1114  1.1  mrg 
   1115  1.1  mrg   new_bb->flags = (bb->flags & ~BB_DUPLICATED);
   1116  1.1  mrg   FOR_EACH_EDGE (s, ei, bb->succs)
   1117  1.1  mrg     {
   1118  1.1  mrg       /* Since we are creating edges from a new block to successors
   1119  1.1  mrg 	 of another block (which therefore are known to be disjoint), there
   1120  1.1  mrg 	 is no need to actually check for duplicated edges.  */
   1121  1.1  mrg       n = unchecked_make_edge (new_bb, s->dest, s->flags);
   1122  1.1  mrg       n->probability = s->probability;
   1123  1.1  mrg       n->aux = s->aux;
   1124  1.1  mrg     }
   1125  1.1  mrg 
   1126  1.1  mrg   if (e)
   1127  1.1  mrg     {
   1128  1.1  mrg       new_bb->count = new_count;
   1129  1.1  mrg       bb->count -= new_count;
   1130  1.1  mrg 
   1131  1.1  mrg       redirect_edge_and_branch_force (e, new_bb);
   1132  1.1  mrg     }
   1133  1.1  mrg   else
   1134  1.1  mrg     new_bb->count = bb->count;
   1135  1.1  mrg 
   1136  1.1  mrg   set_bb_original (new_bb, bb);
   1137  1.1  mrg   set_bb_copy (bb, new_bb);
   1138  1.1  mrg 
   1139  1.1  mrg   /* Add the new block to the copy of the loop of BB, or directly to the loop
   1140  1.1  mrg      of BB if the loop is not being copied.  */
   1141  1.1  mrg   if (current_loops != NULL)
   1142  1.1  mrg     {
   1143  1.1  mrg       class loop *cloop = bb->loop_father;
   1144  1.1  mrg       class loop *copy = get_loop_copy (cloop);
   1145  1.1  mrg       /* If we copied the loop header block but not the loop
   1146  1.1  mrg 	 we have created a loop with multiple entries.  Ditch the loop,
   1147  1.1  mrg 	 add the new block to the outer loop and arrange for a fixup.  */
   1148  1.1  mrg       if (!copy
   1149  1.1  mrg 	  && cloop->header == bb)
   1150  1.1  mrg 	{
   1151  1.1  mrg 	  add_bb_to_loop (new_bb, loop_outer (cloop));
   1152  1.1  mrg 	  mark_loop_for_removal (cloop);
   1153  1.1  mrg 	}
   1154  1.1  mrg       else
   1155  1.1  mrg 	{
   1156  1.1  mrg 	  add_bb_to_loop (new_bb, copy ? copy : cloop);
   1157  1.1  mrg 	  /* If we copied the loop latch block but not the loop, adjust
   1158  1.1  mrg 	     loop state.  */
   1159  1.1  mrg 	  if (!copy
   1160  1.1  mrg 	      && cloop->latch == bb)
   1161  1.1  mrg 	    {
   1162  1.1  mrg 	      cloop->latch = NULL;
   1163  1.1  mrg 	      loops_state_set (LOOPS_MAY_HAVE_MULTIPLE_LATCHES);
   1164  1.1  mrg 	    }
   1165  1.1  mrg 	}
   1166  1.1  mrg     }
   1167  1.1  mrg 
   1168  1.1  mrg   return new_bb;
   1169  1.1  mrg }
   1170  1.1  mrg 
   1171  1.1  mrg /* Return 1 if BB ends with a call, possibly followed by some
   1172  1.1  mrg    instructions that must stay with the call, 0 otherwise.  */
   1173  1.1  mrg 
   1174  1.1  mrg bool
   1175  1.1  mrg block_ends_with_call_p (basic_block bb)
   1176  1.1  mrg {
   1177  1.1  mrg   if (!cfg_hooks->block_ends_with_call_p)
   1178  1.1  mrg     internal_error ("%s does not support block_ends_with_call_p", cfg_hooks->name);
   1179  1.1  mrg 
   1180  1.1  mrg   return (cfg_hooks->block_ends_with_call_p) (bb);
   1181  1.1  mrg }
   1182  1.1  mrg 
   1183  1.1  mrg /* Return 1 if BB ends with a conditional branch, 0 otherwise.  */
   1184  1.1  mrg 
   1185  1.1  mrg bool
   1186  1.1  mrg block_ends_with_condjump_p (const_basic_block bb)
   1187  1.1  mrg {
   1188  1.1  mrg   if (!cfg_hooks->block_ends_with_condjump_p)
   1189  1.1  mrg     internal_error ("%s does not support block_ends_with_condjump_p",
   1190  1.1  mrg 		    cfg_hooks->name);
   1191  1.1  mrg 
   1192  1.1  mrg   return (cfg_hooks->block_ends_with_condjump_p) (bb);
   1193  1.1  mrg }
   1194  1.1  mrg 
   1195  1.1  mrg /* Add fake edges to the function exit for any non constant and non noreturn
   1196  1.1  mrg    calls, volatile inline assembly in the bitmap of blocks specified by
   1197  1.1  mrg    BLOCKS or to the whole CFG if BLOCKS is zero.  Return the number of blocks
   1198  1.1  mrg    that were split.
   1199  1.1  mrg 
   1200  1.1  mrg    The goal is to expose cases in which entering a basic block does not imply
   1201  1.1  mrg    that all subsequent instructions must be executed.  */
   1202  1.1  mrg 
   1203  1.1  mrg int
   1204  1.1  mrg flow_call_edges_add (sbitmap blocks)
   1205  1.1  mrg {
   1206  1.1  mrg   if (!cfg_hooks->flow_call_edges_add)
   1207  1.1  mrg     internal_error ("%s does not support flow_call_edges_add",
   1208  1.1  mrg 		    cfg_hooks->name);
   1209  1.1  mrg 
   1210  1.1  mrg   return (cfg_hooks->flow_call_edges_add) (blocks);
   1211  1.1  mrg }
   1212  1.1  mrg 
   1213  1.1  mrg /* This function is called immediately after edge E is added to the
   1214  1.1  mrg    edge vector E->dest->preds.  */
   1215  1.1  mrg 
   1216  1.1  mrg void
   1217  1.1  mrg execute_on_growing_pred (edge e)
   1218  1.1  mrg {
   1219  1.1  mrg   if (! (e->dest->flags & BB_DUPLICATED)
   1220  1.1  mrg       && cfg_hooks->execute_on_growing_pred)
   1221  1.1  mrg     cfg_hooks->execute_on_growing_pred (e);
   1222  1.1  mrg }
   1223  1.1  mrg 
   1224  1.1  mrg /* This function is called immediately before edge E is removed from
   1225  1.1  mrg    the edge vector E->dest->preds.  */
   1226  1.1  mrg 
   1227  1.1  mrg void
   1228  1.1  mrg execute_on_shrinking_pred (edge e)
   1229  1.1  mrg {
   1230  1.1  mrg   if (! (e->dest->flags & BB_DUPLICATED)
   1231  1.1  mrg       && cfg_hooks->execute_on_shrinking_pred)
   1232  1.1  mrg     cfg_hooks->execute_on_shrinking_pred (e);
   1233  1.1  mrg }
   1234  1.1  mrg 
   1235  1.1  mrg /* This is used inside loop versioning when we want to insert
   1236  1.1  mrg    stmts/insns on the edges, which have a different behavior
   1237  1.1  mrg    in tree's and in RTL, so we made a CFG hook.  */
   1238  1.1  mrg void
   1239  1.1  mrg lv_flush_pending_stmts (edge e)
   1240  1.1  mrg {
   1241  1.1  mrg   if (cfg_hooks->flush_pending_stmts)
   1242  1.1  mrg     cfg_hooks->flush_pending_stmts (e);
   1243  1.1  mrg }
   1244  1.1  mrg 
   1245  1.1  mrg /* Loop versioning uses the duplicate_loop_body_to_header_edge to create
   1246  1.1  mrg    a new version of the loop basic-blocks, the parameters here are
   1247  1.1  mrg    exactly the same as in duplicate_loop_body_to_header_edge or
   1248  1.1  mrg    tree_duplicate_loop_body_to_header_edge; while in tree-ssa there is
   1249  1.1  mrg    additional work to maintain ssa information that's why there is
   1250  1.1  mrg    a need to call the tree_duplicate_loop_body_to_header_edge rather
   1251  1.1  mrg    than duplicate_loop_body_to_header_edge when we are in tree mode.  */
   1252  1.1  mrg bool
   1253  1.1  mrg cfg_hook_duplicate_loop_body_to_header_edge (class loop *loop, edge e,
   1254  1.1  mrg 					     unsigned int ndupl,
   1255  1.1  mrg 					     sbitmap wont_exit, edge orig,
   1256  1.1  mrg 					     vec<edge> *to_remove, int flags)
   1257  1.1  mrg {
   1258  1.1  mrg   gcc_assert (cfg_hooks->cfg_hook_duplicate_loop_body_to_header_edge);
   1259  1.1  mrg   return cfg_hooks->cfg_hook_duplicate_loop_body_to_header_edge (
   1260  1.1  mrg     loop, e, ndupl, wont_exit, orig, to_remove, flags);
   1261  1.1  mrg }
   1262  1.1  mrg 
   1263  1.1  mrg /* Conditional jumps are represented differently in trees and RTL,
   1264  1.1  mrg    this hook takes a basic block that is known to have a cond jump
   1265  1.1  mrg    at its end and extracts the taken and not taken edges out of it
   1266  1.1  mrg    and store it in E1 and E2 respectively.  */
   1267  1.1  mrg void
   1268  1.1  mrg extract_cond_bb_edges (basic_block b, edge *e1, edge *e2)
   1269  1.1  mrg {
   1270  1.1  mrg   gcc_assert (cfg_hooks->extract_cond_bb_edges);
   1271  1.1  mrg   cfg_hooks->extract_cond_bb_edges (b, e1, e2);
   1272  1.1  mrg }
   1273  1.1  mrg 
   1274  1.1  mrg /* Responsible for updating the ssa info (PHI nodes) on the
   1275  1.1  mrg    new condition basic block that guards the versioned loop.  */
   1276  1.1  mrg void
   1277  1.1  mrg lv_adjust_loop_header_phi (basic_block first, basic_block second,
   1278  1.1  mrg 			   basic_block new_block, edge e)
   1279  1.1  mrg {
   1280  1.1  mrg   if (cfg_hooks->lv_adjust_loop_header_phi)
   1281  1.1  mrg     cfg_hooks->lv_adjust_loop_header_phi (first, second, new_block, e);
   1282  1.1  mrg }
   1283  1.1  mrg 
   1284  1.1  mrg /* Conditions in trees and RTL are different so we need
   1285  1.1  mrg    a different handling when we add the condition to the
   1286  1.1  mrg    versioning code.  */
   1287  1.1  mrg void
   1288  1.1  mrg lv_add_condition_to_bb (basic_block first, basic_block second,
   1289  1.1  mrg 			basic_block new_block, void *cond)
   1290  1.1  mrg {
   1291  1.1  mrg   gcc_assert (cfg_hooks->lv_add_condition_to_bb);
   1292  1.1  mrg   cfg_hooks->lv_add_condition_to_bb (first, second, new_block, cond);
   1293  1.1  mrg }
   1294  1.1  mrg 
   1295  1.1  mrg /* Checks whether all N blocks in BBS array can be copied.  */
   1296  1.1  mrg bool
   1297  1.1  mrg can_copy_bbs_p (basic_block *bbs, unsigned n)
   1298  1.1  mrg {
   1299  1.1  mrg   unsigned i;
   1300  1.1  mrg   edge e;
   1301  1.1  mrg   int ret = true;
   1302  1.1  mrg 
   1303  1.1  mrg   for (i = 0; i < n; i++)
   1304  1.1  mrg     bbs[i]->flags |= BB_DUPLICATED;
   1305  1.1  mrg 
   1306  1.1  mrg   for (i = 0; i < n; i++)
   1307  1.1  mrg     {
   1308  1.1  mrg       /* In case we should redirect abnormal edge during duplication, fail.  */
   1309  1.1  mrg       edge_iterator ei;
   1310  1.1  mrg       FOR_EACH_EDGE (e, ei, bbs[i]->succs)
   1311  1.1  mrg 	if ((e->flags & EDGE_ABNORMAL)
   1312  1.1  mrg 	    && (e->dest->flags & BB_DUPLICATED))
   1313  1.1  mrg 	  {
   1314  1.1  mrg 	    ret = false;
   1315  1.1  mrg 	    goto end;
   1316  1.1  mrg 	  }
   1317  1.1  mrg 
   1318  1.1  mrg       if (!can_duplicate_block_p (bbs[i]))
   1319  1.1  mrg 	{
   1320  1.1  mrg 	  ret = false;
   1321  1.1  mrg 	  break;
   1322  1.1  mrg 	}
   1323  1.1  mrg     }
   1324  1.1  mrg 
   1325  1.1  mrg end:
   1326  1.1  mrg   for (i = 0; i < n; i++)
   1327  1.1  mrg     bbs[i]->flags &= ~BB_DUPLICATED;
   1328  1.1  mrg 
   1329  1.1  mrg   return ret;
   1330  1.1  mrg }
   1331  1.1  mrg 
   1332  1.1  mrg /* Duplicates N basic blocks stored in array BBS.  Newly created basic blocks
   1333  1.1  mrg    are placed into array NEW_BBS in the same order.  Edges from basic blocks
   1334  1.1  mrg    in BBS are also duplicated and copies of those that lead into BBS are
   1335  1.1  mrg    redirected to appropriate newly created block.  The function assigns bbs
   1336  1.1  mrg    into loops (copy of basic block bb is assigned to bb->loop_father->copy
   1337  1.1  mrg    loop, so this must be set up correctly in advance)
   1338  1.1  mrg 
   1339  1.1  mrg    If UPDATE_DOMINANCE is true then this function updates dominators locally
   1340  1.1  mrg    (LOOPS structure that contains the information about dominators is passed
   1341  1.1  mrg    to enable this), otherwise it does not update the dominator information
   1342  1.1  mrg    and it assumed that the caller will do this, perhaps by destroying and
   1343  1.1  mrg    recreating it instead of trying to do an incremental update like this
   1344  1.1  mrg    function does when update_dominance is true.
   1345  1.1  mrg 
   1346  1.1  mrg    BASE is the superloop to that basic block belongs; if its header or latch
   1347  1.1  mrg    is copied, we do not set the new blocks as header or latch.
   1348  1.1  mrg 
   1349  1.1  mrg    Created copies of N_EDGES edges in array EDGES are stored in array NEW_EDGES,
   1350  1.1  mrg    also in the same order.
   1351  1.1  mrg 
   1352  1.1  mrg    Newly created basic blocks are put after the basic block AFTER in the
   1353  1.1  mrg    instruction stream, and the order of the blocks in BBS array is preserved.  */
   1354  1.1  mrg 
   1355  1.1  mrg void
   1356  1.1  mrg copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
   1357  1.1  mrg 	  edge *edges, unsigned num_edges, edge *new_edges,
   1358  1.1  mrg 	  class loop *base, basic_block after, bool update_dominance)
   1359  1.1  mrg {
   1360  1.1  mrg   unsigned i, j;
   1361  1.1  mrg   basic_block bb, new_bb, dom_bb;
   1362  1.1  mrg   edge e;
   1363  1.1  mrg   copy_bb_data id;
   1364  1.1  mrg 
   1365  1.1  mrg   /* Mark the blocks to be copied.  This is used by edge creation hooks
   1366  1.1  mrg      to decide whether to reallocate PHI nodes capacity to avoid reallocating
   1367  1.1  mrg      PHIs in the set of source BBs.  */
   1368  1.1  mrg   for (i = 0; i < n; i++)
   1369  1.1  mrg     bbs[i]->flags |= BB_DUPLICATED;
   1370  1.1  mrg 
   1371  1.1  mrg   /* Duplicate bbs, update dominators, assign bbs to loops.  */
   1372  1.1  mrg   for (i = 0; i < n; i++)
   1373  1.1  mrg     {
   1374  1.1  mrg       /* Duplicate.  */
   1375  1.1  mrg       bb = bbs[i];
   1376  1.1  mrg       new_bb = new_bbs[i] = duplicate_block (bb, NULL, after, &id);
   1377  1.1  mrg       after = new_bb;
   1378  1.1  mrg       if (bb->loop_father)
   1379  1.1  mrg 	{
   1380  1.1  mrg 	  /* Possibly set loop header.  */
   1381  1.1  mrg 	  if (bb->loop_father->header == bb && bb->loop_father != base)
   1382  1.1  mrg 	    new_bb->loop_father->header = new_bb;
   1383  1.1  mrg 	  /* Or latch.  */
   1384  1.1  mrg 	  if (bb->loop_father->latch == bb && bb->loop_father != base)
   1385  1.1  mrg 	    new_bb->loop_father->latch = new_bb;
   1386  1.1  mrg 	}
   1387  1.1  mrg     }
   1388  1.1  mrg 
   1389  1.1  mrg   /* Set dominators.  */
   1390  1.1  mrg   if (update_dominance)
   1391  1.1  mrg     {
   1392  1.1  mrg       for (i = 0; i < n; i++)
   1393  1.1  mrg 	{
   1394  1.1  mrg 	  bb = bbs[i];
   1395  1.1  mrg 	  new_bb = new_bbs[i];
   1396  1.1  mrg 
   1397  1.1  mrg 	  dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb);
   1398  1.1  mrg 	  if (dom_bb->flags & BB_DUPLICATED)
   1399  1.1  mrg 	    {
   1400  1.1  mrg 	      dom_bb = get_bb_copy (dom_bb);
   1401  1.1  mrg 	      set_immediate_dominator (CDI_DOMINATORS, new_bb, dom_bb);
   1402  1.1  mrg 	    }
   1403  1.1  mrg 	}
   1404  1.1  mrg     }
   1405  1.1  mrg 
   1406  1.1  mrg   /* Redirect edges.  */
   1407  1.1  mrg   for (i = 0; i < n; i++)
   1408  1.1  mrg     {
   1409  1.1  mrg       edge_iterator ei;
   1410  1.1  mrg       new_bb = new_bbs[i];
   1411  1.1  mrg       bb = bbs[i];
   1412  1.1  mrg 
   1413  1.1  mrg       FOR_EACH_EDGE (e, ei, new_bb->succs)
   1414  1.1  mrg 	{
   1415  1.1  mrg 	  if (!(e->dest->flags & BB_DUPLICATED))
   1416  1.1  mrg 	    continue;
   1417  1.1  mrg 	  redirect_edge_and_branch_force (e, get_bb_copy (e->dest));
   1418  1.1  mrg 	}
   1419  1.1  mrg     }
   1420  1.1  mrg   for (j = 0; j < num_edges; j++)
   1421  1.1  mrg     {
   1422  1.1  mrg       if (!edges[j])
   1423  1.1  mrg 	new_edges[j] = NULL;
   1424  1.1  mrg       else
   1425  1.1  mrg 	{
   1426  1.1  mrg 	  basic_block src = edges[j]->src;
   1427  1.1  mrg 	  basic_block dest = edges[j]->dest;
   1428  1.1  mrg 	  if (src->flags & BB_DUPLICATED)
   1429  1.1  mrg 	    src = get_bb_copy (src);
   1430  1.1  mrg 	  if (dest->flags & BB_DUPLICATED)
   1431  1.1  mrg 	    dest = get_bb_copy (dest);
   1432  1.1  mrg 	  new_edges[j] = find_edge (src, dest);
   1433  1.1  mrg 	}
   1434  1.1  mrg     }
   1435  1.1  mrg 
   1436  1.1  mrg   /* Clear information about duplicates.  */
   1437  1.1  mrg   for (i = 0; i < n; i++)
   1438  1.1  mrg     bbs[i]->flags &= ~BB_DUPLICATED;
   1439  1.1  mrg }
   1440  1.1  mrg 
   1441  1.1  mrg /* Return true if BB contains only labels or non-executable
   1442  1.1  mrg    instructions */
   1443  1.1  mrg bool
   1444  1.1  mrg empty_block_p (basic_block bb)
   1445  1.1  mrg {
   1446  1.1  mrg   gcc_assert (cfg_hooks->empty_block_p);
   1447  1.1  mrg   return cfg_hooks->empty_block_p (bb);
   1448  1.1  mrg }
   1449  1.1  mrg 
   1450  1.1  mrg /* Split a basic block if it ends with a conditional branch and if
   1451  1.1  mrg    the other part of the block is not empty.  */
   1452  1.1  mrg basic_block
   1453  1.1  mrg split_block_before_cond_jump (basic_block bb)
   1454  1.1  mrg {
   1455  1.1  mrg   gcc_assert (cfg_hooks->split_block_before_cond_jump);
   1456  1.1  mrg   return cfg_hooks->split_block_before_cond_jump (bb);
   1457  1.1  mrg }
   1458  1.1  mrg 
   1459  1.1  mrg /* Work-horse for passes.cc:check_profile_consistency.
   1460  1.1  mrg    Do book-keeping of the CFG for the profile consistency checker.
   1461  1.1  mrg    Store the counting in RECORD.  */
   1462  1.1  mrg 
   1463  1.1  mrg void
   1464  1.1  mrg profile_record_check_consistency (profile_record *record)
   1465  1.1  mrg {
   1466  1.1  mrg   basic_block bb;
   1467  1.1  mrg   edge_iterator ei;
   1468  1.1  mrg   edge e;
   1469  1.1  mrg 
   1470  1.1  mrg   FOR_ALL_BB_FN (bb, cfun)
   1471  1.1  mrg    {
   1472  1.1  mrg       if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
   1473  1.1  mrg 	  && profile_status_for_fn (cfun) != PROFILE_ABSENT
   1474  1.1  mrg 	  && EDGE_COUNT (bb->succs))
   1475  1.1  mrg 	{
   1476  1.1  mrg 	  sreal sum = 0;
   1477  1.1  mrg 	  bool found = false;
   1478  1.1  mrg 	  FOR_EACH_EDGE (e, ei, bb->succs)
   1479  1.1  mrg 	    {
   1480  1.1  mrg 	      if (!(e->flags & (EDGE_EH | EDGE_FAKE)))
   1481  1.1  mrg 		found = true;
   1482  1.1  mrg 	      if (e->probability.initialized_p ())
   1483  1.1  mrg 	        sum += e->probability.to_sreal ();
   1484  1.1  mrg 	    }
   1485  1.1  mrg 	  double dsum = sum.to_double ();
   1486  1.1  mrg 	  if (found && (dsum < 0.9 || dsum > 1.1)
   1487  1.1  mrg 	      && !(bb->count == profile_count::zero ()))
   1488  1.1  mrg 	    {
   1489  1.1  mrg 	      record->num_mismatched_prob_out++;
   1490  1.1  mrg 	      dsum = dsum > 1 ? dsum - 1 : 1 - dsum;
   1491  1.1  mrg 	      if (profile_info)
   1492  1.1  mrg 		{
   1493  1.1  mrg 		  if (ENTRY_BLOCK_PTR_FOR_FN
   1494  1.1  mrg 			 (cfun)->count.ipa ().initialized_p ()
   1495  1.1  mrg 		      && ENTRY_BLOCK_PTR_FOR_FN
   1496  1.1  mrg 			 (cfun)->count.ipa ().nonzero_p ()
   1497  1.1  mrg 		      && bb->count.ipa ().initialized_p ())
   1498  1.1  mrg 		    record->dyn_mismatched_prob_out
   1499  1.1  mrg 			+= dsum * bb->count.ipa ().to_gcov_type ();
   1500  1.1  mrg 		}
   1501  1.1  mrg 	      else if (bb->count.initialized_p ())
   1502  1.1  mrg 		record->dyn_mismatched_prob_out
   1503  1.1  mrg 		    += dsum * bb->count.to_sreal_scale
   1504  1.1  mrg 			(ENTRY_BLOCK_PTR_FOR_FN (cfun)->count).to_double ();
   1505  1.1  mrg 	    }
   1506  1.1  mrg 	}
   1507  1.1  mrg       if (bb != ENTRY_BLOCK_PTR_FOR_FN (cfun)
   1508  1.1  mrg 	  && profile_status_for_fn (cfun) != PROFILE_ABSENT)
   1509  1.1  mrg 	{
   1510  1.1  mrg 	  profile_count lsum = profile_count::zero ();
   1511  1.1  mrg 	  FOR_EACH_EDGE (e, ei, bb->preds)
   1512  1.1  mrg 	    lsum += e->count ();
   1513  1.1  mrg 	  if (lsum.differs_from_p (bb->count))
   1514  1.1  mrg 	    {
   1515  1.1  mrg 	      record->num_mismatched_count_in++;
   1516  1.1  mrg 	      profile_count max;
   1517  1.1  mrg 	      if (lsum < bb->count)
   1518  1.1  mrg 		max = bb->count;
   1519  1.1  mrg 	      else
   1520  1.1  mrg 		max = lsum;
   1521  1.1  mrg 	      if (profile_info)
   1522  1.1  mrg 		{
   1523  1.1  mrg 		  if (ENTRY_BLOCK_PTR_FOR_FN
   1524  1.1  mrg 			 (cfun)->count.ipa ().initialized_p ()
   1525  1.1  mrg 		      && ENTRY_BLOCK_PTR_FOR_FN
   1526  1.1  mrg 			 (cfun)->count.ipa ().nonzero_p ()
   1527  1.1  mrg 		      && max.ipa ().initialized_p ())
   1528  1.1  mrg 		    record->dyn_mismatched_count_in
   1529  1.1  mrg 			+= max.ipa ().to_gcov_type ();
   1530  1.1  mrg 		}
   1531  1.1  mrg 	      else if (bb->count.initialized_p ())
   1532  1.1  mrg 		record->dyn_mismatched_prob_out
   1533  1.1  mrg 		    += max.to_sreal_scale
   1534  1.1  mrg 			(ENTRY_BLOCK_PTR_FOR_FN (cfun)->count).to_double ();
   1535  1.1  mrg 	    }
   1536  1.1  mrg 	}
   1537  1.1  mrg       if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)
   1538  1.1  mrg 	  || bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
   1539  1.1  mrg 	continue;
   1540  1.1  mrg    }
   1541  1.1  mrg }
   1542  1.1  mrg 
   1543  1.1  mrg /* Work-horse for passes.cc:acount_profile.
   1544  1.1  mrg    Do book-keeping of the CFG for the profile accounting.
   1545  1.1  mrg    Store the counting in RECORD.  */
   1546  1.1  mrg 
   1547  1.1  mrg void
   1548  1.1  mrg profile_record_account_profile (profile_record *record)
   1549  1.1  mrg {
   1550  1.1  mrg   basic_block bb;
   1551  1.1  mrg 
   1552  1.1  mrg   FOR_ALL_BB_FN (bb, cfun)
   1553  1.1  mrg    {
   1554  1.1  mrg       gcc_assert (cfg_hooks->account_profile_record);
   1555  1.1  mrg       cfg_hooks->account_profile_record (bb, record);
   1556  1.1  mrg    }
   1557  1.1  mrg }
   1558  1.1  mrg 
   1559  1.1  mrg #if __GNUC__ >= 10
   1560  1.1  mrg #  pragma GCC diagnostic pop
   1561  1.1  mrg #endif
   1562