Home | History | Annotate | Line # | Download | only in gcc
      1  1.1  mrg /* Control flow graph analysis code for GNU compiler.
      2  1.1  mrg    Copyright (C) 1987-2022 Free Software Foundation, Inc.
      3  1.1  mrg 
      4  1.1  mrg This file is part of GCC.
      5  1.1  mrg 
      6  1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      7  1.1  mrg the terms of the GNU General Public License as published by the Free
      8  1.1  mrg Software Foundation; either version 3, or (at your option) any later
      9  1.1  mrg version.
     10  1.1  mrg 
     11  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     12  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  1.1  mrg for more details.
     15  1.1  mrg 
     16  1.1  mrg You should have received a copy of the GNU General Public License
     17  1.1  mrg along with GCC; see the file COPYING3.  If not see
     18  1.1  mrg <http://www.gnu.org/licenses/>.  */
     19  1.1  mrg 
     20  1.1  mrg /* This file contains various simple utilities to analyze the CFG.  */
     21  1.1  mrg 
     22  1.1  mrg #include "config.h"
     23  1.1  mrg #include "system.h"
     24  1.1  mrg #include "coretypes.h"
     25  1.1  mrg #include "backend.h"
     26  1.1  mrg #include "cfghooks.h"
     27  1.1  mrg #include "timevar.h"
     28  1.1  mrg #include "cfganal.h"
     29  1.1  mrg #include "cfgloop.h"
     30  1.1  mrg #include "diagnostic.h"
     31  1.1  mrg 
     32  1.1  mrg namespace {
     33  1.1  mrg /* Store the data structures necessary for depth-first search.  */
     34  1.1  mrg class depth_first_search
     35  1.1  mrg   {
     36  1.1  mrg public:
     37  1.1  mrg     depth_first_search ();
     38  1.1  mrg 
     39  1.1  mrg     basic_block execute (basic_block);
     40  1.1  mrg     void add_bb (basic_block);
     41  1.1  mrg 
     42  1.1  mrg private:
     43  1.1  mrg   /* stack for backtracking during the algorithm */
     44  1.1  mrg   auto_vec<basic_block, 20> m_stack;
     45  1.1  mrg 
     46  1.1  mrg   /* record of basic blocks already seen by depth-first search */
     47  1.1  mrg   auto_sbitmap m_visited_blocks;
     48  1.1  mrg };
     49  1.1  mrg }
     50  1.1  mrg 
     51  1.1  mrg /* Mark the back edges in DFS traversal.
     53  1.1  mrg    Return nonzero if a loop (natural or otherwise) is present.
     54  1.1  mrg    Inspired by Depth_First_Search_PP described in:
     55  1.1  mrg 
     56  1.1  mrg      Advanced Compiler Design and Implementation
     57  1.1  mrg      Steven Muchnick
     58  1.1  mrg      Morgan Kaufmann, 1997
     59  1.1  mrg 
     60  1.1  mrg    and heavily borrowed from pre_and_rev_post_order_compute.  */
     61  1.1  mrg 
     62  1.1  mrg bool
     63  1.1  mrg mark_dfs_back_edges (struct function *fun)
     64  1.1  mrg {
     65  1.1  mrg   int *pre;
     66  1.1  mrg   int *post;
     67  1.1  mrg   int prenum = 1;
     68  1.1  mrg   int postnum = 1;
     69  1.1  mrg   bool found = false;
     70  1.1  mrg 
     71  1.1  mrg   /* Allocate the preorder and postorder number arrays.  */
     72  1.1  mrg   pre = XCNEWVEC (int, last_basic_block_for_fn (fun));
     73  1.1  mrg   post = XCNEWVEC (int, last_basic_block_for_fn (fun));
     74  1.1  mrg 
     75  1.1  mrg   /* Allocate stack for back-tracking up CFG.  */
     76  1.1  mrg   auto_vec<edge_iterator, 20> stack (n_basic_blocks_for_fn (fun) + 1);
     77  1.1  mrg 
     78  1.1  mrg   /* Allocate bitmap to track nodes that have been visited.  */
     79  1.1  mrg   auto_sbitmap visited (last_basic_block_for_fn (fun));
     80  1.1  mrg 
     81  1.1  mrg   /* None of the nodes in the CFG have been visited yet.  */
     82  1.1  mrg   bitmap_clear (visited);
     83  1.1  mrg 
     84  1.1  mrg   /* Push the first edge on to the stack.  */
     85  1.1  mrg   stack.quick_push (ei_start (ENTRY_BLOCK_PTR_FOR_FN (fun)->succs));
     86  1.1  mrg 
     87  1.1  mrg   while (!stack.is_empty ())
     88  1.1  mrg     {
     89  1.1  mrg       basic_block src;
     90  1.1  mrg       basic_block dest;
     91  1.1  mrg 
     92  1.1  mrg       /* Look at the edge on the top of the stack.  */
     93  1.1  mrg       edge_iterator ei = stack.last ();
     94  1.1  mrg       src = ei_edge (ei)->src;
     95  1.1  mrg       dest = ei_edge (ei)->dest;
     96  1.1  mrg       ei_edge (ei)->flags &= ~EDGE_DFS_BACK;
     97  1.1  mrg 
     98  1.1  mrg       /* Check if the edge destination has been visited yet.  */
     99  1.1  mrg       if (dest != EXIT_BLOCK_PTR_FOR_FN (fun) && ! bitmap_bit_p (visited,
    100  1.1  mrg 								 dest->index))
    101  1.1  mrg 	{
    102  1.1  mrg 	  /* Mark that we have visited the destination.  */
    103  1.1  mrg 	  bitmap_set_bit (visited, dest->index);
    104  1.1  mrg 
    105  1.1  mrg 	  pre[dest->index] = prenum++;
    106  1.1  mrg 	  if (EDGE_COUNT (dest->succs) > 0)
    107  1.1  mrg 	    {
    108  1.1  mrg 	      /* Since the DEST node has been visited for the first
    109  1.1  mrg 		 time, check its successors.  */
    110  1.1  mrg 	      stack.quick_push (ei_start (dest->succs));
    111  1.1  mrg 	    }
    112  1.1  mrg 	  else
    113  1.1  mrg 	    post[dest->index] = postnum++;
    114  1.1  mrg 	}
    115  1.1  mrg       else
    116  1.1  mrg 	{
    117  1.1  mrg 	  if (dest != EXIT_BLOCK_PTR_FOR_FN (fun)
    118  1.1  mrg 	      && src != ENTRY_BLOCK_PTR_FOR_FN (fun)
    119  1.1  mrg 	      && pre[src->index] >= pre[dest->index]
    120  1.1  mrg 	      && post[dest->index] == 0)
    121  1.1  mrg 	    ei_edge (ei)->flags |= EDGE_DFS_BACK, found = true;
    122  1.1  mrg 
    123  1.1  mrg 	  if (ei_one_before_end_p (ei)
    124  1.1  mrg 	      && src != ENTRY_BLOCK_PTR_FOR_FN (fun))
    125  1.1  mrg 	    post[src->index] = postnum++;
    126  1.1  mrg 
    127  1.1  mrg 	  if (!ei_one_before_end_p (ei))
    128  1.1  mrg 	    ei_next (&stack.last ());
    129  1.1  mrg 	  else
    130  1.1  mrg 	    stack.pop ();
    131  1.1  mrg 	}
    132  1.1  mrg     }
    133  1.1  mrg 
    134  1.1  mrg   free (pre);
    135  1.1  mrg   free (post);
    136  1.1  mrg 
    137  1.1  mrg   return found;
    138  1.1  mrg }
    139  1.1  mrg 
    140  1.1  mrg bool
    141  1.1  mrg mark_dfs_back_edges (void)
    142  1.1  mrg {
    143  1.1  mrg   return mark_dfs_back_edges (cfun);
    144  1.1  mrg }
    145  1.1  mrg 
    146  1.1  mrg /* Return TRUE if EDGE_DFS_BACK is up to date for CFUN.  */
    147  1.1  mrg 
    148  1.1  mrg void
    149  1.1  mrg verify_marked_backedges (struct function *fun)
    150  1.1  mrg {
    151  1.1  mrg   auto_edge_flag saved_dfs_back (fun);
    152  1.1  mrg   basic_block bb;
    153  1.1  mrg   edge e;
    154  1.1  mrg   edge_iterator ei;
    155  1.1  mrg 
    156  1.1  mrg   // Save all the back edges...
    157  1.1  mrg   FOR_EACH_BB_FN (bb, fun)
    158  1.1  mrg     FOR_EACH_EDGE (e, ei, bb->succs)
    159  1.1  mrg       {
    160  1.1  mrg 	if (e->flags & EDGE_DFS_BACK)
    161  1.1  mrg 	  {
    162  1.1  mrg 	    e->flags |= saved_dfs_back;
    163  1.1  mrg 	    e->flags &= ~EDGE_DFS_BACK;
    164  1.1  mrg 	  }
    165  1.1  mrg       }
    166  1.1  mrg 
    167  1.1  mrg   // ...and verify that recalculating them agrees with the saved ones.
    168  1.1  mrg   mark_dfs_back_edges ();
    169  1.1  mrg   FOR_EACH_BB_FN (bb, fun)
    170  1.1  mrg     FOR_EACH_EDGE (e, ei, bb->succs)
    171  1.1  mrg       {
    172  1.1  mrg 	if (((e->flags & EDGE_DFS_BACK) != 0)
    173  1.1  mrg 	    != ((e->flags & saved_dfs_back) != 0))
    174  1.1  mrg 	  internal_error ("%<verify_marked_backedges%> failed");
    175  1.1  mrg 
    176  1.1  mrg 	e->flags &= ~saved_dfs_back;
    177  1.1  mrg       }
    178  1.1  mrg }
    179  1.1  mrg 
    180  1.1  mrg /* Find unreachable blocks.  An unreachable block will have 0 in
    181  1.1  mrg    the reachable bit in block->flags.  A nonzero value indicates the
    182  1.1  mrg    block is reachable.  */
    183  1.1  mrg 
    184  1.1  mrg void
    185  1.1  mrg find_unreachable_blocks (void)
    186  1.1  mrg {
    187  1.1  mrg   edge e;
    188  1.1  mrg   edge_iterator ei;
    189  1.1  mrg   basic_block *tos, *worklist, bb;
    190  1.1  mrg 
    191  1.1  mrg   tos = worklist = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
    192  1.1  mrg 
    193  1.1  mrg   /* Clear all the reachability flags.  */
    194  1.1  mrg 
    195  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
    196  1.1  mrg     bb->flags &= ~BB_REACHABLE;
    197  1.1  mrg 
    198  1.1  mrg   /* Add our starting points to the worklist.  Almost always there will
    199  1.1  mrg      be only one.  It isn't inconceivable that we might one day directly
    200  1.1  mrg      support Fortran alternate entry points.  */
    201  1.1  mrg 
    202  1.1  mrg   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs)
    203  1.1  mrg     {
    204  1.1  mrg       *tos++ = e->dest;
    205  1.1  mrg 
    206  1.1  mrg       /* Mark the block reachable.  */
    207  1.1  mrg       e->dest->flags |= BB_REACHABLE;
    208  1.1  mrg     }
    209  1.1  mrg 
    210  1.1  mrg   /* Iterate: find everything reachable from what we've already seen.  */
    211  1.1  mrg 
    212  1.1  mrg   while (tos != worklist)
    213  1.1  mrg     {
    214  1.1  mrg       basic_block b = *--tos;
    215  1.1  mrg 
    216  1.1  mrg       FOR_EACH_EDGE (e, ei, b->succs)
    217  1.1  mrg 	{
    218  1.1  mrg 	  basic_block dest = e->dest;
    219  1.1  mrg 
    220  1.1  mrg 	  if (!(dest->flags & BB_REACHABLE))
    221  1.1  mrg 	    {
    222  1.1  mrg 	      *tos++ = dest;
    223  1.1  mrg 	      dest->flags |= BB_REACHABLE;
    224  1.1  mrg 	    }
    225  1.1  mrg 	}
    226  1.1  mrg     }
    227  1.1  mrg 
    228  1.1  mrg   free (worklist);
    229  1.1  mrg }
    230  1.1  mrg 
    231  1.1  mrg /* Verify that there are no unreachable blocks in the current function.  */
    232  1.1  mrg 
    233  1.1  mrg void
    234  1.1  mrg verify_no_unreachable_blocks (void)
    235  1.1  mrg {
    236  1.1  mrg   find_unreachable_blocks ();
    237  1.1  mrg 
    238  1.1  mrg   basic_block bb;
    239  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
    240  1.1  mrg     gcc_assert ((bb->flags & BB_REACHABLE) != 0);
    241  1.1  mrg }
    242  1.1  mrg 
    243  1.1  mrg 
    244  1.1  mrg /* Functions to access an edge list with a vector representation.
    246  1.1  mrg    Enough data is kept such that given an index number, the
    247  1.1  mrg    pred and succ that edge represents can be determined, or
    248  1.1  mrg    given a pred and a succ, its index number can be returned.
    249  1.1  mrg    This allows algorithms which consume a lot of memory to
    250  1.1  mrg    represent the normally full matrix of edge (pred,succ) with a
    251  1.1  mrg    single indexed vector,  edge (EDGE_INDEX (pred, succ)), with no
    252  1.1  mrg    wasted space in the client code due to sparse flow graphs.  */
    253  1.1  mrg 
    254  1.1  mrg /* This functions initializes the edge list. Basically the entire
    255  1.1  mrg    flowgraph is processed, and all edges are assigned a number,
    256  1.1  mrg    and the data structure is filled in.  */
    257  1.1  mrg 
    258  1.1  mrg struct edge_list *
    259  1.1  mrg create_edge_list (void)
    260  1.1  mrg {
    261  1.1  mrg   struct edge_list *elist;
    262  1.1  mrg   edge e;
    263  1.1  mrg   int num_edges;
    264  1.1  mrg   basic_block bb;
    265  1.1  mrg   edge_iterator ei;
    266  1.1  mrg 
    267  1.1  mrg   /* Determine the number of edges in the flow graph by counting successor
    268  1.1  mrg      edges on each basic block.  */
    269  1.1  mrg   num_edges = 0;
    270  1.1  mrg   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
    271  1.1  mrg 		  EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
    272  1.1  mrg     {
    273  1.1  mrg       num_edges += EDGE_COUNT (bb->succs);
    274  1.1  mrg     }
    275  1.1  mrg 
    276  1.1  mrg   elist = XNEW (struct edge_list);
    277  1.1  mrg   elist->num_edges = num_edges;
    278  1.1  mrg   elist->index_to_edge = XNEWVEC (edge, num_edges);
    279  1.1  mrg 
    280  1.1  mrg   num_edges = 0;
    281  1.1  mrg 
    282  1.1  mrg   /* Follow successors of blocks, and register these edges.  */
    283  1.1  mrg   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
    284  1.1  mrg 		  EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
    285  1.1  mrg     FOR_EACH_EDGE (e, ei, bb->succs)
    286  1.1  mrg       elist->index_to_edge[num_edges++] = e;
    287  1.1  mrg 
    288  1.1  mrg   return elist;
    289  1.1  mrg }
    290  1.1  mrg 
    291  1.1  mrg /* This function free's memory associated with an edge list.  */
    292  1.1  mrg 
    293  1.1  mrg void
    294  1.1  mrg free_edge_list (struct edge_list *elist)
    295  1.1  mrg {
    296  1.1  mrg   if (elist)
    297  1.1  mrg     {
    298  1.1  mrg       free (elist->index_to_edge);
    299  1.1  mrg       free (elist);
    300  1.1  mrg     }
    301  1.1  mrg }
    302  1.1  mrg 
    303  1.1  mrg /* This function provides debug output showing an edge list.  */
    304  1.1  mrg 
    305  1.1  mrg DEBUG_FUNCTION void
    306  1.1  mrg print_edge_list (FILE *f, struct edge_list *elist)
    307  1.1  mrg {
    308  1.1  mrg   int x;
    309  1.1  mrg 
    310  1.1  mrg   fprintf (f, "Compressed edge list, %d BBs + entry & exit, and %d edges\n",
    311  1.1  mrg 	   n_basic_blocks_for_fn (cfun), elist->num_edges);
    312  1.1  mrg 
    313  1.1  mrg   for (x = 0; x < elist->num_edges; x++)
    314  1.1  mrg     {
    315  1.1  mrg       fprintf (f, " %-4d - edge(", x);
    316  1.1  mrg       if (INDEX_EDGE_PRED_BB (elist, x) == ENTRY_BLOCK_PTR_FOR_FN (cfun))
    317  1.1  mrg 	fprintf (f, "entry,");
    318  1.1  mrg       else
    319  1.1  mrg 	fprintf (f, "%d,", INDEX_EDGE_PRED_BB (elist, x)->index);
    320  1.1  mrg 
    321  1.1  mrg       if (INDEX_EDGE_SUCC_BB (elist, x) == EXIT_BLOCK_PTR_FOR_FN (cfun))
    322  1.1  mrg 	fprintf (f, "exit)\n");
    323  1.1  mrg       else
    324  1.1  mrg 	fprintf (f, "%d)\n", INDEX_EDGE_SUCC_BB (elist, x)->index);
    325  1.1  mrg     }
    326  1.1  mrg }
    327  1.1  mrg 
    328  1.1  mrg /* This function provides an internal consistency check of an edge list,
    329  1.1  mrg    verifying that all edges are present, and that there are no
    330  1.1  mrg    extra edges.  */
    331  1.1  mrg 
    332  1.1  mrg DEBUG_FUNCTION void
    333  1.1  mrg verify_edge_list (FILE *f, struct edge_list *elist)
    334  1.1  mrg {
    335  1.1  mrg   int pred, succ, index;
    336  1.1  mrg   edge e;
    337  1.1  mrg   basic_block bb, p, s;
    338  1.1  mrg   edge_iterator ei;
    339  1.1  mrg 
    340  1.1  mrg   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
    341  1.1  mrg 		  EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
    342  1.1  mrg     {
    343  1.1  mrg       FOR_EACH_EDGE (e, ei, bb->succs)
    344  1.1  mrg 	{
    345  1.1  mrg 	  pred = e->src->index;
    346  1.1  mrg 	  succ = e->dest->index;
    347  1.1  mrg 	  index = EDGE_INDEX (elist, e->src, e->dest);
    348  1.1  mrg 	  if (index == EDGE_INDEX_NO_EDGE)
    349  1.1  mrg 	    {
    350  1.1  mrg 	      fprintf (f, "*p* No index for edge from %d to %d\n", pred, succ);
    351  1.1  mrg 	      continue;
    352  1.1  mrg 	    }
    353  1.1  mrg 
    354  1.1  mrg 	  if (INDEX_EDGE_PRED_BB (elist, index)->index != pred)
    355  1.1  mrg 	    fprintf (f, "*p* Pred for index %d should be %d not %d\n",
    356  1.1  mrg 		     index, pred, INDEX_EDGE_PRED_BB (elist, index)->index);
    357  1.1  mrg 	  if (INDEX_EDGE_SUCC_BB (elist, index)->index != succ)
    358  1.1  mrg 	    fprintf (f, "*p* Succ for index %d should be %d not %d\n",
    359  1.1  mrg 		     index, succ, INDEX_EDGE_SUCC_BB (elist, index)->index);
    360  1.1  mrg 	}
    361  1.1  mrg     }
    362  1.1  mrg 
    363  1.1  mrg   /* We've verified that all the edges are in the list, now lets make sure
    364  1.1  mrg      there are no spurious edges in the list.  This is an expensive check!  */
    365  1.1  mrg 
    366  1.1  mrg   FOR_BB_BETWEEN (p, ENTRY_BLOCK_PTR_FOR_FN (cfun),
    367  1.1  mrg 		  EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
    368  1.1  mrg     FOR_BB_BETWEEN (s, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb, NULL, next_bb)
    369  1.1  mrg       {
    370  1.1  mrg 	int found_edge = 0;
    371  1.1  mrg 
    372  1.1  mrg 	FOR_EACH_EDGE (e, ei, p->succs)
    373  1.1  mrg 	  if (e->dest == s)
    374  1.1  mrg 	    {
    375  1.1  mrg 	      found_edge = 1;
    376  1.1  mrg 	      break;
    377  1.1  mrg 	    }
    378  1.1  mrg 
    379  1.1  mrg 	FOR_EACH_EDGE (e, ei, s->preds)
    380  1.1  mrg 	  if (e->src == p)
    381  1.1  mrg 	    {
    382  1.1  mrg 	      found_edge = 1;
    383  1.1  mrg 	      break;
    384  1.1  mrg 	    }
    385  1.1  mrg 
    386  1.1  mrg 	if (EDGE_INDEX (elist, p, s)
    387  1.1  mrg 	    == EDGE_INDEX_NO_EDGE && found_edge != 0)
    388  1.1  mrg 	  fprintf (f, "*** Edge (%d, %d) appears to not have an index\n",
    389  1.1  mrg 		   p->index, s->index);
    390  1.1  mrg 	if (EDGE_INDEX (elist, p, s)
    391  1.1  mrg 	    != EDGE_INDEX_NO_EDGE && found_edge == 0)
    392  1.1  mrg 	  fprintf (f, "*** Edge (%d, %d) has index %d, but there is no edge\n",
    393  1.1  mrg 		   p->index, s->index, EDGE_INDEX (elist, p, s));
    394  1.1  mrg       }
    395  1.1  mrg }
    396  1.1  mrg 
    397  1.1  mrg 
    398  1.1  mrg /* Functions to compute control dependences.  */
    399  1.1  mrg 
    400  1.1  mrg /* Indicate block BB is control dependent on an edge with index EDGE_INDEX.  */
    401  1.1  mrg void
    402  1.1  mrg control_dependences::set_control_dependence_map_bit (basic_block bb,
    403  1.1  mrg 						     int edge_index)
    404  1.1  mrg {
    405  1.1  mrg   if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
    406  1.1  mrg     return;
    407  1.1  mrg   gcc_assert (bb != EXIT_BLOCK_PTR_FOR_FN (cfun));
    408  1.1  mrg   bitmap_set_bit (&control_dependence_map[bb->index], edge_index);
    409  1.1  mrg }
    410  1.1  mrg 
    411  1.1  mrg /* Clear all control dependences for block BB.  */
    412  1.1  mrg void
    413  1.1  mrg control_dependences::clear_control_dependence_bitmap (basic_block bb)
    414  1.1  mrg {
    415  1.1  mrg   bitmap_clear (&control_dependence_map[bb->index]);
    416  1.1  mrg }
    417  1.1  mrg 
    418  1.1  mrg /* Determine all blocks' control dependences on the given edge with edge_list
    419  1.1  mrg    EL index EDGE_INDEX, ala Morgan, Section 3.6.  */
    420  1.1  mrg 
    421  1.1  mrg void
    422  1.1  mrg control_dependences::find_control_dependence (int edge_index)
    423  1.1  mrg {
    424  1.1  mrg   basic_block current_block;
    425  1.1  mrg   basic_block ending_block;
    426  1.1  mrg 
    427  1.1  mrg   gcc_assert (get_edge_src (edge_index) != EXIT_BLOCK_PTR_FOR_FN (cfun));
    428  1.1  mrg 
    429  1.1  mrg   ending_block = get_immediate_dominator (CDI_POST_DOMINATORS,
    430  1.1  mrg 					  get_edge_src (edge_index));
    431  1.1  mrg 
    432  1.1  mrg   for (current_block = get_edge_dest (edge_index);
    433  1.1  mrg        current_block != ending_block
    434  1.1  mrg        && current_block != EXIT_BLOCK_PTR_FOR_FN (cfun);
    435  1.1  mrg        current_block = get_immediate_dominator (CDI_POST_DOMINATORS,
    436  1.1  mrg 						current_block))
    437  1.1  mrg     set_control_dependence_map_bit (current_block, edge_index);
    438  1.1  mrg }
    439  1.1  mrg 
    440  1.1  mrg /* Record all blocks' control dependences on all edges in the edge
    441  1.1  mrg    list EL, ala Morgan, Section 3.6.  */
    442  1.1  mrg 
    443  1.1  mrg control_dependences::control_dependences ()
    444  1.1  mrg {
    445  1.1  mrg   timevar_push (TV_CONTROL_DEPENDENCES);
    446  1.1  mrg 
    447  1.1  mrg   /* Initialize the edge list.  */
    448  1.1  mrg   int num_edges = 0;
    449  1.1  mrg   basic_block bb;
    450  1.1  mrg   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
    451  1.1  mrg 		  EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
    452  1.1  mrg     num_edges += EDGE_COUNT (bb->succs);
    453  1.1  mrg   m_el.create (num_edges);
    454  1.1  mrg   edge e;
    455  1.1  mrg   edge_iterator ei;
    456  1.1  mrg   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
    457  1.1  mrg 		  EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
    458  1.1  mrg     FOR_EACH_EDGE (e, ei, bb->succs)
    459  1.1  mrg       {
    460  1.1  mrg 	/* For abnormal edges, we don't make current_block control
    461  1.1  mrg 	   dependent because instructions that throw are always necessary
    462  1.1  mrg 	   anyway.  */
    463  1.1  mrg 	if (e->flags & EDGE_ABNORMAL)
    464  1.1  mrg 	  {
    465  1.1  mrg 	    num_edges--;
    466  1.1  mrg 	    continue;
    467  1.1  mrg 	  }
    468  1.1  mrg 	m_el.quick_push (std::make_pair (e->src->index, e->dest->index));
    469  1.1  mrg       }
    470  1.1  mrg 
    471  1.1  mrg   bitmap_obstack_initialize (&m_bitmaps);
    472  1.1  mrg   control_dependence_map.create (last_basic_block_for_fn (cfun));
    473  1.1  mrg   control_dependence_map.quick_grow (last_basic_block_for_fn (cfun));
    474  1.1  mrg   for (int i = 0; i < last_basic_block_for_fn (cfun); ++i)
    475  1.1  mrg     bitmap_initialize (&control_dependence_map[i], &m_bitmaps);
    476  1.1  mrg   for (int i = 0; i < num_edges; ++i)
    477  1.1  mrg     find_control_dependence (i);
    478  1.1  mrg 
    479  1.1  mrg   timevar_pop (TV_CONTROL_DEPENDENCES);
    480  1.1  mrg }
    481  1.1  mrg 
    482  1.1  mrg /* Free control dependences and the associated edge list.  */
    483  1.1  mrg 
    484  1.1  mrg control_dependences::~control_dependences ()
    485  1.1  mrg {
    486  1.1  mrg   control_dependence_map.release ();
    487  1.1  mrg   m_el.release ();
    488  1.1  mrg   bitmap_obstack_release (&m_bitmaps);
    489  1.1  mrg }
    490  1.1  mrg 
    491  1.1  mrg /* Returns the bitmap of edges the basic-block I is dependent on.  */
    492  1.1  mrg 
    493  1.1  mrg bitmap
    494  1.1  mrg control_dependences::get_edges_dependent_on (int i)
    495  1.1  mrg {
    496  1.1  mrg   return &control_dependence_map[i];
    497  1.1  mrg }
    498  1.1  mrg 
    499  1.1  mrg /* Returns the edge source with index I from the edge list.  */
    500  1.1  mrg 
    501  1.1  mrg basic_block
    502  1.1  mrg control_dependences::get_edge_src (int i)
    503  1.1  mrg {
    504  1.1  mrg   return BASIC_BLOCK_FOR_FN (cfun, m_el[i].first);
    505  1.1  mrg }
    506  1.1  mrg 
    507  1.1  mrg /* Returns the edge destination with index I from the edge list.  */
    508  1.1  mrg 
    509  1.1  mrg basic_block
    510  1.1  mrg control_dependences::get_edge_dest (int i)
    511  1.1  mrg {
    512  1.1  mrg   return BASIC_BLOCK_FOR_FN (cfun, m_el[i].second);
    513  1.1  mrg }
    514  1.1  mrg 
    515  1.1  mrg 
    516  1.1  mrg /* Given PRED and SUCC blocks, return the edge which connects the blocks.
    517  1.1  mrg    If no such edge exists, return NULL.  */
    518  1.1  mrg 
    519  1.1  mrg edge
    520  1.1  mrg find_edge (basic_block pred, basic_block succ)
    521  1.1  mrg {
    522  1.1  mrg   edge e;
    523  1.1  mrg   edge_iterator ei;
    524  1.1  mrg 
    525  1.1  mrg   if (EDGE_COUNT (pred->succs) <= EDGE_COUNT (succ->preds))
    526  1.1  mrg     {
    527  1.1  mrg       FOR_EACH_EDGE (e, ei, pred->succs)
    528  1.1  mrg 	if (e->dest == succ)
    529  1.1  mrg 	  return e;
    530  1.1  mrg     }
    531  1.1  mrg   else
    532  1.1  mrg     {
    533  1.1  mrg       FOR_EACH_EDGE (e, ei, succ->preds)
    534  1.1  mrg 	if (e->src == pred)
    535  1.1  mrg 	  return e;
    536  1.1  mrg     }
    537  1.1  mrg 
    538  1.1  mrg   return NULL;
    539  1.1  mrg }
    540  1.1  mrg 
    541  1.1  mrg /* This routine will determine what, if any, edge there is between
    542  1.1  mrg    a specified predecessor and successor.  */
    543  1.1  mrg 
    544  1.1  mrg int
    545  1.1  mrg find_edge_index (struct edge_list *edge_list, basic_block pred, basic_block succ)
    546  1.1  mrg {
    547  1.1  mrg   int x;
    548  1.1  mrg 
    549  1.1  mrg   for (x = 0; x < NUM_EDGES (edge_list); x++)
    550  1.1  mrg     if (INDEX_EDGE_PRED_BB (edge_list, x) == pred
    551  1.1  mrg 	&& INDEX_EDGE_SUCC_BB (edge_list, x) == succ)
    552  1.1  mrg       return x;
    553  1.1  mrg 
    554  1.1  mrg   return (EDGE_INDEX_NO_EDGE);
    555  1.1  mrg }
    556  1.1  mrg 
    557  1.1  mrg /* This routine will remove any fake predecessor edges for a basic block.
    559  1.1  mrg    When the edge is removed, it is also removed from whatever successor
    560  1.1  mrg    list it is in.  */
    561  1.1  mrg 
    562  1.1  mrg static void
    563  1.1  mrg remove_fake_predecessors (basic_block bb)
    564  1.1  mrg {
    565  1.1  mrg   edge e;
    566  1.1  mrg   edge_iterator ei;
    567  1.1  mrg 
    568  1.1  mrg   for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
    569  1.1  mrg     {
    570  1.1  mrg       if ((e->flags & EDGE_FAKE) == EDGE_FAKE)
    571  1.1  mrg 	remove_edge (e);
    572  1.1  mrg       else
    573  1.1  mrg 	ei_next (&ei);
    574  1.1  mrg     }
    575  1.1  mrg }
    576  1.1  mrg 
    577  1.1  mrg /* This routine will remove all fake edges from the flow graph.  If
    578  1.1  mrg    we remove all fake successors, it will automatically remove all
    579  1.1  mrg    fake predecessors.  */
    580  1.1  mrg 
    581  1.1  mrg void
    582  1.1  mrg remove_fake_edges (void)
    583  1.1  mrg {
    584  1.1  mrg   basic_block bb;
    585  1.1  mrg 
    586  1.1  mrg   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb, NULL, next_bb)
    587  1.1  mrg     remove_fake_predecessors (bb);
    588  1.1  mrg }
    589  1.1  mrg 
    590  1.1  mrg /* This routine will remove all fake edges to the EXIT_BLOCK.  */
    591  1.1  mrg 
    592  1.1  mrg void
    593  1.1  mrg remove_fake_exit_edges (void)
    594  1.1  mrg {
    595  1.1  mrg   remove_fake_predecessors (EXIT_BLOCK_PTR_FOR_FN (cfun));
    596  1.1  mrg }
    597  1.1  mrg 
    598  1.1  mrg 
    599  1.1  mrg /* This function will add a fake edge between any block which has no
    600  1.1  mrg    successors, and the exit block. Some data flow equations require these
    601  1.1  mrg    edges to exist.  */
    602  1.1  mrg 
    603  1.1  mrg void
    604  1.1  mrg add_noreturn_fake_exit_edges (void)
    605  1.1  mrg {
    606  1.1  mrg   basic_block bb;
    607  1.1  mrg 
    608  1.1  mrg   FOR_EACH_BB_FN (bb, cfun)
    609  1.1  mrg     if (EDGE_COUNT (bb->succs) == 0)
    610  1.1  mrg       make_single_succ_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_FAKE);
    611  1.1  mrg }
    612  1.1  mrg 
    613  1.1  mrg /* This function adds a fake edge between any noreturn block and
    614  1.1  mrg    infinite loops to the exit block.  Some optimizations require a path
    615  1.1  mrg    from each node to the exit node.
    616  1.1  mrg 
    617  1.1  mrg    See also Morgan, Figure 3.10, pp. 82-83.
    618  1.1  mrg 
    619  1.1  mrg    The current implementation is ugly, not attempting to minimize the
    620  1.1  mrg    number of inserted fake edges.  To reduce the number of fake edges
    621  1.1  mrg    to insert, add fake edges from _innermost_ loops containing only
    622  1.1  mrg    nodes not reachable from the exit block.  */
    623  1.1  mrg 
    624  1.1  mrg void
    625  1.1  mrg connect_infinite_loops_to_exit (void)
    626  1.1  mrg {
    627  1.1  mrg   /* First add fake exits to noreturn blocks, this is required to
    628  1.1  mrg      discover only truly infinite loops below.  */
    629  1.1  mrg   add_noreturn_fake_exit_edges ();
    630  1.1  mrg 
    631  1.1  mrg   /* Perform depth-first search in the reverse graph to find nodes
    632  1.1  mrg      reachable from the exit block.  */
    633  1.1  mrg   depth_first_search dfs;
    634  1.1  mrg   dfs.add_bb (EXIT_BLOCK_PTR_FOR_FN (cfun));
    635  1.1  mrg 
    636  1.1  mrg   /* Repeatedly add fake edges, updating the unreachable nodes.  */
    637  1.1  mrg   basic_block unvisited_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
    638  1.1  mrg   while (1)
    639  1.1  mrg     {
    640  1.1  mrg       unvisited_block = dfs.execute (unvisited_block);
    641  1.1  mrg       if (!unvisited_block)
    642  1.1  mrg 	break;
    643  1.1  mrg 
    644  1.1  mrg       basic_block deadend_block = dfs_find_deadend (unvisited_block);
    645  1.1  mrg       edge e = make_edge (deadend_block, EXIT_BLOCK_PTR_FOR_FN (cfun),
    646  1.1  mrg 			  EDGE_FAKE);
    647  1.1  mrg       e->probability = profile_probability::never ();
    648  1.1  mrg       dfs.add_bb (deadend_block);
    649  1.1  mrg     }
    650  1.1  mrg }
    651  1.1  mrg 
    652  1.1  mrg /* Compute reverse top sort order.  This is computing a post order
    654  1.1  mrg    numbering of the graph.  If INCLUDE_ENTRY_EXIT is true, then
    655  1.1  mrg    ENTRY_BLOCK and EXIT_BLOCK are included.  If DELETE_UNREACHABLE is
    656  1.1  mrg    true, unreachable blocks are deleted.  */
    657  1.1  mrg 
    658  1.1  mrg int
    659  1.1  mrg post_order_compute (int *post_order, bool include_entry_exit,
    660  1.1  mrg 		    bool delete_unreachable)
    661  1.1  mrg {
    662  1.1  mrg   int post_order_num = 0;
    663  1.1  mrg   int count;
    664  1.1  mrg 
    665  1.1  mrg   if (include_entry_exit)
    666  1.1  mrg     post_order[post_order_num++] = EXIT_BLOCK;
    667  1.1  mrg 
    668  1.1  mrg   /* Allocate stack for back-tracking up CFG.  */
    669  1.1  mrg   auto_vec<edge_iterator, 20> stack (n_basic_blocks_for_fn (cfun) + 1);
    670  1.1  mrg 
    671  1.1  mrg   /* Allocate bitmap to track nodes that have been visited.  */
    672  1.1  mrg   auto_sbitmap visited (last_basic_block_for_fn (cfun));
    673  1.1  mrg 
    674  1.1  mrg   /* None of the nodes in the CFG have been visited yet.  */
    675  1.1  mrg   bitmap_clear (visited);
    676  1.1  mrg 
    677  1.1  mrg   /* Push the first edge on to the stack.  */
    678  1.1  mrg   stack.quick_push (ei_start (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs));
    679  1.1  mrg 
    680  1.1  mrg   while (!stack.is_empty ())
    681  1.1  mrg     {
    682  1.1  mrg       basic_block src;
    683  1.1  mrg       basic_block dest;
    684  1.1  mrg 
    685  1.1  mrg       /* Look at the edge on the top of the stack.  */
    686  1.1  mrg       edge_iterator ei = stack.last ();
    687  1.1  mrg       src = ei_edge (ei)->src;
    688  1.1  mrg       dest = ei_edge (ei)->dest;
    689  1.1  mrg 
    690  1.1  mrg       /* Check if the edge destination has been visited yet.  */
    691  1.1  mrg       if (dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
    692  1.1  mrg 	  && ! bitmap_bit_p (visited, dest->index))
    693  1.1  mrg 	{
    694  1.1  mrg 	  /* Mark that we have visited the destination.  */
    695  1.1  mrg 	  bitmap_set_bit (visited, dest->index);
    696  1.1  mrg 
    697  1.1  mrg 	  if (EDGE_COUNT (dest->succs) > 0)
    698  1.1  mrg 	    /* Since the DEST node has been visited for the first
    699  1.1  mrg 	       time, check its successors.  */
    700  1.1  mrg 	    stack.quick_push (ei_start (dest->succs));
    701  1.1  mrg 	  else
    702  1.1  mrg 	    post_order[post_order_num++] = dest->index;
    703  1.1  mrg 	}
    704  1.1  mrg       else
    705  1.1  mrg 	{
    706  1.1  mrg 	  if (ei_one_before_end_p (ei)
    707  1.1  mrg 	      && src != ENTRY_BLOCK_PTR_FOR_FN (cfun))
    708  1.1  mrg 	    post_order[post_order_num++] = src->index;
    709  1.1  mrg 
    710  1.1  mrg 	  if (!ei_one_before_end_p (ei))
    711  1.1  mrg 	    ei_next (&stack.last ());
    712  1.1  mrg 	  else
    713  1.1  mrg 	    stack.pop ();
    714  1.1  mrg 	}
    715  1.1  mrg     }
    716  1.1  mrg 
    717  1.1  mrg   if (include_entry_exit)
    718  1.1  mrg     {
    719  1.1  mrg       post_order[post_order_num++] = ENTRY_BLOCK;
    720  1.1  mrg       count = post_order_num;
    721  1.1  mrg     }
    722  1.1  mrg   else
    723  1.1  mrg     count = post_order_num + 2;
    724  1.1  mrg 
    725  1.1  mrg   /* Delete the unreachable blocks if some were found and we are
    726  1.1  mrg      supposed to do it.  */
    727  1.1  mrg   if (delete_unreachable && (count != n_basic_blocks_for_fn (cfun)))
    728  1.1  mrg     {
    729  1.1  mrg       basic_block b;
    730  1.1  mrg       basic_block next_bb;
    731  1.1  mrg       for (b = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb; b
    732  1.1  mrg 	   != EXIT_BLOCK_PTR_FOR_FN (cfun); b = next_bb)
    733  1.1  mrg 	{
    734  1.1  mrg 	  next_bb = b->next_bb;
    735  1.1  mrg 
    736  1.1  mrg 	  if (!(bitmap_bit_p (visited, b->index)))
    737  1.1  mrg 	    delete_basic_block (b);
    738  1.1  mrg 	}
    739  1.1  mrg 
    740  1.1  mrg       tidy_fallthru_edges ();
    741  1.1  mrg     }
    742  1.1  mrg 
    743  1.1  mrg   return post_order_num;
    744  1.1  mrg }
    745  1.1  mrg 
    746  1.1  mrg 
    747  1.1  mrg /* Helper routine for inverted_post_order_compute
    748  1.1  mrg    flow_dfs_compute_reverse_execute, and the reverse-CFG
    749  1.1  mrg    deapth first search in dominance.cc.
    750  1.1  mrg    BB has to belong to a region of CFG
    751  1.1  mrg    unreachable by inverted traversal from the exit.
    752  1.1  mrg    i.e. there's no control flow path from ENTRY to EXIT
    753  1.1  mrg    that contains this BB.
    754  1.1  mrg    This can happen in two cases - if there's an infinite loop
    755  1.1  mrg    or if there's a block that has no successor
    756  1.1  mrg    (call to a function with no return).
    757  1.1  mrg    Some RTL passes deal with this condition by
    758  1.1  mrg    calling connect_infinite_loops_to_exit () and/or
    759  1.1  mrg    add_noreturn_fake_exit_edges ().
    760  1.1  mrg    However, those methods involve modifying the CFG itself
    761  1.1  mrg    which may not be desirable.
    762  1.1  mrg    Hence, we deal with the infinite loop/no return cases
    763  1.1  mrg    by identifying a unique basic block that can reach all blocks
    764  1.1  mrg    in such a region by inverted traversal.
    765  1.1  mrg    This function returns a basic block that guarantees
    766  1.1  mrg    that all blocks in the region are reachable
    767  1.1  mrg    by starting an inverted traversal from the returned block.  */
    768  1.1  mrg 
    769  1.1  mrg basic_block
    770  1.1  mrg dfs_find_deadend (basic_block bb)
    771  1.1  mrg {
    772  1.1  mrg   auto_bitmap visited;
    773  1.1  mrg   basic_block next = bb;
    774  1.1  mrg 
    775  1.1  mrg   for (;;)
    776  1.1  mrg     {
    777  1.1  mrg       if (EDGE_COUNT (next->succs) == 0)
    778  1.1  mrg 	return next;
    779  1.1  mrg 
    780  1.1  mrg       if (! bitmap_set_bit (visited, next->index))
    781  1.1  mrg 	return bb;
    782  1.1  mrg 
    783  1.1  mrg       bb = next;
    784  1.1  mrg       /* If we are in an analyzed cycle make sure to try exiting it.
    785  1.1  mrg          Note this is a heuristic only and expected to work when loop
    786  1.1  mrg 	 fixup is needed as well.  */
    787  1.1  mrg       if (! bb->loop_father
    788  1.1  mrg 	  || ! loop_outer (bb->loop_father))
    789  1.1  mrg 	next = EDGE_SUCC (bb, 0)->dest;
    790  1.1  mrg       else
    791  1.1  mrg 	{
    792  1.1  mrg 	  edge_iterator ei;
    793  1.1  mrg 	  edge e;
    794  1.1  mrg 	  FOR_EACH_EDGE (e, ei, bb->succs)
    795  1.1  mrg 	    if (loop_exit_edge_p (bb->loop_father, e))
    796  1.1  mrg 	      break;
    797  1.1  mrg 	  next = e ? e->dest : EDGE_SUCC (bb, 0)->dest;
    798  1.1  mrg 	}
    799  1.1  mrg     }
    800  1.1  mrg }
    801  1.1  mrg 
    802  1.1  mrg 
    803  1.1  mrg /* Compute the reverse top sort order of the inverted CFG
    804  1.1  mrg    i.e. starting from the exit block and following the edges backward
    805  1.1  mrg    (from successors to predecessors).
    806  1.1  mrg    This ordering can be used for forward dataflow problems among others.
    807  1.1  mrg 
    808  1.1  mrg    Optionally if START_POINTS is specified, start from exit block and all
    809  1.1  mrg    basic blocks in START_POINTS.  This is used by CD-DCE.
    810  1.1  mrg 
    811  1.1  mrg    This function assumes that all blocks in the CFG are reachable
    812  1.1  mrg    from the ENTRY (but not necessarily from EXIT).
    813  1.1  mrg 
    814  1.1  mrg    If there's an infinite loop,
    815  1.1  mrg    a simple inverted traversal starting from the blocks
    816  1.1  mrg    with no successors can't visit all blocks.
    817  1.1  mrg    To solve this problem, we first do inverted traversal
    818  1.1  mrg    starting from the blocks with no successor.
    819  1.1  mrg    And if there's any block left that's not visited by the regular
    820  1.1  mrg    inverted traversal from EXIT,
    821  1.1  mrg    those blocks are in such problematic region.
    822  1.1  mrg    Among those, we find one block that has
    823  1.1  mrg    any visited predecessor (which is an entry into such a region),
    824  1.1  mrg    and start looking for a "dead end" from that block
    825  1.1  mrg    and do another inverted traversal from that block.  */
    826  1.1  mrg 
    827  1.1  mrg void
    828  1.1  mrg inverted_post_order_compute (vec<int> *post_order,
    829  1.1  mrg 			     sbitmap *start_points)
    830  1.1  mrg {
    831  1.1  mrg   basic_block bb;
    832  1.1  mrg   post_order->reserve_exact (n_basic_blocks_for_fn (cfun));
    833  1.1  mrg 
    834  1.1  mrg   if (flag_checking)
    835  1.1  mrg     verify_no_unreachable_blocks ();
    836  1.1  mrg 
    837  1.1  mrg   /* Allocate stack for back-tracking up CFG.  */
    838  1.1  mrg   auto_vec<edge_iterator, 20> stack (n_basic_blocks_for_fn (cfun) + 1);
    839  1.1  mrg 
    840  1.1  mrg   /* Allocate bitmap to track nodes that have been visited.  */
    841  1.1  mrg   auto_sbitmap visited (last_basic_block_for_fn (cfun));
    842  1.1  mrg 
    843  1.1  mrg   /* None of the nodes in the CFG have been visited yet.  */
    844  1.1  mrg   bitmap_clear (visited);
    845  1.1  mrg 
    846  1.1  mrg   if (start_points)
    847  1.1  mrg     {
    848  1.1  mrg       FOR_ALL_BB_FN (bb, cfun)
    849  1.1  mrg         if (bitmap_bit_p (*start_points, bb->index)
    850  1.1  mrg 	    && EDGE_COUNT (bb->preds) > 0)
    851  1.1  mrg 	  {
    852  1.1  mrg 	    stack.quick_push (ei_start (bb->preds));
    853  1.1  mrg             bitmap_set_bit (visited, bb->index);
    854  1.1  mrg 	  }
    855  1.1  mrg       if (EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds))
    856  1.1  mrg 	{
    857  1.1  mrg 	  stack.quick_push (ei_start (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds));
    858  1.1  mrg           bitmap_set_bit (visited, EXIT_BLOCK_PTR_FOR_FN (cfun)->index);
    859  1.1  mrg 	}
    860  1.1  mrg     }
    861  1.1  mrg   else
    862  1.1  mrg   /* Put all blocks that have no successor into the initial work list.  */
    863  1.1  mrg   FOR_ALL_BB_FN (bb, cfun)
    864  1.1  mrg     if (EDGE_COUNT (bb->succs) == 0)
    865  1.1  mrg       {
    866  1.1  mrg         /* Push the initial edge on to the stack.  */
    867  1.1  mrg         if (EDGE_COUNT (bb->preds) > 0)
    868  1.1  mrg           {
    869  1.1  mrg 	    stack.quick_push (ei_start (bb->preds));
    870  1.1  mrg             bitmap_set_bit (visited, bb->index);
    871  1.1  mrg           }
    872  1.1  mrg       }
    873  1.1  mrg 
    874  1.1  mrg   do
    875  1.1  mrg     {
    876  1.1  mrg       bool has_unvisited_bb = false;
    877  1.1  mrg 
    878  1.1  mrg       /* The inverted traversal loop. */
    879  1.1  mrg       while (!stack.is_empty ())
    880  1.1  mrg         {
    881  1.1  mrg           edge_iterator ei;
    882  1.1  mrg           basic_block pred;
    883  1.1  mrg 
    884  1.1  mrg           /* Look at the edge on the top of the stack.  */
    885  1.1  mrg 	  ei = stack.last ();
    886  1.1  mrg           bb = ei_edge (ei)->dest;
    887  1.1  mrg           pred = ei_edge (ei)->src;
    888  1.1  mrg 
    889  1.1  mrg           /* Check if the predecessor has been visited yet.  */
    890  1.1  mrg           if (! bitmap_bit_p (visited, pred->index))
    891  1.1  mrg             {
    892  1.1  mrg               /* Mark that we have visited the destination.  */
    893  1.1  mrg               bitmap_set_bit (visited, pred->index);
    894  1.1  mrg 
    895  1.1  mrg               if (EDGE_COUNT (pred->preds) > 0)
    896  1.1  mrg                 /* Since the predecessor node has been visited for the first
    897  1.1  mrg                    time, check its predecessors.  */
    898  1.1  mrg 		stack.quick_push (ei_start (pred->preds));
    899  1.1  mrg               else
    900  1.1  mrg 		post_order->quick_push (pred->index);
    901  1.1  mrg             }
    902  1.1  mrg           else
    903  1.1  mrg             {
    904  1.1  mrg 	      if (bb != EXIT_BLOCK_PTR_FOR_FN (cfun)
    905  1.1  mrg 		  && ei_one_before_end_p (ei))
    906  1.1  mrg 		post_order->quick_push (bb->index);
    907  1.1  mrg 
    908  1.1  mrg               if (!ei_one_before_end_p (ei))
    909  1.1  mrg 		ei_next (&stack.last ());
    910  1.1  mrg               else
    911  1.1  mrg 		stack.pop ();
    912  1.1  mrg             }
    913  1.1  mrg         }
    914  1.1  mrg 
    915  1.1  mrg       /* Detect any infinite loop and activate the kludge.
    916  1.1  mrg          Note that this doesn't check EXIT_BLOCK itself
    917  1.1  mrg 	 since EXIT_BLOCK is always added after the outer do-while loop.  */
    918  1.1  mrg       FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
    919  1.1  mrg 		      EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
    920  1.1  mrg         if (!bitmap_bit_p (visited, bb->index))
    921  1.1  mrg           {
    922  1.1  mrg             has_unvisited_bb = true;
    923  1.1  mrg 
    924  1.1  mrg             if (EDGE_COUNT (bb->preds) > 0)
    925  1.1  mrg               {
    926  1.1  mrg                 edge_iterator ei;
    927  1.1  mrg                 edge e;
    928  1.1  mrg                 basic_block visited_pred = NULL;
    929  1.1  mrg 
    930  1.1  mrg                 /* Find an already visited predecessor.  */
    931  1.1  mrg                 FOR_EACH_EDGE (e, ei, bb->preds)
    932  1.1  mrg                   {
    933  1.1  mrg                     if (bitmap_bit_p (visited, e->src->index))
    934  1.1  mrg                       visited_pred = e->src;
    935  1.1  mrg                   }
    936  1.1  mrg 
    937  1.1  mrg                 if (visited_pred)
    938  1.1  mrg                   {
    939  1.1  mrg                     basic_block be = dfs_find_deadend (bb);
    940  1.1  mrg                     gcc_assert (be != NULL);
    941  1.1  mrg                     bitmap_set_bit (visited, be->index);
    942  1.1  mrg 		    stack.quick_push (ei_start (be->preds));
    943  1.1  mrg                     break;
    944  1.1  mrg                   }
    945  1.1  mrg               }
    946  1.1  mrg           }
    947  1.1  mrg 
    948  1.1  mrg       if (has_unvisited_bb && stack.is_empty ())
    949  1.1  mrg         {
    950  1.1  mrg 	  /* No blocks are reachable from EXIT at all.
    951  1.1  mrg              Find a dead-end from the ENTRY, and restart the iteration. */
    952  1.1  mrg 	  basic_block be = dfs_find_deadend (ENTRY_BLOCK_PTR_FOR_FN (cfun));
    953  1.1  mrg           gcc_assert (be != NULL);
    954  1.1  mrg           bitmap_set_bit (visited, be->index);
    955  1.1  mrg 	  stack.quick_push (ei_start (be->preds));
    956  1.1  mrg         }
    957  1.1  mrg 
    958  1.1  mrg       /* The only case the below while fires is
    959  1.1  mrg          when there's an infinite loop.  */
    960  1.1  mrg     }
    961  1.1  mrg   while (!stack.is_empty ());
    962  1.1  mrg 
    963  1.1  mrg   /* EXIT_BLOCK is always included.  */
    964  1.1  mrg   post_order->quick_push (EXIT_BLOCK);
    965  1.1  mrg }
    966  1.1  mrg 
    967  1.1  mrg /* Compute the depth first search order of FN and store in the array
    968  1.1  mrg    PRE_ORDER if nonzero.  If REV_POST_ORDER is nonzero, return the
    969  1.1  mrg    reverse completion number for each node.  Returns the number of nodes
    970  1.1  mrg    visited.  A depth first search tries to get as far away from the starting
    971  1.1  mrg    point as quickly as possible.
    972  1.1  mrg 
    973  1.1  mrg    In case the function has unreachable blocks the number of nodes
    974  1.1  mrg    visited does not include them.
    975  1.1  mrg 
    976  1.1  mrg    pre_order is a really a preorder numbering of the graph.
    977  1.1  mrg    rev_post_order is really a reverse postorder numbering of the graph.  */
    978  1.1  mrg 
    979  1.1  mrg int
    980  1.1  mrg pre_and_rev_post_order_compute_fn (struct function *fn,
    981  1.1  mrg 				   int *pre_order, int *rev_post_order,
    982  1.1  mrg 				   bool include_entry_exit)
    983  1.1  mrg {
    984  1.1  mrg   int pre_order_num = 0;
    985  1.1  mrg   int rev_post_order_num = n_basic_blocks_for_fn (fn) - 1;
    986  1.1  mrg 
    987  1.1  mrg   /* Allocate stack for back-tracking up CFG.  */
    988  1.1  mrg   auto_vec<edge_iterator, 20> stack (n_basic_blocks_for_fn (fn) + 1);
    989  1.1  mrg 
    990  1.1  mrg   if (include_entry_exit)
    991  1.1  mrg     {
    992  1.1  mrg       if (pre_order)
    993  1.1  mrg 	pre_order[pre_order_num] = ENTRY_BLOCK;
    994  1.1  mrg       pre_order_num++;
    995  1.1  mrg       if (rev_post_order)
    996  1.1  mrg 	rev_post_order[rev_post_order_num--] = EXIT_BLOCK;
    997  1.1  mrg     }
    998  1.1  mrg   else
    999  1.1  mrg     rev_post_order_num -= NUM_FIXED_BLOCKS;
   1000  1.1  mrg 
   1001  1.1  mrg   /* BB flag to track nodes that have been visited.  */
   1002  1.1  mrg   auto_bb_flag visited (fn);
   1003  1.1  mrg 
   1004  1.1  mrg   /* Push the first edge on to the stack.  */
   1005  1.1  mrg   stack.quick_push (ei_start (ENTRY_BLOCK_PTR_FOR_FN (fn)->succs));
   1006  1.1  mrg 
   1007  1.1  mrg   while (!stack.is_empty ())
   1008  1.1  mrg     {
   1009  1.1  mrg       basic_block src;
   1010  1.1  mrg       basic_block dest;
   1011  1.1  mrg 
   1012  1.1  mrg       /* Look at the edge on the top of the stack.  */
   1013  1.1  mrg       edge_iterator ei = stack.last ();
   1014  1.1  mrg       src = ei_edge (ei)->src;
   1015  1.1  mrg       dest = ei_edge (ei)->dest;
   1016  1.1  mrg 
   1017  1.1  mrg       /* Check if the edge destination has been visited yet.  */
   1018  1.1  mrg       if (dest != EXIT_BLOCK_PTR_FOR_FN (fn)
   1019  1.1  mrg 	  && ! (dest->flags & visited))
   1020  1.1  mrg 	{
   1021  1.1  mrg 	  /* Mark that we have visited the destination.  */
   1022  1.1  mrg 	  dest->flags |= visited;
   1023  1.1  mrg 
   1024  1.1  mrg 	  if (pre_order)
   1025  1.1  mrg 	    pre_order[pre_order_num] = dest->index;
   1026  1.1  mrg 
   1027  1.1  mrg 	  pre_order_num++;
   1028  1.1  mrg 
   1029  1.1  mrg 	  if (EDGE_COUNT (dest->succs) > 0)
   1030  1.1  mrg 	    /* Since the DEST node has been visited for the first
   1031  1.1  mrg 	       time, check its successors.  */
   1032  1.1  mrg 	    stack.quick_push (ei_start (dest->succs));
   1033  1.1  mrg 	  else if (rev_post_order)
   1034  1.1  mrg 	    /* There are no successors for the DEST node so assign
   1035  1.1  mrg 	       its reverse completion number.  */
   1036  1.1  mrg 	    rev_post_order[rev_post_order_num--] = dest->index;
   1037  1.1  mrg 	}
   1038  1.1  mrg       else
   1039  1.1  mrg 	{
   1040  1.1  mrg 	  if (ei_one_before_end_p (ei)
   1041  1.1  mrg 	      && src != ENTRY_BLOCK_PTR_FOR_FN (fn)
   1042  1.1  mrg 	      && rev_post_order)
   1043  1.1  mrg 	    /* There are no more successors for the SRC node
   1044  1.1  mrg 	       so assign its reverse completion number.  */
   1045  1.1  mrg 	    rev_post_order[rev_post_order_num--] = src->index;
   1046  1.1  mrg 
   1047  1.1  mrg 	  if (!ei_one_before_end_p (ei))
   1048  1.1  mrg 	    ei_next (&stack.last ());
   1049  1.1  mrg 	  else
   1050  1.1  mrg 	    stack.pop ();
   1051  1.1  mrg 	}
   1052  1.1  mrg     }
   1053  1.1  mrg 
   1054  1.1  mrg   if (include_entry_exit)
   1055  1.1  mrg     {
   1056  1.1  mrg       if (pre_order)
   1057  1.1  mrg 	pre_order[pre_order_num] = EXIT_BLOCK;
   1058  1.1  mrg       pre_order_num++;
   1059  1.1  mrg       if (rev_post_order)
   1060  1.1  mrg 	rev_post_order[rev_post_order_num--] = ENTRY_BLOCK;
   1061  1.1  mrg     }
   1062  1.1  mrg 
   1063  1.1  mrg   /* Clear the temporarily allocated flag.  */
   1064  1.1  mrg   if (!rev_post_order)
   1065  1.1  mrg     rev_post_order = pre_order;
   1066  1.1  mrg   for (int i = 0; i < pre_order_num; ++i)
   1067  1.1  mrg     BASIC_BLOCK_FOR_FN (fn, rev_post_order[i])->flags &= ~visited;
   1068  1.1  mrg 
   1069  1.1  mrg   return pre_order_num;
   1070  1.1  mrg }
   1071  1.1  mrg 
   1072  1.1  mrg /* Like pre_and_rev_post_order_compute_fn but operating on the
   1073  1.1  mrg    current function and asserting that all nodes were visited.  */
   1074  1.1  mrg 
   1075  1.1  mrg int
   1076  1.1  mrg pre_and_rev_post_order_compute (int *pre_order, int *rev_post_order,
   1077  1.1  mrg 				bool include_entry_exit)
   1078  1.1  mrg {
   1079  1.1  mrg   int pre_order_num
   1080  1.1  mrg     = pre_and_rev_post_order_compute_fn (cfun, pre_order, rev_post_order,
   1081  1.1  mrg 					 include_entry_exit);
   1082  1.1  mrg   if (include_entry_exit)
   1083  1.1  mrg     /* The number of nodes visited should be the number of blocks.  */
   1084  1.1  mrg     gcc_assert (pre_order_num == n_basic_blocks_for_fn (cfun));
   1085  1.1  mrg   else
   1086  1.1  mrg     /* The number of nodes visited should be the number of blocks minus
   1087  1.1  mrg        the entry and exit blocks which are not visited here.  */
   1088  1.1  mrg     gcc_assert (pre_order_num
   1089  1.1  mrg 		== (n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS));
   1090  1.1  mrg 
   1091  1.1  mrg   return pre_order_num;
   1092  1.1  mrg }
   1093  1.1  mrg 
   1094  1.1  mrg 
   1095  1.1  mrg /* Per basic-block data for rev_post_order_and_mark_dfs_back_seme,
   1096  1.1  mrg    element of a sparsely populated array indexed by basic-block number.  */
   1097  1.1  mrg typedef auto_vec<int, 2> scc_exit_vec_t;
   1098  1.1  mrg struct rpoamdbs_bb_data {
   1099  1.1  mrg     int depth;
   1100  1.1  mrg     int bb_to_pre;
   1101  1.1  mrg     /* The basic-block index of the SCC entry of the block visited first
   1102  1.1  mrg        (the SCC leader).  */
   1103  1.1  mrg     int scc;
   1104  1.1  mrg     /* The index into the RPO array where the blocks SCC entries end
   1105  1.1  mrg        (only valid for the SCC leader).  */
   1106  1.1  mrg     int scc_end;
   1107  1.1  mrg     /* The indexes of the exits destinations of this SCC (only valid
   1108  1.1  mrg        for the SCC leader).  Initialized upon discovery of SCC leaders.  */
   1109  1.1  mrg     scc_exit_vec_t scc_exits;
   1110  1.1  mrg };
   1111  1.1  mrg 
   1112  1.1  mrg /* Tag H as a header of B, weaving H and its loop header list into the
   1113  1.1  mrg    current loop header list of B.  */
   1114  1.1  mrg 
   1115  1.1  mrg static void
   1116  1.1  mrg tag_header (int b, int h, rpoamdbs_bb_data *bb_data)
   1117  1.1  mrg {
   1118  1.1  mrg   if (h == -1 || b == h)
   1119  1.1  mrg     return;
   1120  1.1  mrg   int cur1 = b;
   1121  1.1  mrg   int cur2 = h;
   1122  1.1  mrg   while (bb_data[cur1].scc != -1)
   1123  1.1  mrg     {
   1124  1.1  mrg       int ih = bb_data[cur1].scc;
   1125  1.1  mrg       if (ih == cur2)
   1126  1.1  mrg 	return;
   1127  1.1  mrg       if (bb_data[ih].depth < bb_data[cur2].depth)
   1128  1.1  mrg 	{
   1129  1.1  mrg 	  bb_data[cur1].scc = cur2;
   1130  1.1  mrg 	  cur1 = cur2;
   1131  1.1  mrg 	  cur2 = ih;
   1132  1.1  mrg 	}
   1133  1.1  mrg       else
   1134  1.1  mrg 	cur1 = ih;
   1135  1.1  mrg     }
   1136  1.1  mrg   bb_data[cur1].scc = cur2;
   1137  1.1  mrg }
   1138  1.1  mrg 
   1139  1.1  mrg /* Comparator for a sort of two edges destinations E1 and E2 after their index
   1140  1.1  mrg    in the PRE array as specified by BB_TO_PRE.  */
   1141  1.1  mrg 
   1142  1.1  mrg static int
   1143  1.1  mrg cmp_edge_dest_pre (const void *e1_, const void *e2_, void *data_)
   1144  1.1  mrg {
   1145  1.1  mrg   const int *e1 = (const int *)e1_;
   1146  1.1  mrg   const int *e2 = (const int *)e2_;
   1147  1.1  mrg   rpoamdbs_bb_data *bb_data = (rpoamdbs_bb_data *)data_;
   1148  1.1  mrg   return (bb_data[*e1].bb_to_pre - bb_data[*e2].bb_to_pre);
   1149  1.1  mrg }
   1150  1.1  mrg 
   1151  1.1  mrg /* Compute the reverse completion number of a depth first search
   1152  1.1  mrg    on the SEME region denoted by the ENTRY edge and the EXIT_BBS set of
   1153  1.1  mrg    exit block indexes and store it in the array REV_POST_ORDER.
   1154  1.1  mrg    Also sets the EDGE_DFS_BACK edge flags according to this visitation
   1155  1.1  mrg    order.
   1156  1.1  mrg    Returns the number of nodes visited.
   1157  1.1  mrg 
   1158  1.1  mrg    In case the function has unreachable blocks the number of nodes
   1159  1.1  mrg    visited does not include them.
   1160  1.1  mrg 
   1161  1.1  mrg    If FOR_ITERATION is true then compute an RPO where SCCs form a
   1162  1.1  mrg    contiguous region in the RPO array.
   1163  1.1  mrg    *TOPLEVEL_SCC_EXTENTS if not NULL is filled with pairs of
   1164  1.1  mrg    *REV_POST_ORDER indexes denoting extents of the toplevel SCCs in
   1165  1.1  mrg    this region.  */
   1166  1.1  mrg 
   1167  1.1  mrg int
   1168  1.1  mrg rev_post_order_and_mark_dfs_back_seme (struct function *fn, edge entry,
   1169  1.1  mrg 				       bitmap exit_bbs, bool for_iteration,
   1170  1.1  mrg 				       int *rev_post_order,
   1171  1.1  mrg 				       vec<std::pair<int, int> >
   1172  1.1  mrg 					 *toplevel_scc_extents)
   1173  1.1  mrg {
   1174  1.1  mrg   int rev_post_order_num = 0;
   1175  1.1  mrg 
   1176  1.1  mrg   /* BB flag to track nodes that have been visited.  */
   1177  1.1  mrg   auto_bb_flag visited (fn);
   1178  1.1  mrg 
   1179  1.1  mrg   /* Lazily initialized per-BB data for the two DFS walks below.  */
   1180  1.1  mrg   rpoamdbs_bb_data *bb_data
   1181  1.1  mrg     = XNEWVEC (rpoamdbs_bb_data, last_basic_block_for_fn (fn));
   1182  1.1  mrg 
   1183  1.1  mrg   /* First DFS walk, loop discovery according to
   1184  1.1  mrg       A New Algorithm for Identifying Loops in Decompilation
   1185  1.1  mrg      by Tao Wei, Jian Mao, Wei Zou and You Chen of the Institute of
   1186  1.1  mrg      Computer Science and Technology of the Peking University.  */
   1187  1.1  mrg   auto_vec<edge_iterator, 20> ei_stack (n_basic_blocks_for_fn (fn) + 1);
   1188  1.1  mrg   auto_bb_flag is_header (fn);
   1189  1.1  mrg   int depth = 1;
   1190  1.1  mrg   unsigned n_sccs = 0;
   1191  1.1  mrg 
   1192  1.1  mrg   basic_block dest = entry->dest;
   1193  1.1  mrg   edge_iterator ei;
   1194  1.1  mrg   int pre_num = 0;
   1195  1.1  mrg 
   1196  1.1  mrg   /* DFS process DEST.  */
   1197  1.1  mrg find_loops:
   1198  1.1  mrg   bb_data[dest->index].bb_to_pre = pre_num++;
   1199  1.1  mrg   bb_data[dest->index].depth = depth;
   1200  1.1  mrg   bb_data[dest->index].scc = -1;
   1201  1.1  mrg   depth++;
   1202  1.1  mrg   gcc_assert ((dest->flags & (is_header|visited)) == 0);
   1203  1.1  mrg   dest->flags |= visited;
   1204  1.1  mrg   ei = ei_start (dest->succs);
   1205  1.1  mrg   while (!ei_end_p (ei))
   1206  1.1  mrg     {
   1207  1.1  mrg       ei_edge (ei)->flags &= ~EDGE_DFS_BACK;
   1208  1.1  mrg       if (bitmap_bit_p (exit_bbs, ei_edge (ei)->dest->index))
   1209  1.1  mrg 	;
   1210  1.1  mrg       else if (!(ei_edge (ei)->dest->flags & visited))
   1211  1.1  mrg 	{
   1212  1.1  mrg 	  ei_stack.quick_push (ei);
   1213  1.1  mrg 	  dest = ei_edge (ei)->dest;
   1214  1.1  mrg 	  /* DFS recurse on DEST.  */
   1215  1.1  mrg 	  goto find_loops;
   1216  1.1  mrg 
   1217  1.1  mrg ret_from_find_loops:
   1218  1.1  mrg 	  /* Return point of DFS recursion.  */
   1219  1.1  mrg 	  ei = ei_stack.pop ();
   1220  1.1  mrg 	  dest = ei_edge (ei)->src;
   1221  1.1  mrg 	  int header = bb_data[ei_edge (ei)->dest->index].scc;
   1222  1.1  mrg 	  tag_header (dest->index, header, bb_data);
   1223  1.1  mrg 	  depth = bb_data[dest->index].depth + 1;
   1224  1.1  mrg 	}
   1225  1.1  mrg       else
   1226  1.1  mrg 	{
   1227  1.1  mrg 	  if (bb_data[ei_edge (ei)->dest->index].depth > 0) /* on the stack */
   1228  1.1  mrg 	    {
   1229  1.1  mrg 	      ei_edge (ei)->flags |= EDGE_DFS_BACK;
   1230  1.1  mrg 	      n_sccs++;
   1231  1.1  mrg 	      ei_edge (ei)->dest->flags |= is_header;
   1232  1.1  mrg 	      ::new (&bb_data[ei_edge (ei)->dest->index].scc_exits)
   1233  1.1  mrg 		auto_vec<int, 2> ();
   1234  1.1  mrg 	      tag_header (dest->index, ei_edge (ei)->dest->index, bb_data);
   1235  1.1  mrg 	    }
   1236  1.1  mrg 	  else if (bb_data[ei_edge (ei)->dest->index].scc == -1)
   1237  1.1  mrg 	    ;
   1238  1.1  mrg 	  else
   1239  1.1  mrg 	    {
   1240  1.1  mrg 	      int header = bb_data[ei_edge (ei)->dest->index].scc;
   1241  1.1  mrg 	      if (bb_data[header].depth > 0)
   1242  1.1  mrg 		tag_header (dest->index, header, bb_data);
   1243  1.1  mrg 	      else
   1244  1.1  mrg 		{
   1245  1.1  mrg 		  /* A re-entry into an existing loop.  */
   1246  1.1  mrg 		  /* ???  Need to mark is_header?  */
   1247  1.1  mrg 		  while (bb_data[header].scc != -1)
   1248  1.1  mrg 		    {
   1249  1.1  mrg 		      header = bb_data[header].scc;
   1250  1.1  mrg 		      if (bb_data[header].depth > 0)
   1251  1.1  mrg 			{
   1252  1.1  mrg 			  tag_header (dest->index, header, bb_data);
   1253  1.1  mrg 			  break;
   1254  1.1  mrg 			}
   1255  1.1  mrg 		    }
   1256  1.1  mrg 		}
   1257  1.1  mrg 	    }
   1258  1.1  mrg 	}
   1259  1.1  mrg       ei_next (&ei);
   1260  1.1  mrg     }
   1261  1.1  mrg   rev_post_order[rev_post_order_num++] = dest->index;
   1262  1.1  mrg   /* not on the stack anymore */
   1263  1.1  mrg   bb_data[dest->index].depth = -bb_data[dest->index].depth;
   1264  1.1  mrg   if (!ei_stack.is_empty ())
   1265  1.1  mrg     /* Return from DFS recursion.  */
   1266  1.1  mrg     goto ret_from_find_loops;
   1267  1.1  mrg 
   1268  1.1  mrg   /* Optimize for no SCCs found or !for_iteration.  */
   1269  1.1  mrg   if (n_sccs == 0 || !for_iteration)
   1270  1.1  mrg     {
   1271  1.1  mrg       /* Clear the temporarily allocated flags.  */
   1272  1.1  mrg       for (int i = 0; i < rev_post_order_num; ++i)
   1273  1.1  mrg 	BASIC_BLOCK_FOR_FN (fn, rev_post_order[i])->flags
   1274  1.1  mrg 	  &= ~(is_header|visited);
   1275  1.1  mrg       /* And swap elements.  */
   1276  1.1  mrg       for (int i = 0; i < rev_post_order_num/2; ++i)
   1277  1.1  mrg 	std::swap (rev_post_order[i], rev_post_order[rev_post_order_num-i-1]);
   1278  1.1  mrg       XDELETEVEC (bb_data);
   1279  1.1  mrg 
   1280  1.1  mrg       return rev_post_order_num;
   1281  1.1  mrg     }
   1282  1.1  mrg 
   1283  1.1  mrg   /* Next find SCC exits, clear the visited flag and compute an upper bound
   1284  1.1  mrg      for the edge stack below.  */
   1285  1.1  mrg   unsigned edge_count = 0;
   1286  1.1  mrg   for (int i = 0; i < rev_post_order_num; ++i)
   1287  1.1  mrg     {
   1288  1.1  mrg       int bb = rev_post_order[i];
   1289  1.1  mrg       BASIC_BLOCK_FOR_FN (fn, bb)->flags &= ~visited;
   1290  1.1  mrg       edge e;
   1291  1.1  mrg       FOR_EACH_EDGE (e, ei, BASIC_BLOCK_FOR_FN (fn, bb)->succs)
   1292  1.1  mrg 	{
   1293  1.1  mrg 	  if (bitmap_bit_p (exit_bbs, e->dest->index))
   1294  1.1  mrg 	    continue;
   1295  1.1  mrg 	  edge_count++;
   1296  1.1  mrg 	  /* if e is an exit from e->src, record it for
   1297  1.1  mrg 	     bb_data[e->src].scc.  */
   1298  1.1  mrg 	  int src_scc = e->src->index;
   1299  1.1  mrg 	  if (!(e->src->flags & is_header))
   1300  1.1  mrg 	    src_scc = bb_data[src_scc].scc;
   1301  1.1  mrg 	  if (src_scc == -1)
   1302  1.1  mrg 	    continue;
   1303  1.1  mrg 	  int dest_scc = e->dest->index;
   1304  1.1  mrg 	  if (!(e->dest->flags & is_header))
   1305  1.1  mrg 	    dest_scc = bb_data[dest_scc].scc;
   1306  1.1  mrg 	  if (src_scc == dest_scc)
   1307  1.1  mrg 	    continue;
   1308  1.1  mrg 	  /* When dest_scc is nested insde src_scc it's not an
   1309  1.1  mrg 	     exit.  */
   1310  1.1  mrg 	  int tem_dest_scc = dest_scc;
   1311  1.1  mrg 	  unsigned dest_scc_depth = 0;
   1312  1.1  mrg 	  while (tem_dest_scc != -1)
   1313  1.1  mrg 	    {
   1314  1.1  mrg 	      dest_scc_depth++;
   1315  1.1  mrg 	      if ((tem_dest_scc = bb_data[tem_dest_scc].scc) == src_scc)
   1316  1.1  mrg 		break;
   1317  1.1  mrg 	    }
   1318  1.1  mrg 	  if (tem_dest_scc != -1)
   1319  1.1  mrg 	    continue;
   1320  1.1  mrg 	  /* When src_scc is nested inside dest_scc record an
   1321  1.1  mrg 	     exit from the outermost SCC this edge exits.  */
   1322  1.1  mrg 	  int tem_src_scc = src_scc;
   1323  1.1  mrg 	  unsigned src_scc_depth = 0;
   1324  1.1  mrg 	  while (tem_src_scc != -1)
   1325  1.1  mrg 	    {
   1326  1.1  mrg 	      if (bb_data[tem_src_scc].scc == dest_scc)
   1327  1.1  mrg 		{
   1328  1.1  mrg 		  edge_count++;
   1329  1.1  mrg 		  bb_data[tem_src_scc].scc_exits.safe_push (e->dest->index);
   1330  1.1  mrg 		  break;
   1331  1.1  mrg 		}
   1332  1.1  mrg 	      tem_src_scc = bb_data[tem_src_scc].scc;
   1333  1.1  mrg 	      src_scc_depth++;
   1334  1.1  mrg 	    }
   1335  1.1  mrg 	  /* Else find the outermost SCC this edge exits (exits
   1336  1.1  mrg 	     from the inner SCCs are not important for the DFS
   1337  1.1  mrg 	     walk adjustment).  Do so by computing the common
   1338  1.1  mrg 	     ancestor SCC where the immediate child it to the source
   1339  1.1  mrg 	     SCC is the exited SCC.  */
   1340  1.1  mrg 	  if (tem_src_scc == -1)
   1341  1.1  mrg 	    {
   1342  1.1  mrg 	      edge_count++;
   1343  1.1  mrg 	      while (src_scc_depth > dest_scc_depth)
   1344  1.1  mrg 		{
   1345  1.1  mrg 		  src_scc = bb_data[src_scc].scc;
   1346  1.1  mrg 		  src_scc_depth--;
   1347  1.1  mrg 		}
   1348  1.1  mrg 	      while (dest_scc_depth > src_scc_depth)
   1349  1.1  mrg 		{
   1350  1.1  mrg 		  dest_scc = bb_data[dest_scc].scc;
   1351  1.1  mrg 		  dest_scc_depth--;
   1352  1.1  mrg 		}
   1353  1.1  mrg 	      while (bb_data[src_scc].scc != bb_data[dest_scc].scc)
   1354  1.1  mrg 		{
   1355  1.1  mrg 		  src_scc = bb_data[src_scc].scc;
   1356  1.1  mrg 		  dest_scc = bb_data[dest_scc].scc;
   1357  1.1  mrg 		}
   1358  1.1  mrg 	      bb_data[src_scc].scc_exits.safe_push (e->dest->index);
   1359  1.1  mrg 	    }
   1360  1.1  mrg 	}
   1361  1.1  mrg     }
   1362  1.1  mrg 
   1363  1.1  mrg   /* Now the second DFS walk to compute a RPO where the extent of SCCs
   1364  1.1  mrg      is minimized thus SCC members are adjacent in the RPO array.
   1365  1.1  mrg      This is done by performing a DFS walk computing RPO with first visiting
   1366  1.1  mrg      extra direct edges from SCC entry to its exits.
   1367  1.1  mrg      That simulates a DFS walk over the graph with SCCs collapsed and
   1368  1.1  mrg      walking the SCCs themselves only when all outgoing edges from the
   1369  1.1  mrg      SCCs have been visited.
   1370  1.1  mrg      SCC_END[scc-header-index] is the position in the RPO array of the
   1371  1.1  mrg      last member of the SCC.  */
   1372  1.1  mrg   auto_vec<std::pair<basic_block, basic_block>, 20> estack (edge_count + 1);
   1373  1.1  mrg   int idx = rev_post_order_num;
   1374  1.1  mrg   basic_block edest;
   1375  1.1  mrg   dest = entry->dest;
   1376  1.1  mrg 
   1377  1.1  mrg   /* DFS process DEST.  */
   1378  1.1  mrg dfs_rpo:
   1379  1.1  mrg   gcc_checking_assert ((dest->flags & visited) == 0);
   1380  1.1  mrg   /* Verify we enter SCCs through the same header and SCC nesting appears
   1381  1.1  mrg      the same.  */
   1382  1.1  mrg   gcc_assert (bb_data[dest->index].scc == -1
   1383  1.1  mrg 	      || (BASIC_BLOCK_FOR_FN (fn, bb_data[dest->index].scc)->flags
   1384  1.1  mrg 		  & visited));
   1385  1.1  mrg   dest->flags |= visited;
   1386  1.1  mrg   bb_data[dest->index].scc_end = -1;
   1387  1.1  mrg   if ((dest->flags & is_header)
   1388  1.1  mrg       && !bb_data[dest->index].scc_exits.is_empty ())
   1389  1.1  mrg     {
   1390  1.1  mrg       /* Push the all SCC exits as outgoing edges from its header to
   1391  1.1  mrg 	 be visited first.
   1392  1.1  mrg 	 To process exits in the same relative order as in the first
   1393  1.1  mrg 	 DFS walk sort them after their destination PRE order index.  */
   1394  1.1  mrg       gcc_sort_r (&bb_data[dest->index].scc_exits[0],
   1395  1.1  mrg 		  bb_data[dest->index].scc_exits.length (),
   1396  1.1  mrg 		  sizeof (int), cmp_edge_dest_pre, bb_data);
   1397  1.1  mrg       /* Process edges in reverse to match previous DFS walk order.  */
   1398  1.1  mrg       for (int i = bb_data[dest->index].scc_exits.length () - 1; i >= 0; --i)
   1399  1.1  mrg 	estack.quick_push (std::make_pair
   1400  1.1  mrg 	  (dest, BASIC_BLOCK_FOR_FN (fn, bb_data[dest->index].scc_exits[i])));
   1401  1.1  mrg     }
   1402  1.1  mrg   else
   1403  1.1  mrg     {
   1404  1.1  mrg       if (dest->flags & is_header)
   1405  1.1  mrg 	bb_data[dest->index].scc_end = idx - 1;
   1406  1.1  mrg       /* Push the edge vector in reverse to match the iteration order
   1407  1.1  mrg 	 from the DFS walk above.  */
   1408  1.1  mrg       for (int i = EDGE_COUNT (dest->succs) - 1; i >= 0; --i)
   1409  1.1  mrg 	if (!bitmap_bit_p (exit_bbs, EDGE_SUCC (dest, i)->dest->index))
   1410  1.1  mrg 	  estack.quick_push (std::make_pair (dest,
   1411  1.1  mrg 					     EDGE_SUCC (dest, i)->dest));
   1412  1.1  mrg     }
   1413  1.1  mrg   while (!estack.is_empty ()
   1414  1.1  mrg 	 && estack.last ().first == dest)
   1415  1.1  mrg     {
   1416  1.1  mrg       edest = estack.last ().second;
   1417  1.1  mrg       if (!(edest->flags & visited))
   1418  1.1  mrg 	{
   1419  1.1  mrg 	  dest = edest;
   1420  1.1  mrg 	  /* DFS recurse on DEST.  */
   1421  1.1  mrg 	  goto dfs_rpo;
   1422  1.1  mrg 
   1423  1.1  mrg ret_from_dfs_rpo:
   1424  1.1  mrg 	  /* Return point of DFS recursion.  */
   1425  1.1  mrg 	  dest = estack.last ().first;
   1426  1.1  mrg 	}
   1427  1.1  mrg       estack.pop ();
   1428  1.1  mrg       /* If we processed all SCC exits from DEST mark the SCC end
   1429  1.1  mrg 	 since all RPO entries up to DEST itself will now belong
   1430  1.1  mrg 	 to its SCC.  The special-case of no SCC exits is already
   1431  1.1  mrg 	 dealt with above.  */
   1432  1.1  mrg       if (dest->flags & is_header
   1433  1.1  mrg 	  /* When the last exit edge was processed mark the SCC end
   1434  1.1  mrg 	     and push the regular edges.  */
   1435  1.1  mrg 	  && bb_data[dest->index].scc_end == -1
   1436  1.1  mrg 	  && (estack.is_empty ()
   1437  1.1  mrg 	      || estack.last ().first != dest))
   1438  1.1  mrg 	{
   1439  1.1  mrg 	  bb_data[dest->index].scc_end = idx - 1;
   1440  1.1  mrg 	  /* Push the edge vector in reverse to match the iteration order
   1441  1.1  mrg 	     from the DFS walk above.  */
   1442  1.1  mrg 	  for (int i = EDGE_COUNT (dest->succs) - 1; i >= 0; --i)
   1443  1.1  mrg 	    if (!bitmap_bit_p (exit_bbs, EDGE_SUCC (dest, i)->dest->index))
   1444  1.1  mrg 	      estack.quick_push (std::make_pair (dest,
   1445  1.1  mrg 						 EDGE_SUCC (dest, i)->dest));
   1446  1.1  mrg 	}
   1447  1.1  mrg     }
   1448  1.1  mrg   rev_post_order[--idx] = dest->index;
   1449  1.1  mrg   if (!estack.is_empty ())
   1450  1.1  mrg     /* Return from DFS recursion.  */
   1451  1.1  mrg     goto ret_from_dfs_rpo;
   1452  1.1  mrg 
   1453  1.1  mrg   /* Each SCC extends are from the position of the header inside
   1454  1.1  mrg      the RPO array up to RPO array index scc_end[header-index].  */
   1455  1.1  mrg   if (toplevel_scc_extents)
   1456  1.1  mrg     for (int i = 0; i < rev_post_order_num; i++)
   1457  1.1  mrg       {
   1458  1.1  mrg 	basic_block bb = BASIC_BLOCK_FOR_FN (fn, rev_post_order[i]);
   1459  1.1  mrg 	if (bb->flags & is_header)
   1460  1.1  mrg 	  {
   1461  1.1  mrg 	    toplevel_scc_extents->safe_push
   1462  1.1  mrg 	      (std::make_pair (i, bb_data[bb->index].scc_end));
   1463  1.1  mrg 	    i = bb_data[bb->index].scc_end;
   1464  1.1  mrg 	  }
   1465  1.1  mrg       }
   1466  1.1  mrg 
   1467  1.1  mrg   /* Clear the temporarily allocated flags and free memory.  */
   1468  1.1  mrg   for (int i = 0; i < rev_post_order_num; ++i)
   1469  1.1  mrg     {
   1470  1.1  mrg       basic_block bb = BASIC_BLOCK_FOR_FN (fn, rev_post_order[i]);
   1471  1.1  mrg       if (bb->flags & is_header)
   1472  1.1  mrg 	bb_data[bb->index].scc_exits.~scc_exit_vec_t ();
   1473  1.1  mrg       bb->flags &= ~(visited|is_header);
   1474  1.1  mrg     }
   1475  1.1  mrg 
   1476  1.1  mrg   XDELETEVEC (bb_data);
   1477  1.1  mrg 
   1478  1.1  mrg   return rev_post_order_num;
   1479  1.1  mrg }
   1480  1.1  mrg 
   1481  1.1  mrg 
   1482  1.1  mrg 
   1483  1.1  mrg /* Compute the depth first search order on the _reverse_ graph and
   1484  1.1  mrg    store it in the array DFS_ORDER, marking the nodes visited in VISITED.
   1485  1.1  mrg    Returns the number of nodes visited.
   1486  1.1  mrg 
   1487  1.1  mrg    The computation is split into three pieces:
   1488  1.1  mrg 
   1489  1.1  mrg    flow_dfs_compute_reverse_init () creates the necessary data
   1490  1.1  mrg    structures.
   1491  1.1  mrg 
   1492  1.1  mrg    flow_dfs_compute_reverse_add_bb () adds a basic block to the data
   1493  1.1  mrg    structures.  The block will start the search.
   1494  1.1  mrg 
   1495  1.1  mrg    flow_dfs_compute_reverse_execute () continues (or starts) the
   1496  1.1  mrg    search using the block on the top of the stack, stopping when the
   1497  1.1  mrg    stack is empty.
   1498  1.1  mrg 
   1499  1.1  mrg    flow_dfs_compute_reverse_finish () destroys the necessary data
   1500  1.1  mrg    structures.
   1501  1.1  mrg 
   1502  1.1  mrg    Thus, the user will probably call ..._init(), call ..._add_bb() to
   1503  1.1  mrg    add a beginning basic block to the stack, call ..._execute(),
   1504  1.1  mrg    possibly add another bb to the stack and again call ..._execute(),
   1505  1.1  mrg    ..., and finally call _finish().  */
   1506  1.1  mrg 
   1507  1.1  mrg /* Initialize the data structures used for depth-first search on the
   1508  1.1  mrg    reverse graph.  If INITIALIZE_STACK is nonzero, the exit block is
   1509  1.1  mrg    added to the basic block stack.  DATA is the current depth-first
   1510  1.1  mrg    search context.  If INITIALIZE_STACK is nonzero, there is an
   1511  1.1  mrg    element on the stack.  */
   1512  1.1  mrg 
   1513  1.1  mrg depth_first_search::depth_first_search () :
   1514  1.1  mrg   m_stack (n_basic_blocks_for_fn (cfun)),
   1515  1.1  mrg   m_visited_blocks (last_basic_block_for_fn (cfun))
   1516  1.1  mrg {
   1517  1.1  mrg   bitmap_clear (m_visited_blocks);
   1518  1.1  mrg }
   1519  1.1  mrg 
   1520  1.1  mrg /* Add the specified basic block to the top of the dfs data
   1521  1.1  mrg    structures.  When the search continues, it will start at the
   1522  1.1  mrg    block.  */
   1523  1.1  mrg 
   1524  1.1  mrg void
   1525  1.1  mrg depth_first_search::add_bb (basic_block bb)
   1526  1.1  mrg {
   1527  1.1  mrg   m_stack.quick_push (bb);
   1528  1.1  mrg   bitmap_set_bit (m_visited_blocks, bb->index);
   1529  1.1  mrg }
   1530  1.1  mrg 
   1531  1.1  mrg /* Continue the depth-first search through the reverse graph starting with the
   1532  1.1  mrg    block at the stack's top and ending when the stack is empty.  Visited nodes
   1533  1.1  mrg    are marked.  Returns an unvisited basic block, or NULL if there is none
   1534  1.1  mrg    available.  */
   1535  1.1  mrg 
   1536  1.1  mrg basic_block
   1537  1.1  mrg depth_first_search::execute (basic_block last_unvisited)
   1538  1.1  mrg {
   1539  1.1  mrg   basic_block bb;
   1540  1.1  mrg   edge e;
   1541  1.1  mrg   edge_iterator ei;
   1542  1.1  mrg 
   1543  1.1  mrg   while (!m_stack.is_empty ())
   1544  1.1  mrg     {
   1545  1.1  mrg       bb = m_stack.pop ();
   1546  1.1  mrg 
   1547  1.1  mrg       /* Perform depth-first search on adjacent vertices.  */
   1548  1.1  mrg       FOR_EACH_EDGE (e, ei, bb->preds)
   1549  1.1  mrg 	if (!bitmap_bit_p (m_visited_blocks, e->src->index))
   1550  1.1  mrg 	  add_bb (e->src);
   1551  1.1  mrg     }
   1552  1.1  mrg 
   1553  1.1  mrg   /* Determine if there are unvisited basic blocks.  */
   1554  1.1  mrg   FOR_BB_BETWEEN (bb, last_unvisited, NULL, prev_bb)
   1555  1.1  mrg     if (!bitmap_bit_p (m_visited_blocks, bb->index))
   1556  1.1  mrg       return bb;
   1557  1.1  mrg 
   1558  1.1  mrg   return NULL;
   1559  1.1  mrg }
   1560  1.1  mrg 
   1561  1.1  mrg /* Performs dfs search from BB over vertices satisfying PREDICATE;
   1562  1.1  mrg    if REVERSE, go against direction of edges.  Returns number of blocks
   1563  1.1  mrg    found and their list in RSLT.  RSLT can contain at most RSLT_MAX items.  */
   1564  1.1  mrg int
   1565  1.1  mrg dfs_enumerate_from (basic_block bb, int reverse,
   1566  1.1  mrg 		    bool (*predicate) (const_basic_block, const void *),
   1567  1.1  mrg 		    basic_block *rslt, int rslt_max, const void *data)
   1568  1.1  mrg {
   1569  1.1  mrg   basic_block *st, lbb;
   1570  1.1  mrg   int sp = 0, tv = 0;
   1571  1.1  mrg 
   1572  1.1  mrg   auto_bb_flag visited (cfun);
   1573  1.1  mrg 
   1574  1.1  mrg #define MARK_VISITED(BB) ((BB)->flags |= visited)
   1575  1.1  mrg #define UNMARK_VISITED(BB) ((BB)->flags &= ~visited)
   1576  1.1  mrg #define VISITED_P(BB) (((BB)->flags & visited) != 0)
   1577  1.1  mrg 
   1578  1.1  mrg   st = XNEWVEC (basic_block, rslt_max);
   1579  1.1  mrg   rslt[tv++] = st[sp++] = bb;
   1580  1.1  mrg   MARK_VISITED (bb);
   1581  1.1  mrg   while (sp)
   1582  1.1  mrg     {
   1583  1.1  mrg       edge e;
   1584  1.1  mrg       edge_iterator ei;
   1585  1.1  mrg       lbb = st[--sp];
   1586  1.1  mrg       if (reverse)
   1587  1.1  mrg 	{
   1588  1.1  mrg 	  FOR_EACH_EDGE (e, ei, lbb->preds)
   1589  1.1  mrg 	    if (!VISITED_P (e->src) && predicate (e->src, data))
   1590  1.1  mrg 	      {
   1591  1.1  mrg 		gcc_assert (tv != rslt_max);
   1592  1.1  mrg 		rslt[tv++] = st[sp++] = e->src;
   1593  1.1  mrg 		MARK_VISITED (e->src);
   1594  1.1  mrg 	      }
   1595  1.1  mrg 	}
   1596  1.1  mrg       else
   1597  1.1  mrg 	{
   1598  1.1  mrg 	  FOR_EACH_EDGE (e, ei, lbb->succs)
   1599  1.1  mrg 	    if (!VISITED_P (e->dest) && predicate (e->dest, data))
   1600  1.1  mrg 	      {
   1601  1.1  mrg 		gcc_assert (tv != rslt_max);
   1602  1.1  mrg 		rslt[tv++] = st[sp++] = e->dest;
   1603  1.1  mrg 		MARK_VISITED (e->dest);
   1604  1.1  mrg 	      }
   1605  1.1  mrg 	}
   1606  1.1  mrg     }
   1607  1.1  mrg   free (st);
   1608  1.1  mrg   for (sp = 0; sp < tv; sp++)
   1609  1.1  mrg     UNMARK_VISITED (rslt[sp]);
   1610  1.1  mrg   return tv;
   1611  1.1  mrg #undef MARK_VISITED
   1612  1.1  mrg #undef UNMARK_VISITED
   1613  1.1  mrg #undef VISITED_P
   1614  1.1  mrg }
   1615  1.1  mrg 
   1616  1.1  mrg 
   1617  1.1  mrg /* Compute dominance frontiers, ala Harvey, Ferrante, et al.
   1618  1.1  mrg 
   1619  1.1  mrg    This algorithm can be found in Timothy Harvey's PhD thesis, at
   1620  1.1  mrg    http://www.cs.rice.edu/~harv/dissertation.pdf in the section on iterative
   1621  1.1  mrg    dominance algorithms.
   1622  1.1  mrg 
   1623  1.1  mrg    First, we identify each join point, j (any node with more than one
   1624  1.1  mrg    incoming edge is a join point).
   1625  1.1  mrg 
   1626  1.1  mrg    We then examine each predecessor, p, of j and walk up the dominator tree
   1627  1.1  mrg    starting at p.
   1628  1.1  mrg 
   1629  1.1  mrg    We stop the walk when we reach j's immediate dominator - j is in the
   1630  1.1  mrg    dominance frontier of each of  the nodes in the walk, except for j's
   1631  1.1  mrg    immediate dominator. Intuitively, all of the rest of j's dominators are
   1632  1.1  mrg    shared by j's predecessors as well.
   1633  1.1  mrg    Since they dominate j, they will not have j in their dominance frontiers.
   1634  1.1  mrg 
   1635  1.1  mrg    The number of nodes touched by this algorithm is equal to the size
   1636  1.1  mrg    of the dominance frontiers, no more, no less.
   1637  1.1  mrg */
   1638  1.1  mrg 
   1639  1.1  mrg void
   1640  1.1  mrg compute_dominance_frontiers (bitmap_head *frontiers)
   1641  1.1  mrg {
   1642  1.1  mrg   timevar_push (TV_DOM_FRONTIERS);
   1643  1.1  mrg 
   1644  1.1  mrg   edge p;
   1645  1.1  mrg   edge_iterator ei;
   1646  1.1  mrg   basic_block b;
   1647  1.1  mrg   FOR_EACH_BB_FN (b, cfun)
   1648  1.1  mrg     {
   1649  1.1  mrg       if (EDGE_COUNT (b->preds) >= 2)
   1650  1.1  mrg 	{
   1651  1.1  mrg 	  basic_block domsb = get_immediate_dominator (CDI_DOMINATORS, b);
   1652  1.1  mrg 	  FOR_EACH_EDGE (p, ei, b->preds)
   1653  1.1  mrg 	    {
   1654  1.1  mrg 	      basic_block runner = p->src;
   1655  1.1  mrg 	      if (runner == ENTRY_BLOCK_PTR_FOR_FN (cfun))
   1656  1.1  mrg 		continue;
   1657  1.1  mrg 
   1658  1.1  mrg 	      while (runner != domsb)
   1659  1.1  mrg 		{
   1660  1.1  mrg 		  if (!bitmap_set_bit (&frontiers[runner->index], b->index))
   1661  1.1  mrg 		    break;
   1662  1.1  mrg 		  runner = get_immediate_dominator (CDI_DOMINATORS, runner);
   1663  1.1  mrg 		}
   1664  1.1  mrg 	    }
   1665  1.1  mrg 	}
   1666  1.1  mrg     }
   1667  1.1  mrg 
   1668  1.1  mrg   timevar_pop (TV_DOM_FRONTIERS);
   1669  1.1  mrg }
   1670  1.1  mrg 
   1671  1.1  mrg /* Given a set of blocks with variable definitions (DEF_BLOCKS),
   1672  1.1  mrg    return a bitmap with all the blocks in the iterated dominance
   1673  1.1  mrg    frontier of the blocks in DEF_BLOCKS.  DFS contains dominance
   1674  1.1  mrg    frontier information as returned by compute_dominance_frontiers.
   1675  1.1  mrg 
   1676  1.1  mrg    The resulting set of blocks are the potential sites where PHI nodes
   1677  1.1  mrg    are needed.  The caller is responsible for freeing the memory
   1678  1.1  mrg    allocated for the return value.  */
   1679  1.1  mrg 
   1680  1.1  mrg bitmap
   1681  1.1  mrg compute_idf (bitmap def_blocks, bitmap_head *dfs)
   1682  1.1  mrg {
   1683  1.1  mrg   bitmap_iterator bi;
   1684  1.1  mrg   unsigned bb_index, i;
   1685  1.1  mrg   bitmap phi_insertion_points;
   1686  1.1  mrg 
   1687  1.1  mrg   phi_insertion_points = BITMAP_ALLOC (NULL);
   1688  1.1  mrg 
   1689  1.1  mrg   /* Seed the work set with all the blocks in DEF_BLOCKS.  */
   1690  1.1  mrg   auto_bitmap work_set;
   1691  1.1  mrg   bitmap_copy (work_set, def_blocks);
   1692  1.1  mrg   bitmap_tree_view (work_set);
   1693  1.1  mrg 
   1694  1.1  mrg   /* Pop a block off the workset, add every block that appears in
   1695  1.1  mrg      the original block's DF that we have not already processed to
   1696  1.1  mrg      the workset.  Iterate until the workset is empty.   Blocks
   1697  1.1  mrg      which are added to the workset are potential sites for
   1698  1.1  mrg      PHI nodes.  */
   1699  1.1  mrg   while (!bitmap_empty_p (work_set))
   1700  1.1  mrg     {
   1701  1.1  mrg       /* The dominance frontier of a block is blocks after it so iterating
   1702  1.1  mrg          on earlier blocks first is better.
   1703  1.1  mrg 	 ???  Basic blocks are by no means guaranteed to be ordered in
   1704  1.1  mrg 	 optimal order for this iteration.  */
   1705  1.1  mrg       bb_index = bitmap_first_set_bit (work_set);
   1706  1.1  mrg       bitmap_clear_bit (work_set, bb_index);
   1707  1.1  mrg 
   1708  1.1  mrg       /* Since the registration of NEW -> OLD name mappings is done
   1709  1.1  mrg 	 separately from the call to update_ssa, when updating the SSA
   1710  1.1  mrg 	 form, the basic blocks where new and/or old names are defined
   1711  1.1  mrg 	 may have disappeared by CFG cleanup calls.  In this case,
   1712  1.1  mrg 	 we may pull a non-existing block from the work stack.  */
   1713  1.1  mrg       gcc_checking_assert (bb_index
   1714  1.1  mrg 			   < (unsigned) last_basic_block_for_fn (cfun));
   1715  1.1  mrg 
   1716  1.1  mrg       EXECUTE_IF_AND_COMPL_IN_BITMAP (&dfs[bb_index], phi_insertion_points,
   1717  1.1  mrg 	                              0, i, bi)
   1718  1.1  mrg 	{
   1719  1.1  mrg 	  bitmap_set_bit (work_set, i);
   1720  1.1  mrg 	  bitmap_set_bit (phi_insertion_points, i);
   1721  1.1  mrg 	}
   1722  1.1  mrg     }
   1723  1.1  mrg 
   1724  1.1  mrg   return phi_insertion_points;
   1725  1.1  mrg }
   1726  1.1  mrg 
   1727  1.1  mrg /* Intersection and union of preds/succs for sbitmap based data flow
   1728  1.1  mrg    solvers.  All four functions defined below take the same arguments:
   1729  1.1  mrg    B is the basic block to perform the operation for.  DST is the
   1730  1.1  mrg    target sbitmap, i.e. the result.  SRC is an sbitmap vector of size
   1731  1.1  mrg    last_basic_block so that it can be indexed with basic block indices.
   1732  1.1  mrg    DST may be (but does not have to be) SRC[B->index].  */
   1733  1.1  mrg 
   1734  1.1  mrg /* Set the bitmap DST to the intersection of SRC of successors of
   1735  1.1  mrg    basic block B.  */
   1736  1.1  mrg 
   1737  1.1  mrg void
   1738  1.1  mrg bitmap_intersection_of_succs (sbitmap dst, sbitmap *src, basic_block b)
   1739  1.1  mrg {
   1740  1.1  mrg   unsigned int set_size = dst->size;
   1741  1.1  mrg   edge e;
   1742  1.1  mrg   unsigned ix;
   1743  1.1  mrg 
   1744  1.1  mrg   for (e = NULL, ix = 0; ix < EDGE_COUNT (b->succs); ix++)
   1745  1.1  mrg     {
   1746  1.1  mrg       e = EDGE_SUCC (b, ix);
   1747  1.1  mrg       if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
   1748  1.1  mrg 	continue;
   1749  1.1  mrg 
   1750  1.1  mrg       bitmap_copy (dst, src[e->dest->index]);
   1751  1.1  mrg       break;
   1752  1.1  mrg     }
   1753  1.1  mrg 
   1754  1.1  mrg   if (e == 0)
   1755  1.1  mrg     bitmap_ones (dst);
   1756  1.1  mrg   else
   1757  1.1  mrg     for (++ix; ix < EDGE_COUNT (b->succs); ix++)
   1758  1.1  mrg       {
   1759  1.1  mrg 	unsigned int i;
   1760  1.1  mrg 	SBITMAP_ELT_TYPE *p, *r;
   1761  1.1  mrg 
   1762  1.1  mrg 	e = EDGE_SUCC (b, ix);
   1763  1.1  mrg 	if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
   1764  1.1  mrg 	  continue;
   1765  1.1  mrg 
   1766  1.1  mrg 	p = src[e->dest->index]->elms;
   1767  1.1  mrg 	r = dst->elms;
   1768  1.1  mrg 	for (i = 0; i < set_size; i++)
   1769  1.1  mrg 	  *r++ &= *p++;
   1770  1.1  mrg       }
   1771  1.1  mrg }
   1772  1.1  mrg 
   1773  1.1  mrg /* Set the bitmap DST to the intersection of SRC of predecessors of
   1774  1.1  mrg    basic block B.  */
   1775  1.1  mrg 
   1776  1.1  mrg void
   1777  1.1  mrg bitmap_intersection_of_preds (sbitmap dst, sbitmap *src, basic_block b)
   1778  1.1  mrg {
   1779  1.1  mrg   unsigned int set_size = dst->size;
   1780  1.1  mrg   edge e;
   1781  1.1  mrg   unsigned ix;
   1782  1.1  mrg 
   1783  1.1  mrg   for (e = NULL, ix = 0; ix < EDGE_COUNT (b->preds); ix++)
   1784  1.1  mrg     {
   1785  1.1  mrg       e = EDGE_PRED (b, ix);
   1786  1.1  mrg       if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
   1787  1.1  mrg 	continue;
   1788  1.1  mrg 
   1789  1.1  mrg       bitmap_copy (dst, src[e->src->index]);
   1790  1.1  mrg       break;
   1791  1.1  mrg     }
   1792  1.1  mrg 
   1793  1.1  mrg   if (e == 0)
   1794  1.1  mrg     bitmap_ones (dst);
   1795  1.1  mrg   else
   1796  1.1  mrg     for (++ix; ix < EDGE_COUNT (b->preds); ix++)
   1797  1.1  mrg       {
   1798  1.1  mrg 	unsigned int i;
   1799  1.1  mrg 	SBITMAP_ELT_TYPE *p, *r;
   1800  1.1  mrg 
   1801  1.1  mrg 	e = EDGE_PRED (b, ix);
   1802  1.1  mrg 	if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
   1803  1.1  mrg 	  continue;
   1804  1.1  mrg 
   1805  1.1  mrg 	p = src[e->src->index]->elms;
   1806  1.1  mrg 	r = dst->elms;
   1807  1.1  mrg 	for (i = 0; i < set_size; i++)
   1808  1.1  mrg 	  *r++ &= *p++;
   1809  1.1  mrg       }
   1810  1.1  mrg }
   1811  1.1  mrg 
   1812  1.1  mrg /* Set the bitmap DST to the union of SRC of successors of
   1813  1.1  mrg    basic block B.  */
   1814  1.1  mrg 
   1815  1.1  mrg void
   1816  1.1  mrg bitmap_union_of_succs (sbitmap dst, sbitmap *src, basic_block b)
   1817  1.1  mrg {
   1818  1.1  mrg   unsigned int set_size = dst->size;
   1819  1.1  mrg   edge e;
   1820  1.1  mrg   unsigned ix;
   1821  1.1  mrg 
   1822  1.1  mrg   for (ix = 0; ix < EDGE_COUNT (b->succs); ix++)
   1823  1.1  mrg     {
   1824  1.1  mrg       e = EDGE_SUCC (b, ix);
   1825  1.1  mrg       if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
   1826  1.1  mrg 	continue;
   1827  1.1  mrg 
   1828  1.1  mrg       bitmap_copy (dst, src[e->dest->index]);
   1829  1.1  mrg       break;
   1830  1.1  mrg     }
   1831  1.1  mrg 
   1832  1.1  mrg   if (ix == EDGE_COUNT (b->succs))
   1833  1.1  mrg     bitmap_clear (dst);
   1834  1.1  mrg   else
   1835  1.1  mrg     for (ix++; ix < EDGE_COUNT (b->succs); ix++)
   1836  1.1  mrg       {
   1837  1.1  mrg 	unsigned int i;
   1838  1.1  mrg 	SBITMAP_ELT_TYPE *p, *r;
   1839  1.1  mrg 
   1840  1.1  mrg 	e = EDGE_SUCC (b, ix);
   1841  1.1  mrg 	if (e->dest == EXIT_BLOCK_PTR_FOR_FN (cfun))
   1842  1.1  mrg 	  continue;
   1843  1.1  mrg 
   1844  1.1  mrg 	p = src[e->dest->index]->elms;
   1845  1.1  mrg 	r = dst->elms;
   1846  1.1  mrg 	for (i = 0; i < set_size; i++)
   1847  1.1  mrg 	  *r++ |= *p++;
   1848  1.1  mrg       }
   1849  1.1  mrg }
   1850  1.1  mrg 
   1851  1.1  mrg /* Set the bitmap DST to the union of SRC of predecessors of
   1852  1.1  mrg    basic block B.  */
   1853  1.1  mrg 
   1854  1.1  mrg void
   1855  1.1  mrg bitmap_union_of_preds (sbitmap dst, sbitmap *src, basic_block b)
   1856  1.1  mrg {
   1857  1.1  mrg   unsigned int set_size = dst->size;
   1858  1.1  mrg   edge e;
   1859  1.1  mrg   unsigned ix;
   1860  1.1  mrg 
   1861  1.1  mrg   for (ix = 0; ix < EDGE_COUNT (b->preds); ix++)
   1862  1.1  mrg     {
   1863  1.1  mrg       e = EDGE_PRED (b, ix);
   1864  1.1  mrg       if (e->src== ENTRY_BLOCK_PTR_FOR_FN (cfun))
   1865  1.1  mrg 	continue;
   1866  1.1  mrg 
   1867  1.1  mrg       bitmap_copy (dst, src[e->src->index]);
   1868  1.1  mrg       break;
   1869  1.1  mrg     }
   1870  1.1  mrg 
   1871  1.1  mrg   if (ix == EDGE_COUNT (b->preds))
   1872  1.1  mrg     bitmap_clear (dst);
   1873  1.1  mrg   else
   1874  1.1  mrg     for (ix++; ix < EDGE_COUNT (b->preds); ix++)
   1875  1.1  mrg       {
   1876  1.1  mrg 	unsigned int i;
   1877  1.1  mrg 	SBITMAP_ELT_TYPE *p, *r;
   1878  1.1  mrg 
   1879  1.1  mrg 	e = EDGE_PRED (b, ix);
   1880  1.1  mrg 	if (e->src == ENTRY_BLOCK_PTR_FOR_FN (cfun))
   1881  1.1  mrg 	  continue;
   1882  1.1  mrg 
   1883  1.1  mrg 	p = src[e->src->index]->elms;
   1884  1.1  mrg 	r = dst->elms;
   1885  1.1  mrg 	for (i = 0; i < set_size; i++)
   1886  1.1  mrg 	  *r++ |= *p++;
   1887  1.1  mrg       }
   1888  1.1  mrg }
   1889  1.1  mrg 
   1890  1.1  mrg /* Returns the list of basic blocks in the function in an order that guarantees
   1891  1.1  mrg    that if a block X has just a single predecessor Y, then Y is after X in the
   1892  1.1  mrg    ordering.  */
   1893  1.1  mrg 
   1894  1.1  mrg basic_block *
   1895  1.1  mrg single_pred_before_succ_order (void)
   1896  1.1  mrg {
   1897  1.1  mrg   basic_block x, y;
   1898  1.1  mrg   basic_block *order = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
   1899  1.1  mrg   unsigned n = n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS;
   1900  1.1  mrg   unsigned np, i;
   1901  1.1  mrg   auto_sbitmap visited (last_basic_block_for_fn (cfun));
   1902  1.1  mrg 
   1903  1.1  mrg #define MARK_VISITED(BB) (bitmap_set_bit (visited, (BB)->index))
   1904  1.1  mrg #define VISITED_P(BB) (bitmap_bit_p (visited, (BB)->index))
   1905  1.1  mrg 
   1906  1.1  mrg   bitmap_clear (visited);
   1907  1.1  mrg 
   1908  1.1  mrg   MARK_VISITED (ENTRY_BLOCK_PTR_FOR_FN (cfun));
   1909  1.1  mrg   FOR_EACH_BB_FN (x, cfun)
   1910  1.1  mrg     {
   1911  1.1  mrg       if (VISITED_P (x))
   1912  1.1  mrg 	continue;
   1913  1.1  mrg 
   1914  1.1  mrg       /* Walk the predecessors of x as long as they have precisely one
   1915  1.1  mrg 	 predecessor and add them to the list, so that they get stored
   1916  1.1  mrg 	 after x.  */
   1917  1.1  mrg       for (y = x, np = 1;
   1918  1.1  mrg 	   single_pred_p (y) && !VISITED_P (single_pred (y));
   1919  1.1  mrg 	   y = single_pred (y))
   1920  1.1  mrg 	np++;
   1921  1.1  mrg       for (y = x, i = n - np;
   1922  1.1  mrg 	   single_pred_p (y) && !VISITED_P (single_pred (y));
   1923  1.1  mrg 	   y = single_pred (y), i++)
   1924  1.1  mrg 	{
   1925  1.1  mrg 	  order[i] = y;
   1926  1.1  mrg 	  MARK_VISITED (y);
   1927  1.1  mrg 	}
   1928  1.1  mrg       order[i] = y;
   1929  1.1  mrg       MARK_VISITED (y);
   1930  1.1  mrg 
   1931  1.1  mrg       gcc_assert (i == n - 1);
   1932  1.1  mrg       n -= np;
   1933  1.1  mrg     }
   1934  1.1  mrg 
   1935  1.1  mrg   gcc_assert (n == 0);
   1936  1.1  mrg   return order;
   1937  1.1  mrg 
   1938  1.1  mrg #undef MARK_VISITED
   1939  1.1  mrg #undef VISITED_P
   1940  1.1  mrg }
   1941  1.1  mrg 
   1942  1.1  mrg /* Ignoring loop backedges, if BB has precisely one incoming edge then
   1943  1.1  mrg    return that edge.  Otherwise return NULL.
   1944  1.1  mrg 
   1945  1.1  mrg    When IGNORE_NOT_EXECUTABLE is true, also ignore edges that are not marked
   1946  1.1  mrg    as executable.  */
   1947  1.1  mrg 
   1948  1.1  mrg edge
   1949  1.1  mrg single_pred_edge_ignoring_loop_edges (basic_block bb,
   1950  1.1  mrg 				      bool ignore_not_executable)
   1951  1.1  mrg {
   1952  1.1  mrg   edge retval = NULL;
   1953  1.1  mrg   edge e;
   1954  1.1  mrg   edge_iterator ei;
   1955  1.1  mrg 
   1956  1.1  mrg   FOR_EACH_EDGE (e, ei, bb->preds)
   1957  1.1  mrg     {
   1958  1.1  mrg       /* A loop back edge can be identified by the destination of
   1959  1.1  mrg 	 the edge dominating the source of the edge.  */
   1960  1.1  mrg       if (dominated_by_p (CDI_DOMINATORS, e->src, e->dest))
   1961  1.1  mrg 	continue;
   1962  1.1  mrg 
   1963  1.1  mrg       /* We can safely ignore edges that are not executable.  */
   1964  1.1  mrg       if (ignore_not_executable
   1965  1.1  mrg 	  && (e->flags & EDGE_EXECUTABLE) == 0)
   1966  1.1  mrg 	continue;
   1967  1.1  mrg 
   1968  1.1  mrg       /* If we have already seen a non-loop edge, then we must have
   1969  1.1  mrg 	 multiple incoming non-loop edges and thus we return NULL.  */
   1970  1.1  mrg       if (retval)
   1971  1.1  mrg 	return NULL;
   1972  1.1  mrg 
   1973  1.1  mrg       /* This is the first non-loop incoming edge we have found.  Record
   1974  1.1  mrg 	 it.  */
   1975  1.1  mrg       retval = e;
   1976               }
   1977           
   1978             return retval;
   1979           }
   1980