LCOV - code coverage report
Current view: top level - gcc - dominance.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 91.2 % 705 643
Test Date: 2026-04-20 14:57:17 Functions: 90.7 % 54 49
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Calculate (post)dominators in slightly super-linear time.
       2              :    Copyright (C) 2000-2026 Free Software Foundation, Inc.
       3              :    Contributed by Michael Matz (matz@ifh.de).
       4              : 
       5              :    This file is part of GCC.
       6              : 
       7              :    GCC is free software; you can redistribute it and/or modify it
       8              :    under the terms of the GNU General Public License as published by
       9              :    the Free Software Foundation; either version 3, or (at your option)
      10              :    any later version.
      11              : 
      12              :    GCC is distributed in the hope that it will be useful, but WITHOUT
      13              :    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
      14              :    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
      15              :    License for more details.
      16              : 
      17              :    You should have received a copy of the GNU General Public License
      18              :    along with GCC; see the file COPYING3.  If not see
      19              :    <http://www.gnu.org/licenses/>.  */
      20              : 
      21              : /* This file implements the well known algorithm from Lengauer and Tarjan
      22              :    to compute the dominators in a control flow graph.  A basic block D is said
      23              :    to dominate another block X, when all paths from the entry node of the CFG
      24              :    to X go also over D.  The dominance relation is a transitive reflexive
      25              :    relation and its minimal transitive reduction is a tree, called the
      26              :    dominator tree.  So for each block X besides the entry block exists a
      27              :    block I(X), called the immediate dominator of X, which is the parent of X
      28              :    in the dominator tree.
      29              : 
      30              :    The algorithm computes this dominator tree implicitly by computing for
      31              :    each block its immediate dominator.  We use tree balancing and path
      32              :    compression, so it's the O(e*a(e,v)) variant, where a(e,v) is the very
      33              :    slowly growing functional inverse of the Ackerman function.  */
      34              : 
      35              : #include "config.h"
      36              : #include "system.h"
      37              : #include "coretypes.h"
      38              : #include "backend.h"
      39              : #include "timevar.h"
      40              : #include "diagnostic-core.h"
      41              : #include "cfganal.h"
      42              : #include "et-forest.h"
      43              : #include "graphds.h"
      44              : 
      45              : /* We name our nodes with integers, beginning with 1.  Zero is reserved for
      46              :    'undefined' or 'end of list'.  The name of each node is given by the dfs
      47              :    number of the corresponding basic block.  Please note, that we include the
      48              :    artificial ENTRY_BLOCK (or EXIT_BLOCK in the post-dom case) in our lists to
      49              :    support multiple entry points.  Its dfs number is of course 1.  */
      50              : 
      51              : /* Type of Basic Block aka. TBB */
      52              : typedef unsigned int TBB;
      53              : 
      54              : namespace {
      55              : 
      56              : /* This class holds various arrays reflecting the (sub)structure of the
      57              :    flowgraph.  Most of them are of type TBB and are also indexed by TBB.  */
      58              : 
      59              : class dom_info
      60              : {
      61              : public:
      62              :   dom_info (function *, cdi_direction);
      63              :   dom_info (vec <basic_block>, cdi_direction);
      64              :   ~dom_info ();
      65              :   void calc_dfs_tree ();
      66              :   void calc_idoms ();
      67              : 
      68              :   inline basic_block get_idom (basic_block);
      69              : private:
      70              :   void calc_dfs_tree_nonrec (basic_block);
      71              :   void compress (TBB);
      72              :   void dom_init (void);
      73              :   TBB eval (TBB);
      74              :   void link_roots (TBB, TBB);
      75              : 
      76              :   /* The parent of a node in the DFS tree.  */
      77              :   TBB *m_dfs_parent;
      78              :   /* For a node x m_key[x] is roughly the node nearest to the root from which
      79              :      exists a way to x only over nodes behind x.  Such a node is also called
      80              :      semidominator.  */
      81              :   TBB *m_key;
      82              :   /* The value in m_path_min[x] is the node y on the path from x to the root of
      83              :      the tree x is in with the smallest m_key[y].  */
      84              :   TBB *m_path_min;
      85              :   /* m_bucket[x] points to the first node of the set of nodes having x as
      86              :      key.  */
      87              :   TBB *m_bucket;
      88              :   /* And m_next_bucket[x] points to the next node.  */
      89              :   TBB *m_next_bucket;
      90              :   /* After the algorithm is done, m_dom[x] contains the immediate dominator
      91              :      of x.  */
      92              :   TBB *m_dom;
      93              : 
      94              :   /* The following few fields implement the structures needed for disjoint
      95              :      sets.  */
      96              :   /* m_set_chain[x] is the next node on the path from x to the representative
      97              :      of the set containing x.  If m_set_chain[x]==0 then x is a root.  */
      98              :   TBB *m_set_chain;
      99              :   /* m_set_size[x] is the number of elements in the set named by x.  */
     100              :   unsigned int *m_set_size;
     101              :   /* m_set_child[x] is used for balancing the tree representing a set.  It can
     102              :      be understood as the next sibling of x.  */
     103              :   TBB *m_set_child;
     104              : 
     105              :   /* If b is the number of a basic block (BB->index), m_dfs_order[b] is the
     106              :      number of that node in DFS order counted from 1.  This is an index
     107              :      into most of the other arrays in this structure.  */
     108              :   TBB *m_dfs_order;
     109              :   /* Points to last element in m_dfs_order array.  */
     110              :   TBB *m_dfs_last;
     111              :   /* If x is the DFS-index of a node which corresponds with a basic block,
     112              :      m_dfs_to_bb[x] is that basic block.  Note, that in our structure there are
     113              :      more nodes that basic blocks, so only
     114              :      m_dfs_to_bb[m_dfs_order[bb->index]]==bb is true for every basic block bb,
     115              :      but not the opposite.  */
     116              :   basic_block *m_dfs_to_bb;
     117              : 
     118              :   /* This is the next free DFS number when creating the DFS tree.  */
     119              :   unsigned int m_dfsnum;
     120              :   /* The number of nodes in the DFS tree (==m_dfsnum-1).  */
     121              :   unsigned int m_nodes;
     122              : 
     123              :   /* Blocks with bits set here have a fake edge to EXIT.  These are used
     124              :      to turn a DFS forest into a proper tree.  */
     125              :   bitmap m_fake_exit_edge;
     126              : 
     127              :   /* Number of basic blocks in the function being compiled.  */
     128              :   unsigned m_n_basic_blocks;
     129              : 
     130              :   /* True, if we are computing postdominators (rather than dominators).  */
     131              :   bool m_reverse;
     132              : 
     133              :   /* Start block (the entry block for forward problem, exit block for backward
     134              :      problem).  */
     135              :   basic_block m_start_block;
     136              :   /* Ending block.  */
     137              :   basic_block m_end_block;
     138              : };
     139              : 
     140              : } // anonymous namespace
     141              : 
     142              : void debug_dominance_info (cdi_direction);
     143              : void debug_dominance_tree (cdi_direction, basic_block);
     144              : 
     145              : /* Allocate and zero-initialize NUM elements of type T (T must be a
     146              :    POD-type).  Note: after transition to C++11 or later,
     147              :    `x = new_zero_array <T> (num);' can be replaced with
     148              :    `x = new T[num] {};'.  */
     149              : 
     150              : template<typename T>
     151   8109558432 : inline T *new_zero_array (unsigned num)
     152              : {
     153   8109558432 :   T *result = new T[num];
     154   8109558432 :   memset (result, 0, sizeof (T) * num);
     155   8109558432 :   return result;
     156              : }
     157              : 
     158              : /* Helper function for constructors to initialize a part of class members.  */
     159              : 
     160              : void
     161   1013694804 : dom_info::dom_init (void)
     162              : {
     163   1013694804 :   unsigned num = m_n_basic_blocks;
     164              : 
     165   1013694804 :   m_dfs_parent = new_zero_array <TBB> (num);
     166   1013694804 :   m_dom = new_zero_array <TBB> (num);
     167              : 
     168   1013694804 :   m_path_min = new TBB[num];
     169   1013694804 :   m_key = new TBB[num];
     170   1013694804 :   m_set_size = new unsigned int[num];
     171  12406246795 :   for (unsigned i = 0; i < num; i++)
     172              :     {
     173  11392551991 :       m_path_min[i] = m_key[i] = i;
     174  11392551991 :       m_set_size[i] = 1;
     175              :     }
     176              : 
     177   1013694804 :   m_bucket = new_zero_array <TBB> (num);
     178   1013694804 :   m_next_bucket = new_zero_array <TBB> (num);
     179              : 
     180   1013694804 :   m_set_chain = new_zero_array <TBB> (num);
     181   1013694804 :   m_set_child = new_zero_array <TBB> (num);
     182              : 
     183   1013694804 :   m_dfs_to_bb = new_zero_array <basic_block> (num);
     184              : 
     185   1013694804 :   m_dfsnum = 1;
     186   1013694804 :   m_nodes = 0;
     187   1013694804 : }
     188              : 
     189              : /* Allocate all needed memory in a pessimistic fashion (so we round up).  */
     190              : 
     191   1013654564 : dom_info::dom_info (function *fn, cdi_direction dir)
     192              : {
     193   1013654564 :   m_n_basic_blocks = n_basic_blocks_for_fn (fn);
     194              : 
     195   1013654564 :   dom_init ();
     196              : 
     197   1013654564 :   unsigned last_bb_index = last_basic_block_for_fn (fn);
     198   1013654564 :   m_dfs_order = new_zero_array <TBB> (last_bb_index + 1);
     199   1013654564 :   m_dfs_last = &m_dfs_order[last_bb_index];
     200              : 
     201   1013654564 :   switch (dir)
     202              :     {
     203    987468030 :       case CDI_DOMINATORS:
     204    987468030 :         m_reverse = false;
     205    987468030 :         m_fake_exit_edge = NULL;
     206    987468030 :         m_start_block = ENTRY_BLOCK_PTR_FOR_FN (fn);
     207    987468030 :         m_end_block = EXIT_BLOCK_PTR_FOR_FN (fn);
     208    987468030 :         break;
     209     26186534 :       case CDI_POST_DOMINATORS:
     210     26186534 :         m_reverse = true;
     211     26186534 :         m_fake_exit_edge = BITMAP_ALLOC (NULL);
     212     26186534 :         m_start_block = EXIT_BLOCK_PTR_FOR_FN (fn);
     213     26186534 :         m_end_block = ENTRY_BLOCK_PTR_FOR_FN (fn);
     214     26186534 :         break;
     215            0 :       default:
     216            0 :         gcc_unreachable ();
     217              :     }
     218   1013654564 : }
     219              : 
     220              : /* Constructor for reducible region REGION.  */
     221              : 
     222        40240 : dom_info::dom_info (vec<basic_block> region, cdi_direction dir)
     223              : {
     224        40240 :   m_n_basic_blocks = region.length ();
     225        40240 :   unsigned nm1 = m_n_basic_blocks - 1;
     226              : 
     227        40240 :   dom_init ();
     228              : 
     229              :   /* Determine max basic block index in region.  */
     230        40240 :   int max_index = region[0]->index;
     231       298436 :   for (unsigned i = 1; i <= nm1; i++)
     232       258196 :     if (region[i]->index > max_index)
     233              :       max_index = region[i]->index;
     234        40240 :   max_index += 1;  /* set index on the first bb out of region.  */
     235              : 
     236        40240 :   m_dfs_order = new_zero_array <TBB> (max_index + 1);
     237        40240 :   m_dfs_last = &m_dfs_order[max_index];
     238              : 
     239        40240 :   m_fake_exit_edge = NULL; /* Assume that region is reducible.  */
     240              : 
     241        40240 :   switch (dir)
     242              :     {
     243            0 :       case CDI_DOMINATORS:
     244            0 :         m_reverse = false;
     245            0 :         m_start_block = region[0];
     246            0 :         m_end_block = region[nm1];
     247            0 :         break;
     248        40240 :       case CDI_POST_DOMINATORS:
     249        40240 :         m_reverse = true;
     250        40240 :         m_start_block = region[nm1];
     251        40240 :         m_end_block = region[0];
     252        40240 :         break;
     253            0 :       default:
     254            0 :         gcc_unreachable ();
     255              :     }
     256        40240 : }
     257              : 
     258              : inline basic_block
     259   9365242863 : dom_info::get_idom (basic_block bb)
     260              : {
     261   9365242863 :   TBB d = m_dom[m_dfs_order[bb->index]];
     262   9365242863 :   return m_dfs_to_bb[d];
     263              : }
     264              : 
     265              : /* Map dominance calculation type to array index used for various
     266              :    dominance information arrays.  This version is simple -- it will need
     267              :    to be modified, obviously, if additional values are added to
     268              :    cdi_direction.  */
     269              : 
     270              : static inline unsigned int
     271  30777858542 : dom_convert_dir_to_idx (cdi_direction dir)
     272              : {
     273  30777858542 :   gcc_checking_assert (dir == CDI_DOMINATORS || dir == CDI_POST_DOMINATORS);
     274  30777858542 :   return dir - 1;
     275              : }
     276              : 
     277              : /* Free all allocated memory in dom_info.  */
     278              : 
     279   1013694804 : dom_info::~dom_info ()
     280              : {
     281   1013694804 :   delete[] m_dfs_parent;
     282   1013694804 :   delete[] m_path_min;
     283   1013694804 :   delete[] m_key;
     284   1013694804 :   delete[] m_dom;
     285   1013694804 :   delete[] m_bucket;
     286   1013694804 :   delete[] m_next_bucket;
     287   1013694804 :   delete[] m_set_chain;
     288   1013694804 :   delete[] m_set_size;
     289   1013694804 :   delete[] m_set_child;
     290   1013694804 :   delete[] m_dfs_order;
     291   1013694804 :   delete[] m_dfs_to_bb;
     292   1013694804 :   BITMAP_FREE (m_fake_exit_edge);
     293   1013694804 : }
     294              : 
     295              : /* The nonrecursive variant of creating a DFS tree.  BB is the starting basic
     296              :    block for this tree and m_reverse is true, if predecessors should be visited
     297              :    instead of successors of a node.  After this is done all nodes reachable
     298              :    from BB were visited, have assigned their dfs number and are linked together
     299              :    to form a tree.  */
     300              : 
     301              : void
     302   1025555581 : dom_info::calc_dfs_tree_nonrec (basic_block bb)
     303              : {
     304   1025555581 :   edge_iterator *stack = new edge_iterator[m_n_basic_blocks + 1];
     305   1025555581 :   int sp = 0;
     306   2013023611 :   unsigned d_i = dom_convert_dir_to_idx (m_reverse ? CDI_POST_DOMINATORS
     307              :                                          : CDI_DOMINATORS);
     308              : 
     309              :   /* Initialize the first edge.  */
     310   1025555581 :   edge_iterator ei = m_reverse ? ei_start (bb->preds)
     311    987468030 :                                : ei_start (bb->succs);
     312              : 
     313              :   /* When the stack is empty we break out of this loop.  */
     314   9353301606 :   while (1)
     315              :     {
     316              :       basic_block bn;
     317              :       edge_iterator einext;
     318              : 
     319              :       /* This loop traverses edges e in depth first manner, and fills the
     320              :          stack.  */
     321  24534211964 :       while (!ei_end_p (ei))
     322              :         {
     323  14155354777 :           edge e = ei_edge (ei);
     324              : 
     325              :           /* Deduce from E the current and the next block (BB and BN), and the
     326              :              next edge.  */
     327  14155354777 :           if (m_reverse)
     328              :             {
     329    326571184 :               bn = e->src;
     330              : 
     331              :               /* If the next node BN is either already visited or a border
     332              :                  block or out of region the current edge is useless, and simply
     333              :                  overwritten with the next edge out of the current node.  */
     334    326571184 :               if (bn == m_end_block || bn->dom[d_i] == NULL
     335    300329614 :                   || m_dfs_order[bn->index])
     336              :                 {
     337    122831144 :                   ei_next (&ei);
     338    122831144 :                   continue;
     339              :                 }
     340    203740040 :               bb = e->dest;
     341    203740040 :               einext = ei_start (bn->preds);
     342              :             }
     343              :           else
     344              :             {
     345  13828783593 :               bn = e->dest;
     346  13828783593 :               if (bn == m_end_block || bn->dom[d_i] == NULL
     347  12853332595 :                   || m_dfs_order[bn->index])
     348              :                 {
     349   4679222027 :                   ei_next (&ei);
     350   4679222027 :                   continue;
     351              :                 }
     352   9149561566 :               bb = e->src;
     353   9149561566 :               einext = ei_start (bn->succs);
     354              :             }
     355              : 
     356   9353301606 :           gcc_assert (bn != m_start_block);
     357              : 
     358              :           /* Fill the DFS tree info calculatable _before_ recursing.  */
     359   9353301606 :           TBB my_i;
     360   9353301606 :           if (bb != m_start_block)
     361   8338114853 :             my_i = m_dfs_order[bb->index];
     362              :           else
     363   1015186753 :             my_i = *m_dfs_last;
     364   9353301606 :           TBB child_i = m_dfs_order[bn->index] = m_dfsnum++;
     365   9353301606 :           m_dfs_to_bb[child_i] = bn;
     366   9353301606 :           m_dfs_parent[child_i] = my_i;
     367              : 
     368              :           /* Save the current point in the CFG on the stack, and recurse.  */
     369   9353301606 :           stack[sp++] = ei;
     370   9353301606 :           ei = einext;
     371              :         }
     372              : 
     373  10378857187 :       if (!sp)
     374              :         break;
     375   9353301606 :       ei = stack[--sp];
     376              : 
     377              :       /* OK.  The edge-list was exhausted, meaning normally we would
     378              :          end the recursion.  After returning from the recursive call,
     379              :          there were (may be) other statements which were run after a
     380              :          child node was completely considered by DFS.  Here is the
     381              :          point to do it in the non-recursive variant.
     382              :          E.g. The block just completed is in e->dest for forward DFS,
     383              :          the block not yet completed (the parent of the one above)
     384              :          in e->src.  This could be used e.g. for computing the number of
     385              :          descendants or the tree depth.  */
     386   9353301606 :       ei_next (&ei);
     387   9353301606 :     }
     388   1025555581 :   delete[] stack;
     389   1025555581 : }
     390              : 
     391              : /* The main entry for calculating the DFS tree or forest.  m_reverse is true,
     392              :    if we are interested in the reverse flow graph.  In that case the result is
     393              :    not necessarily a tree but a forest, because there may be nodes from which
     394              :    the EXIT_BLOCK is unreachable.  */
     395              : 
     396              : void
     397   1013694804 : dom_info::calc_dfs_tree ()
     398              : {
     399   1013694804 :   *m_dfs_last = m_dfsnum;
     400   1013694804 :   m_dfs_to_bb[m_dfsnum] = m_start_block;
     401   1013694804 :   m_dfsnum++;
     402              : 
     403   1013694804 :   calc_dfs_tree_nonrec (m_start_block);
     404              : 
     405   1013694804 :   if (m_fake_exit_edge)
     406              :     {
     407              :       /* In the post-dom case we may have nodes without a path to EXIT_BLOCK.
     408              :          They are reverse-unreachable.  In the dom-case we disallow such
     409              :          nodes, but in post-dom we have to deal with them.
     410              : 
     411              :          There are two situations in which this occurs.  First, noreturn
     412              :          functions.  Second, infinite loops.  In the first case we need to
     413              :          pretend that there is an edge to the exit block.  In the second
     414              :          case, we wind up with a forest.  We need to process all noreturn
     415              :          blocks before we know if we've got any infinite loops.  */
     416              : 
     417     26186534 :       basic_block b;
     418     26186534 :       bool saw_unconnected = false;
     419              : 
     420    241569395 :       FOR_BB_BETWEEN (b, m_start_block->prev_bb, m_end_block, prev_bb)
     421              :         {
     422    215382861 :           if (EDGE_COUNT (b->succs) > 0)
     423              :             {
     424    203617126 :               if (m_dfs_order[b->index] == 0)
     425      1165462 :                 saw_unconnected = true;
     426    203617126 :               continue;
     427              :             }
     428     11765735 :           bitmap_set_bit (m_fake_exit_edge, b->index);
     429     11765735 :           m_dfs_order[b->index] = m_dfsnum;
     430     11765735 :           m_dfs_to_bb[m_dfsnum] = b;
     431     11765735 :           m_dfs_parent[m_dfsnum] = *m_dfs_last;
     432     11765735 :           m_dfsnum++;
     433     11765735 :           calc_dfs_tree_nonrec (b);
     434              :         }
     435              : 
     436     26186534 :       if (saw_unconnected)
     437              :         {
     438      9768556 :           FOR_BB_BETWEEN (b, m_start_block->prev_bb, m_end_block, prev_bb)
     439              :             {
     440      9558047 :               if (m_dfs_order[b->index])
     441      9463005 :                 continue;
     442        95042 :               basic_block b2 = dfs_find_deadend (b);
     443        95042 :               gcc_checking_assert (m_dfs_order[b2->index] == 0);
     444        95042 :               bitmap_set_bit (m_fake_exit_edge, b2->index);
     445        95042 :               m_dfs_order[b2->index] = m_dfsnum;
     446        95042 :               m_dfs_to_bb[m_dfsnum] = b2;
     447        95042 :               m_dfs_parent[m_dfsnum] = *m_dfs_last;
     448        95042 :               m_dfsnum++;
     449        95042 :               calc_dfs_tree_nonrec (b2);
     450        95042 :               gcc_checking_assert (m_dfs_order[b->index]);
     451              :             }
     452              :         }
     453              :     }
     454              : 
     455   1013694804 :   m_nodes = m_dfsnum - 1;
     456              : 
     457              :   /* This aborts e.g. when there is _no_ path from ENTRY to EXIT at all.  */
     458   1013694804 :   gcc_assert (m_nodes == (unsigned int) m_n_basic_blocks - 1);
     459   1013694804 : }
     460              : 
     461              : /* Compress the path from V to the root of its set and update path_min at the
     462              :    same time.  After compress(di, V) set_chain[V] is the root of the set V is
     463              :    in and path_min[V] is the node with the smallest key[] value on the path
     464              :    from V to that root.  */
     465              : 
     466              : void
     467   3597487070 : dom_info::compress (TBB v)
     468              : {
     469              :   /* Btw. It's not worth to unrecurse compress() as the depth is usually not
     470              :      greater than 5 even for huge graphs (I've not seen call depth > 4).
     471              :      Also performance wise compress() ranges _far_ behind eval().  */
     472   3597487070 :   TBB parent = m_set_chain[v];
     473   3597487070 :   if (m_set_chain[parent])
     474              :     {
     475   2002571265 :       compress (parent);
     476   2002571265 :       if (m_key[m_path_min[parent]] < m_key[m_path_min[v]])
     477   1346040615 :         m_path_min[v] = m_path_min[parent];
     478   2002571265 :       m_set_chain[v] = m_set_chain[parent];
     479              :     }
     480   3597487070 : }
     481              : 
     482              : /* Compress the path from V to the set root of V if needed (when the root has
     483              :    changed since the last call).  Returns the node with the smallest key[]
     484              :    value on the path from V to the root.  */
     485              : 
     486              : inline TBB
     487  12335698368 : dom_info::eval (TBB v)
     488              : {
     489              :   /* The representative of the set V is in, also called root (as the set
     490              :      representation is a tree).  */
     491  12335698368 :   TBB rep = m_set_chain[v];
     492              : 
     493              :   /* V itself is the root.  */
     494  12335698368 :   if (!rep)
     495   2718142018 :     return m_path_min[v];
     496              : 
     497              :   /* Compress only if necessary.  */
     498   9617556350 :   if (m_set_chain[rep])
     499              :     {
     500   1594915805 :       compress (v);
     501   1594915805 :       rep = m_set_chain[v];
     502              :     }
     503              : 
     504   9617556350 :   if (m_key[m_path_min[rep]] >= m_key[m_path_min[v]])
     505              :     return m_path_min[v];
     506              :   else
     507   1679998879 :     return m_path_min[rep];
     508              : }
     509              : 
     510              : /* This essentially merges the two sets of V and W, giving a single set with
     511              :    the new root V.  The internal representation of these disjoint sets is a
     512              :    balanced tree.  Currently link(V,W) is only used with V being the parent
     513              :    of W.  */
     514              : 
     515              : void
     516   9365162383 : dom_info::link_roots (TBB v, TBB w)
     517              : {
     518   9365162383 :   TBB s = w;
     519              : 
     520              :   /* Rebalance the tree.  */
     521  13883221809 :   while (m_key[m_path_min[w]] < m_key[m_path_min[m_set_child[s]]])
     522              :     {
     523   4518059426 :       if (m_set_size[s] + m_set_size[m_set_child[m_set_child[s]]]
     524   4518059426 :           >= 2 * m_set_size[m_set_child[s]])
     525              :         {
     526   1521523242 :           m_set_chain[m_set_child[s]] = s;
     527   1521523242 :           m_set_child[s] = m_set_child[m_set_child[s]];
     528              :         }
     529              :       else
     530              :         {
     531   2996536184 :           m_set_size[m_set_child[s]] = m_set_size[s];
     532   2996536184 :           s = m_set_chain[s] = m_set_child[s];
     533              :         }
     534              :     }
     535              : 
     536   9365162383 :   m_path_min[s] = m_path_min[w];
     537   9365162383 :   m_set_size[v] += m_set_size[w];
     538   9365162383 :   if (m_set_size[v] < 2 * m_set_size[w])
     539   5418213388 :     std::swap (m_set_child[v], s);
     540              : 
     541              :   /* Merge all subtrees.  */
     542  13688957076 :   while (s)
     543              :     {
     544   4323794693 :       m_set_chain[s] = v;
     545   4323794693 :       s = m_set_child[s];
     546              :     }
     547   9365162383 : }
     548              : 
     549              : /* This calculates the immediate dominators (or post-dominators). THIS is our
     550              :    working structure and should hold the DFS forest.
     551              :    On return the immediate dominator to node V is in m_dom[V].  */
     552              : 
     553              : void
     554   1013694804 : dom_info::calc_idoms ()
     555              : {
     556              :   /* Go backwards in DFS order, to first look at the leafs.  */
     557  10378857187 :   for (TBB v = m_nodes; v > 1; v--)
     558              :     {
     559   9365162383 :       basic_block bb = m_dfs_to_bb[v];
     560   9365162383 :       edge e;
     561              : 
     562   9365162383 :       TBB par = m_dfs_parent[v];
     563   9365162383 :       TBB k = v;
     564              : 
     565   9365162383 :       edge_iterator ei = m_reverse ? ei_start (bb->succs)
     566   9149561566 :                                    : ei_start (bb->preds);
     567   9365162383 :       edge_iterator einext;
     568              : 
     569   9365162383 :       if (m_fake_exit_edge)
     570              :         {
     571              :           /* If this block has a fake edge to exit, process that first.  */
     572    215382861 :           if (bitmap_bit_p (m_fake_exit_edge, bb->index))
     573              :             {
     574     11860777 :               einext = ei;
     575     11860777 :               einext.index = 0;
     576     11860777 :               goto do_fake_exit_edge;
     577              :             }
     578              :         }
     579              : 
     580              :       /* Search all direct predecessors for the smallest node with a path
     581              :          to them.  That way we have the smallest node with also a path to
     582              :          us only over nodes behind us.  In effect we search for our
     583              :          semidominator.  */
     584  22518824592 :       while (!ei_end_p (ei))
     585              :         {
     586  13153662209 :           basic_block b;
     587  13153662209 :           TBB k1;
     588              : 
     589  13153662209 :           e = ei_edge (ei);
     590  13153662209 :           b = m_reverse ? e->dest : e->src;
     591  13153662209 :           einext = ei;
     592  13153662209 :           ei_next (&einext);
     593              : 
     594  13153662209 :           if (b == m_start_block)
     595              :             {
     596   1015186777 :             do_fake_exit_edge:
     597   1027047554 :               k1 = *m_dfs_last;
     598              :             }
     599              :           else
     600  12138475432 :             k1 = m_dfs_order[b->index];
     601              : 
     602              :           /* Call eval() only if really needed.  If k1 is above V in DFS tree,
     603              :              then we know, that eval(k1) == k1 and key[k1] == k1.  */
     604  13165522986 :           if (k1 > v)
     605   2970535985 :             k1 = m_key[eval (k1)];
     606  13165522986 :           if (k1 < k)
     607              :             k = k1;
     608              : 
     609  13165522986 :           ei = einext;
     610              :         }
     611              : 
     612   9365162383 :       m_key[v] = k;
     613   9365162383 :       link_roots (par, v);
     614   9365162383 :       m_next_bucket[v] = m_bucket[k];
     615   9365162383 :       m_bucket[k] = v;
     616              : 
     617              :       /* Transform semidominators into dominators.  */
     618  18730324766 :       for (TBB w = m_bucket[par]; w; w = m_next_bucket[w])
     619              :         {
     620   9365162383 :           k = eval (w);
     621   9365162383 :           if (m_key[k] < m_key[w])
     622     41322890 :             m_dom[w] = k;
     623              :           else
     624   9323839493 :             m_dom[w] = par;
     625              :         }
     626              :       /* We don't need to cleanup next_bucket[].  */
     627   9365162383 :       m_bucket[par] = 0;
     628              :     }
     629              : 
     630              :   /* Explicitly define the dominators.  */
     631   1013694804 :   m_dom[1] = 0;
     632  10378857187 :   for (TBB v = 2; v <= m_nodes; v++)
     633   9365162383 :     if (m_dom[v] != m_key[v])
     634     41322890 :       m_dom[v] = m_dom[m_dom[v]];
     635   1013694804 : }
     636              : 
     637              : /* Assign dfs numbers starting from NUM to NODE and its sons.  */
     638              : 
     639              : static void
     640    521109127 : assign_dfs_numbers (struct et_node *node, int *num)
     641              : {
     642    521109127 :   et_node *n = node;
     643   2792037586 :   while (1)
     644              :     {
     645   2792037586 :       n->dfs_num_in = (*num)++;
     646   2792037586 :       if (n->son)
     647              :         n = n->son;
     648              :       else
     649              :         {
     650   2792037586 :           while (!n->right || n->right == n->father->son)
     651              :             {
     652   1879932291 :               n->dfs_num_out = (*num)++;
     653   1879932291 :               if (n == node)
     654    521109127 :                 return;
     655   1358823164 :               n = n->father;
     656              :             }
     657    912105295 :           n->dfs_num_out = (*num)++;
     658    912105295 :           n = n->right;
     659              :         }
     660              :     }
     661              : }
     662              : 
     663              : /* Compute the data necessary for fast resolving of dominator queries in a
     664              :    static dominator tree.  */
     665              : 
     666              : static void
     667    260554854 : compute_dom_fast_query (enum cdi_direction dir)
     668              : {
     669    260554854 :   int num = 0;
     670    260554854 :   basic_block bb;
     671    260554854 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
     672              : 
     673    260554854 :   gcc_checking_assert (dom_info_available_p (dir));
     674              : 
     675    260554854 :   if (dom_computed[dir_index] == DOM_OK)
     676            0 :     return;
     677              : 
     678   3052592440 :   FOR_ALL_BB_FN (bb, cfun)
     679              :     {
     680   2792037586 :       if (!bb->dom[dir_index]->father)
     681    521109127 :         assign_dfs_numbers (bb->dom[dir_index], &num);
     682              :     }
     683              : 
     684    260554854 :   dom_computed[dir_index] = DOM_OK;
     685              : }
     686              : 
     687              : /* Analogous to the previous function but compute the data for reducible
     688              :    region REGION.  */
     689              : 
     690              : static void
     691        40240 : compute_dom_fast_query_in_region (enum cdi_direction dir,
     692              :                                   vec<basic_block> region)
     693              : {
     694        40240 :   int num = 0;
     695        40240 :   basic_block bb;
     696        40240 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
     697              : 
     698        40240 :   gcc_checking_assert (dom_info_available_p (dir));
     699              : 
     700        40240 :   if (dom_computed[dir_index] == DOM_OK)
     701            0 :     return;
     702              : 
     703              :   /* Assign dfs numbers for region nodes except for entry and exit nodes.  */
     704       516392 :   for (unsigned int i = 1; i < region.length () - 1; i++)
     705              :     {
     706       217956 :       bb = region[i];
     707       217956 :       if (!bb->dom[dir_index]->father)
     708            0 :         assign_dfs_numbers (bb->dom[dir_index], &num);
     709              :     }
     710              : 
     711        40240 :   dom_computed[dir_index] = DOM_OK;
     712              : }
     713              : 
     714              : /* The main entry point into this module.  DIR is set depending on whether
     715              :    we want to compute dominators or postdominators.  If COMPUTE_FAST_QUERY
     716              :    is false then the DFS numbers allowing for a O(1) dominance query
     717              :    are not computed.  */
     718              : 
     719              : void
     720    537998442 : calculate_dominance_info (cdi_direction dir, bool compute_fast_query)
     721              : {
     722    537998442 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
     723              : 
     724    537998442 :   if (dom_computed[dir_index] == DOM_OK)
     725              :     {
     726    268878826 :       checking_verify_dominators (dir);
     727    268878826 :       return;
     728              :     }
     729              : 
     730    269119616 :   timevar_push (TV_DOMINANCE);
     731    269119616 :   if (!dom_info_available_p (dir))
     732              :     {
     733    248008422 :       gcc_assert (!n_bbs_in_dom_tree[dir_index]);
     734              : 
     735    248008422 :       basic_block b;
     736   2691414326 :       FOR_ALL_BB_FN (b, cfun)
     737              :         {
     738   2443405904 :           b->dom[dir_index] = et_new_tree (b);
     739              :         }
     740    248008422 :       n_bbs_in_dom_tree[dir_index] = n_basic_blocks_for_fn (cfun);
     741              : 
     742    248008422 :       dom_info di (cfun, dir);
     743    248008422 :       di.calc_dfs_tree ();
     744    248008422 :       di.calc_idoms ();
     745              : 
     746   2195397482 :       FOR_EACH_BB_FN (b, cfun)
     747              :         {
     748   1947389060 :           if (basic_block d = di.get_idom (b))
     749   1947389060 :             et_set_father (b->dom[dir_index], d->dom[dir_index]);
     750              :         }
     751              : 
     752    248008422 :       dom_computed[dir_index] = DOM_NO_FAST_QUERY;
     753    248008422 :     }
     754              :   else
     755     21111194 :     checking_verify_dominators (dir);
     756              : 
     757    269119616 :   if (compute_fast_query)
     758    260554854 :     compute_dom_fast_query (dir);
     759              : 
     760    269119616 :   timevar_pop (TV_DOMINANCE);
     761              : }
     762              : 
     763              : /* Analogous to the previous function but compute dominance info for regions
     764              :    which are single entry, multiple exit regions for CDI_DOMINATORs and
     765              :    multiple entry, single exit regions for CDI_POST_DOMINATORs.  */
     766              : 
     767              : void
     768        40240 : calculate_dominance_info_for_region (cdi_direction dir,
     769              :                                      vec<basic_block> region)
     770              : {
     771        40240 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
     772        40240 :   basic_block bb;
     773        40240 :   unsigned int i;
     774              : 
     775        40240 :   if (dom_computed[dir_index] == DOM_OK)
     776            0 :     return;
     777              : 
     778        40240 :   timevar_push (TV_DOMINANCE);
     779              :   /* Assume that dom info is not partially computed.  */
     780        40240 :   gcc_assert (!dom_info_available_p (dir));
     781              : 
     782       338676 :   FOR_EACH_VEC_ELT (region, i, bb)
     783              :     {
     784       298436 :       bb->dom[dir_index] = et_new_tree (bb);
     785              :     }
     786        40240 :   dom_info di (region, dir);
     787        40240 :   di.calc_dfs_tree ();
     788        40240 :   di.calc_idoms ();
     789              : 
     790       338676 :   FOR_EACH_VEC_ELT (region, i, bb)
     791       298436 :     if (basic_block d = di.get_idom (bb))
     792       217956 :       et_set_father (bb->dom[dir_index], d->dom[dir_index]);
     793              : 
     794        40240 :   dom_computed[dir_index] = DOM_NO_FAST_QUERY;
     795        40240 :   compute_dom_fast_query_in_region (dir, region);
     796              : 
     797        40240 :   timevar_pop (TV_DOMINANCE);
     798        40240 : }
     799              : 
     800              : /* Free dominance information for direction DIR.  */
     801              : void
     802    445732876 : free_dominance_info (function *fn, enum cdi_direction dir)
     803              : {
     804    445732876 :   basic_block bb;
     805    445732876 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
     806              : 
     807    445732876 :   if (!dom_info_available_p (fn, dir))
     808              :     return;
     809              : 
     810   2674422169 :   FOR_ALL_BB_FN (bb, fn)
     811              :     {
     812   2426469464 :       et_free_tree_force (bb->dom[dir_index]);
     813   2426469464 :       bb->dom[dir_index] = NULL;
     814              :     }
     815    247952705 :   et_free_pools ();
     816              : 
     817    247952705 :   fn->cfg->x_n_bbs_in_dom_tree[dir_index] = 0;
     818              : 
     819    247952705 :   fn->cfg->x_dom_computed[dir_index] = DOM_NONE;
     820              : }
     821              : 
     822              : void
     823    287716802 : free_dominance_info (enum cdi_direction dir)
     824              : {
     825    287716802 :   free_dominance_info (cfun, dir);
     826    287716802 : }
     827              : 
     828              : /* Free dominance information for direction DIR in region REGION.  */
     829              : 
     830              : void
     831        40240 : free_dominance_info_for_region (function *fn,
     832              :                                 enum cdi_direction dir,
     833              :                                 vec<basic_block> region)
     834              : {
     835        40240 :   basic_block bb;
     836        40240 :   unsigned int i;
     837        40240 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
     838              : 
     839        40240 :   if (!dom_info_available_p (dir))
     840        40240 :     return;
     841              : 
     842       338676 :   FOR_EACH_VEC_ELT (region, i, bb)
     843              :     {
     844       298436 :       et_free_tree_force (bb->dom[dir_index]);
     845       298436 :       bb->dom[dir_index] = NULL;
     846              :     }
     847        40240 :   et_free_pools ();
     848              : 
     849        40240 :   fn->cfg->x_dom_computed[dir_index] = DOM_NONE;
     850              : 
     851        40240 :   fn->cfg->x_n_bbs_in_dom_tree[dir_index] = 0;
     852              : }
     853              : 
     854              : /* Return the immediate dominator of basic block BB.  */
     855              : basic_block
     856   9620953093 : get_immediate_dominator (enum cdi_direction dir, basic_block bb)
     857              : {
     858   9620953093 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
     859   9620953093 :   struct et_node *node = bb->dom[dir_index];
     860              : 
     861   9620953093 :   gcc_checking_assert (dom_computed[dir_index]);
     862              : 
     863   9620953093 :   if (!node->father)
     864              :     return NULL;
     865              : 
     866   9585293809 :   return (basic_block) node->father->data;
     867              : }
     868              : 
     869              : /* Set the immediate dominator of the block possibly removing
     870              :    existing edge.  NULL can be used to remove any edge.  */
     871              : void
     872     67428408 : set_immediate_dominator (enum cdi_direction dir, basic_block bb,
     873              :                          basic_block dominated_by)
     874              : {
     875     67428408 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
     876     67428408 :   struct et_node *node = bb->dom[dir_index];
     877              : 
     878     67428408 :   gcc_checking_assert (dom_computed[dir_index]);
     879              : 
     880     67428408 :   if (node->father)
     881              :     {
     882     36369758 :       if (node->father->data == dominated_by)
     883              :         return;
     884     14286088 :       et_split (node);
     885              :     }
     886              : 
     887     45344738 :   if (dominated_by)
     888     43344407 :     et_set_father (node, dominated_by->dom[dir_index]);
     889              : 
     890     45344738 :   if (dom_computed[dir_index] == DOM_OK)
     891       890920 :     dom_computed[dir_index] = DOM_NO_FAST_QUERY;
     892              : }
     893              : 
     894              : /* Returns the list of basic blocks immediately dominated by BB, in the
     895              :    direction DIR.  */
     896              : auto_vec<basic_block>
     897       825675 : get_dominated_by (enum cdi_direction dir, basic_block bb)
     898              : {
     899       825675 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
     900       825675 :   struct et_node *node = bb->dom[dir_index], *son = node->son, *ason;
     901       825675 :   auto_vec<basic_block> bbs;
     902              : 
     903       825675 :   gcc_checking_assert (dom_computed[dir_index]);
     904              : 
     905       825675 :   if (!son)
     906              :     return bbs;
     907              : 
     908       495035 :   bbs.safe_push ((basic_block) son->data);
     909       820386 :   for (ason = son->right; ason != son; ason = ason->right)
     910       325351 :     bbs.safe_push ((basic_block) ason->data);
     911              : 
     912              :   return bbs;
     913              : }
     914              : 
     915              : /* Returns the list of basic blocks that are immediately dominated (in
     916              :    direction DIR) by some block between N_REGION ones stored in REGION,
     917              :    except for blocks in the REGION itself.  */
     918              : 
     919              : auto_vec<basic_block>
     920       609207 : get_dominated_by_region (enum cdi_direction dir, basic_block *region,
     921              :                          unsigned n_region)
     922              : {
     923       609207 :   unsigned i;
     924       609207 :   basic_block dom;
     925       609207 :   auto_vec<basic_block> doms;
     926              : 
     927      1823647 :   for (i = 0; i < n_region; i++)
     928      1214440 :     region[i]->flags |= BB_DUPLICATED;
     929      1823647 :   for (i = 0; i < n_region; i++)
     930      1214440 :     for (dom = first_dom_son (dir, region[i]);
     931      2935362 :          dom;
     932      1720922 :          dom = next_dom_son (dir, dom))
     933      1720922 :       if (!(dom->flags & BB_DUPLICATED))
     934      1115689 :         doms.safe_push (dom);
     935      1823647 :   for (i = 0; i < n_region; i++)
     936      1214440 :     region[i]->flags &= ~BB_DUPLICATED;
     937              : 
     938       609207 :   return doms;
     939              : }
     940              : 
     941              : /* Returns the list of basic blocks including BB dominated by BB, in the
     942              :    direction DIR up to DEPTH in the dominator tree.  The DEPTH of zero will
     943              :    produce a vector containing all dominated blocks.  The vector will be sorted
     944              :    in preorder.  */
     945              : 
     946              : auto_vec<basic_block>
     947     11940564 : get_dominated_to_depth (enum cdi_direction dir, basic_block bb, int depth)
     948              : {
     949     11940564 :   auto_vec<basic_block> bbs;
     950     11940564 :   unsigned i;
     951     11940564 :   unsigned next_level_start;
     952              : 
     953     11940564 :   i = 0;
     954     11940564 :   bbs.safe_push (bb);
     955     11940564 :   next_level_start = 1; /* = bbs.length (); */
     956              : 
     957    111145521 :   do
     958              :     {
     959    111145521 :       basic_block son;
     960              : 
     961    111145521 :       bb = bbs[i++];
     962    111145521 :       for (son = first_dom_son (dir, bb);
     963    210439454 :            son;
     964     99293933 :            son = next_dom_son (dir, son))
     965     99293933 :         bbs.safe_push (son);
     966              : 
     967    111145521 :       if (i == next_level_start && --depth)
     968     48046305 :         next_level_start = bbs.length ();
     969              :     }
     970    111145521 :   while (i < next_level_start);
     971              : 
     972     11940564 :   return bbs;
     973              : }
     974              : 
     975              : /* Returns the list of basic blocks including BB dominated by BB, in the
     976              :    direction DIR.  The vector will be sorted in preorder.  */
     977              : 
     978              : auto_vec<basic_block>
     979     11613861 : get_all_dominated_blocks (enum cdi_direction dir, basic_block bb)
     980              : {
     981     11613861 :   return get_dominated_to_depth (dir, bb, 0);
     982              : }
     983              : 
     984              : /* Redirect all edges pointing to BB to TO.  */
     985              : void
     986     17576216 : redirect_immediate_dominators (enum cdi_direction dir, basic_block bb,
     987              :                                basic_block to)
     988              : {
     989     17576216 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
     990     17576216 :   struct et_node *bb_node, *to_node, *son;
     991              : 
     992     17576216 :   bb_node = bb->dom[dir_index];
     993     17576216 :   to_node = to->dom[dir_index];
     994              : 
     995     17576216 :   gcc_checking_assert (dom_computed[dir_index]);
     996              : 
     997     17576216 :   if (!bb_node->son)
     998              :     return;
     999              : 
    1000     31308013 :   while (bb_node->son)
    1001              :     {
    1002     18108499 :       son = bb_node->son;
    1003              : 
    1004     18108499 :       et_split (son);
    1005     18108499 :       et_set_father (son, to_node);
    1006              :     }
    1007              : 
    1008     13199514 :   if (dom_computed[dir_index] == DOM_OK)
    1009      1354159 :     dom_computed[dir_index] = DOM_NO_FAST_QUERY;
    1010              : }
    1011              : 
    1012              : /* Find first basic block in the tree dominating both BB1 and BB2.  */
    1013              : basic_block
    1014    113326426 : nearest_common_dominator (enum cdi_direction dir, basic_block bb1, basic_block bb2)
    1015              : {
    1016    113326426 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
    1017              : 
    1018    113326426 :   gcc_checking_assert (dom_computed[dir_index]);
    1019              : 
    1020    113326426 :   if (!bb1)
    1021              :     return bb2;
    1022    111089764 :   if (!bb2)
    1023              :     return bb1;
    1024              : 
    1025    111089764 :   return (basic_block) et_nca (bb1->dom[dir_index], bb2->dom[dir_index])->data;
    1026              : }
    1027              : 
    1028              : 
    1029              : /* Find the nearest common dominator for the basic blocks in BLOCKS,
    1030              :    using dominance direction DIR.  */
    1031              : 
    1032              : basic_block
    1033     11269083 : nearest_common_dominator_for_set (enum cdi_direction dir, bitmap blocks)
    1034              : {
    1035     11269083 :   unsigned i, first;
    1036     11269083 :   bitmap_iterator bi;
    1037     11269083 :   basic_block dom;
    1038              : 
    1039     11269083 :   first = bitmap_first_set_bit (blocks);
    1040     11269083 :   dom = BASIC_BLOCK_FOR_FN (cfun, first);
    1041     67149985 :   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
    1042     55880902 :     if (dom != BASIC_BLOCK_FOR_FN (cfun, i))
    1043     44291125 :       dom = nearest_common_dominator (dir, dom, BASIC_BLOCK_FOR_FN (cfun, i));
    1044              : 
    1045     11269083 :   return dom;
    1046              : }
    1047              : 
    1048              : /*  Given a dominator tree, we can determine whether one thing
    1049              :     dominates another in constant time by using two DFS numbers:
    1050              : 
    1051              :     1. The number for when we visit a node on the way down the tree
    1052              :     2. The number for when we visit a node on the way back up the tree
    1053              : 
    1054              :     You can view these as bounds for the range of dfs numbers the
    1055              :     nodes in the subtree of the dominator tree rooted at that node
    1056              :     will contain.
    1057              : 
    1058              :     The dominator tree is always a simple acyclic tree, so there are
    1059              :     only three possible relations two nodes in the dominator tree have
    1060              :     to each other:
    1061              : 
    1062              :     1. Node A is above Node B (and thus, Node A dominates node B)
    1063              : 
    1064              :      A
    1065              :      |
    1066              :      C
    1067              :     / \
    1068              :    B   D
    1069              : 
    1070              : 
    1071              :    In the above case, DFS_Number_In of A will be <= DFS_Number_In of
    1072              :    B, and DFS_Number_Out of A will be >= DFS_Number_Out of B.  This is
    1073              :    because we must hit A in the dominator tree *before* B on the walk
    1074              :    down, and we will hit A *after* B on the walk back up
    1075              : 
    1076              :    2. Node A is below node B (and thus, node B dominates node A)
    1077              : 
    1078              : 
    1079              :      B
    1080              :      |
    1081              :      A
    1082              :     / \
    1083              :    C   D
    1084              : 
    1085              :    In the above case, DFS_Number_In of A will be >= DFS_Number_In of
    1086              :    B, and DFS_Number_Out of A will be <= DFS_Number_Out of B.
    1087              : 
    1088              :    This is because we must hit A in the dominator tree *after* B on
    1089              :    the walk down, and we will hit A *before* B on the walk back up
    1090              : 
    1091              :    3. Node A and B are siblings (and thus, neither dominates the other)
    1092              : 
    1093              :      C
    1094              :      |
    1095              :      D
    1096              :     / \
    1097              :    A   B
    1098              : 
    1099              :    In the above case, DFS_Number_In of A will *always* be <=
    1100              :    DFS_Number_In of B, and DFS_Number_Out of A will *always* be <=
    1101              :    DFS_Number_Out of B.  This is because we will always finish the dfs
    1102              :    walk of one of the subtrees before the other, and thus, the dfs
    1103              :    numbers for one subtree can't intersect with the range of dfs
    1104              :    numbers for the other subtree.  If you swap A and B's position in
    1105              :    the dominator tree, the comparison changes direction, but the point
    1106              :    is that both comparisons will always go the same way if there is no
    1107              :    dominance relationship.
    1108              : 
    1109              :    Thus, it is sufficient to write
    1110              : 
    1111              :    A_Dominates_B (node A, node B)
    1112              :    {
    1113              :      return DFS_Number_In(A) <= DFS_Number_In(B)
    1114              :             && DFS_Number_Out (A) >= DFS_Number_Out(B);
    1115              :    }
    1116              : 
    1117              :    A_Dominated_by_B (node A, node B)
    1118              :    {
    1119              :      return DFS_Number_In(A) >= DFS_Number_In(B)
    1120              :             && DFS_Number_Out (A) <= DFS_Number_Out(B);
    1121              :    }  */
    1122              : 
    1123              : /* Return TRUE in case BB1 is dominated by BB2.  */
    1124              : bool
    1125  10527561324 : dominated_by_p (enum cdi_direction dir, const_basic_block bb1, const_basic_block bb2)
    1126              : {
    1127  10527561324 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
    1128  10527561324 :   struct et_node *n1 = bb1->dom[dir_index], *n2 = bb2->dom[dir_index];
    1129              : 
    1130  10527561324 :   gcc_checking_assert (dom_computed[dir_index]);
    1131              : 
    1132  10527561324 :   if (dom_computed[dir_index] == DOM_OK)
    1133   9834267954 :     return (n1->dfs_num_in >= n2->dfs_num_in
    1134  14881971946 :             && n1->dfs_num_out <= n2->dfs_num_out);
    1135              : 
    1136    693293370 :   return et_below (n1, n2);
    1137              : }
    1138              : 
    1139              : /* Returns the entry dfs number for basic block BB, in the direction DIR.  */
    1140              : 
    1141              : unsigned
    1142     82755622 : bb_dom_dfs_in (enum cdi_direction dir, basic_block bb)
    1143              : {
    1144     82755622 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
    1145     82755622 :   struct et_node *n = bb->dom[dir_index];
    1146              : 
    1147     82755622 :   gcc_checking_assert (dom_computed[dir_index] == DOM_OK);
    1148     82755622 :   return n->dfs_num_in;
    1149              : }
    1150              : 
    1151              : /* Returns the exit dfs number for basic block BB, in the direction DIR.  */
    1152              : 
    1153              : unsigned
    1154     47115319 : bb_dom_dfs_out (enum cdi_direction dir, basic_block bb)
    1155              : {
    1156     47115319 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
    1157     47115319 :   struct et_node *n = bb->dom[dir_index];
    1158              : 
    1159     47115319 :   gcc_checking_assert (dom_computed[dir_index] == DOM_OK);
    1160     47115319 :   return n->dfs_num_out;
    1161              : }
    1162              : 
    1163              : /* Verify invariants of dominator structure.  */
    1164              : DEBUG_FUNCTION void
    1165    765646142 : verify_dominators (cdi_direction dir)
    1166              : {
    1167    765646142 :   gcc_assert (dom_info_available_p (dir));
    1168              : 
    1169    765646142 :   dom_info di (cfun, dir);
    1170    765646142 :   di.calc_dfs_tree ();
    1171    765646142 :   di.calc_idoms ();
    1172              : 
    1173    765646142 :   bool err = false;
    1174    765646142 :   basic_block bb;
    1175   8183201509 :   FOR_EACH_BB_FN (bb, cfun)
    1176              :     {
    1177   7417555367 :       basic_block imm_bb = get_immediate_dominator (dir, bb);
    1178   7417555367 :       if (!imm_bb)
    1179              :         {
    1180            0 :           error ("dominator of %d status unknown", bb->index);
    1181            0 :           err = true;
    1182            0 :           continue;
    1183              :         }
    1184              : 
    1185   7417555367 :       basic_block imm_bb_correct = di.get_idom (bb);
    1186   7417555367 :       if (imm_bb != imm_bb_correct)
    1187              :         {
    1188            0 :           error ("dominator of %d should be %d, not %d",
    1189              :                  bb->index, imm_bb_correct->index, imm_bb->index);
    1190            0 :           err = true;
    1191              :         }
    1192              :     }
    1193              : 
    1194    765646142 :   gcc_assert (!err);
    1195    765646142 : }
    1196              : 
    1197              : /* Determine immediate dominator (or postdominator, according to DIR) of BB,
    1198              :    assuming that dominators of other blocks are correct.  We also use it to
    1199              :    recompute the dominators in a restricted area, by iterating it until it
    1200              :    reaches a fixed point.  */
    1201              : 
    1202              : basic_block
    1203       440601 : recompute_dominator (enum cdi_direction dir, basic_block bb)
    1204              : {
    1205       440601 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
    1206       440601 :   basic_block dom_bb = NULL;
    1207       440601 :   edge e;
    1208       440601 :   edge_iterator ei;
    1209              : 
    1210       440601 :   gcc_checking_assert (dom_computed[dir_index]);
    1211              : 
    1212       440601 :   if (dir == CDI_DOMINATORS)
    1213              :     {
    1214      2754499 :       FOR_EACH_EDGE (e, ei, bb->preds)
    1215              :         {
    1216      2313898 :           if (!dominated_by_p (dir, e->src, bb))
    1217      2140022 :             dom_bb = nearest_common_dominator (dir, dom_bb, e->src);
    1218              :         }
    1219              :     }
    1220              :   else
    1221              :     {
    1222            0 :       FOR_EACH_EDGE (e, ei, bb->succs)
    1223              :         {
    1224            0 :           if (!dominated_by_p (dir, e->dest, bb))
    1225            0 :             dom_bb = nearest_common_dominator (dir, dom_bb, e->dest);
    1226              :         }
    1227              :     }
    1228              : 
    1229       440601 :   return dom_bb;
    1230              : }
    1231              : 
    1232              : /* Use simple heuristics (see iterate_fix_dominators) to determine dominators
    1233              :    of BBS.  We assume that all the immediate dominators except for those of the
    1234              :    blocks in BBS are correct.  If CONSERVATIVE is true, we also assume that the
    1235              :    currently recorded immediate dominators of blocks in BBS really dominate the
    1236              :    blocks.  The basic blocks for that we determine the dominator are removed
    1237              :    from BBS.  */
    1238              : 
    1239              : static void
    1240      1352937 : prune_bbs_to_update_dominators (vec<basic_block> &bbs,
    1241              :                                 bool conservative)
    1242              : {
    1243      1352937 :   unsigned i;
    1244      1352937 :   bool single;
    1245      1352937 :   basic_block bb, dom = NULL;
    1246      1352937 :   edge_iterator ei;
    1247      1352937 :   edge e;
    1248              : 
    1249      4595545 :   for (i = 0; bbs.iterate (i, &bb);)
    1250              :     {
    1251      3242608 :       if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
    1252            0 :         goto succeed;
    1253              : 
    1254      3242608 :       if (single_pred_p (bb))
    1255              :         {
    1256      1307233 :           set_immediate_dominator (CDI_DOMINATORS, bb, single_pred (bb));
    1257      1307233 :           goto succeed;
    1258              :         }
    1259              : 
    1260      1935375 :       if (!conservative)
    1261      1280488 :         goto fail;
    1262              : 
    1263       654887 :       single = true;
    1264       654887 :       dom = NULL;
    1265     12588374 :       FOR_EACH_EDGE (e, ei, bb->preds)
    1266              :         {
    1267     11933487 :           if (dominated_by_p (CDI_DOMINATORS, e->src, bb))
    1268        12409 :             continue;
    1269              : 
    1270     11921078 :           if (!dom)
    1271       654887 :             dom = e->src;
    1272              :           else
    1273              :             {
    1274     11266191 :               single = false;
    1275     11266191 :               dom = nearest_common_dominator (CDI_DOMINATORS, dom, e->src);
    1276              :             }
    1277              :         }
    1278              : 
    1279       654887 :       gcc_assert (dom != NULL);
    1280       654887 :       if (single
    1281       654887 :           || find_edge (dom, bb))
    1282              :         {
    1283       438138 :           set_immediate_dominator (CDI_DOMINATORS, bb, dom);
    1284       438138 :           goto succeed;
    1285              :         }
    1286              : 
    1287      1497237 : fail:
    1288      1497237 :       i++;
    1289      1497237 :       continue;
    1290              : 
    1291      1745371 : succeed:
    1292      1745371 :       bbs.unordered_remove (i);
    1293              :     }
    1294      1497237 : }
    1295              : 
    1296              : /* Returns root of the dominance tree in the direction DIR that contains
    1297              :    BB.  */
    1298              : 
    1299              : static basic_block
    1300      7558296 : root_of_dom_tree (enum cdi_direction dir, basic_block bb)
    1301              : {
    1302      7558296 :   return (basic_block) et_root (bb->dom[dom_convert_dir_to_idx (dir)])->data;
    1303              : }
    1304              : 
    1305              : /* See the comment in iterate_fix_dominators.  Finds the immediate dominators
    1306              :    for the sons of Y, found using the SON and BROTHER arrays representing
    1307              :    the dominance tree of graph G.  BBS maps the vertices of G to the basic
    1308              :    blocks.  */
    1309              : 
    1310              : static void
    1311      1846173 : determine_dominators_for_sons (struct graph *g, vec<basic_block> bbs,
    1312              :                                int y, int *son, int *brother)
    1313              : {
    1314      1846173 :   bitmap gprime;
    1315      1846173 :   int i, a, nc;
    1316      1846173 :   vec<int> *sccs;
    1317      1846173 :   basic_block bb, dom, ybb;
    1318      1846173 :   unsigned si;
    1319      1846173 :   edge e;
    1320      1846173 :   edge_iterator ei;
    1321              : 
    1322      1846173 :   if (son[y] == -1)
    1323      1302278 :     return;
    1324      1328264 :   if (y == (int) bbs.length ())
    1325       583287 :     ybb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
    1326              :   else
    1327        80845 :     ybb = bbs[y];
    1328              : 
    1329       664132 :   if (brother[son[y]] == -1)
    1330              :     {
    1331              :       /* Handle the common case Y has just one son specially.  */
    1332       120237 :       bb = bbs[son[y]];
    1333       120237 :       set_immediate_dominator (CDI_DOMINATORS, bb,
    1334              :                                recompute_dominator (CDI_DOMINATORS, bb));
    1335       120237 :       identify_vertices (g, y, son[y]);
    1336       120237 :       return;
    1337              :     }
    1338              : 
    1339       543895 :   gprime = BITMAP_ALLOC (NULL);
    1340      1686544 :   for (a = son[y]; a != -1; a = brother[a])
    1341      1142649 :     bitmap_set_bit (gprime, a);
    1342              : 
    1343       543895 :   nc = graphds_scc (g, gprime);
    1344       543895 :   BITMAP_FREE (gprime);
    1345              : 
    1346              :   /* ???  Needed to work around the pre-processor confusion with
    1347              :      using a multi-argument template type as macro argument.  */
    1348       543895 :   typedef vec<int> vec_int_heap;
    1349       543895 :   sccs = XCNEWVEC (vec_int_heap, nc);
    1350      1686544 :   for (a = son[y]; a != -1; a = brother[a])
    1351      1142649 :     sccs[g->vertices[a].component].safe_push (a);
    1352              : 
    1353      1685710 :   for (i = nc - 1; i >= 0; i--)
    1354              :     {
    1355              :       dom = NULL;
    1356      2284464 :       FOR_EACH_VEC_ELT (sccs[i], si, a)
    1357              :         {
    1358      1142649 :           bb = bbs[a];
    1359      4790623 :           FOR_EACH_EDGE (e, ei, bb->preds)
    1360              :             {
    1361      3647974 :               if (root_of_dom_tree (CDI_DOMINATORS, e->src) != ybb)
    1362       504516 :                 continue;
    1363              : 
    1364      3143458 :               dom = nearest_common_dominator (CDI_DOMINATORS, dom, e->src);
    1365              :             }
    1366              :         }
    1367              : 
    1368      1141815 :       gcc_assert (dom != NULL);
    1369      3426279 :       FOR_EACH_VEC_ELT (sccs[i], si, a)
    1370              :         {
    1371      1142649 :           bb = bbs[a];
    1372      1142649 :           set_immediate_dominator (CDI_DOMINATORS, bb, dom);
    1373              :         }
    1374              :     }
    1375              : 
    1376      1685710 :   for (i = 0; i < nc; i++)
    1377      1141815 :     sccs[i].release ();
    1378       543895 :   free (sccs);
    1379              : 
    1380      1686544 :   for (a = son[y]; a != -1; a = brother[a])
    1381      1142649 :     identify_vertices (g, y, a);
    1382              : }
    1383              : 
    1384              : /* Recompute dominance information for basic blocks in the set BBS.  The
    1385              :    function assumes that the immediate dominators of all the other blocks
    1386              :    in CFG are correct, and that there are no unreachable blocks.
    1387              : 
    1388              :    If CONSERVATIVE is true, we additionally assume that all the ancestors of
    1389              :    a block of BBS in the current dominance tree dominate it.  */
    1390              : 
    1391              : void
    1392      1352937 : iterate_fix_dominators (enum cdi_direction dir, vec<basic_block> &bbs,
    1393              :                         bool conservative)
    1394              : {
    1395      1352937 :   unsigned i;
    1396      1352937 :   basic_block bb, dom;
    1397      1352937 :   struct graph *g;
    1398      1352937 :   int n, y;
    1399      1352937 :   size_t dom_i;
    1400      1352937 :   edge e;
    1401      1352937 :   edge_iterator ei;
    1402      1352937 :   int *parent, *son, *brother;
    1403      1352937 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
    1404              : 
    1405              :   /* We only support updating dominators.  There are some problems with
    1406              :      updating postdominators (need to add fake edges from infinite loops
    1407              :      and noreturn functions), and since we do not currently use
    1408              :      iterate_fix_dominators for postdominators, any attempt to handle these
    1409              :      problems would be unused, untested, and almost surely buggy.  We keep
    1410              :      the DIR argument for consistency with the rest of the dominator analysis
    1411              :      interface.  */
    1412      1352937 :   gcc_checking_assert (dir == CDI_DOMINATORS && dom_computed[dir_index]);
    1413              : 
    1414              :   /* The algorithm we use takes inspiration from the following papers, although
    1415              :      the details are quite different from any of them:
    1416              : 
    1417              :      [1] G. Ramalingam, T. Reps, An Incremental Algorithm for Maintaining the
    1418              :          Dominator Tree of a Reducible Flowgraph
    1419              :      [2]  V. C. Sreedhar, G. R. Gao, Y.-F. Lee: Incremental computation of
    1420              :           dominator trees
    1421              :      [3]  K. D. Cooper, T. J. Harvey and K. Kennedy: A Simple, Fast Dominance
    1422              :           Algorithm
    1423              : 
    1424              :      First, we use the following heuristics to decrease the size of the BBS
    1425              :      set:
    1426              :        a) if BB has a single predecessor, then its immediate dominator is this
    1427              :           predecessor
    1428              :        additionally, if CONSERVATIVE is true:
    1429              :        b) if all the predecessors of BB except for one (X) are dominated by BB,
    1430              :           then X is the immediate dominator of BB
    1431              :        c) if the nearest common ancestor of the predecessors of BB is X and
    1432              :           X -> BB is an edge in CFG, then X is the immediate dominator of BB
    1433              : 
    1434              :      Then, we need to establish the dominance relation among the basic blocks
    1435              :      in BBS.  We split the dominance tree by removing the immediate dominator
    1436              :      edges from BBS, creating a forest F.  We form a graph G whose vertices
    1437              :      are BBS and ENTRY and X -> Y is an edge of G if there exists an edge
    1438              :      X' -> Y in CFG such that X' belongs to the tree of the dominance forest
    1439              :      whose root is X.  We then determine dominance tree of G.  Note that
    1440              :      for X, Y in BBS, X dominates Y in CFG if and only if X dominates Y in G.
    1441              :      In this step, we can use arbitrary algorithm to determine dominators.
    1442              :      We decided to prefer the algorithm [3] to the algorithm of
    1443              :      Lengauer and Tarjan, since the set BBS is usually small (rarely exceeding
    1444              :      10 during gcc bootstrap), and [3] should perform better in this case.
    1445              : 
    1446              :      Finally, we need to determine the immediate dominators for the basic
    1447              :      blocks of BBS.  If the immediate dominator of X in G is Y, then
    1448              :      the immediate dominator of X in CFG belongs to the tree of F rooted in
    1449              :      Y.  We process the dominator tree T of G recursively, starting from leaves.
    1450              :      Suppose that X_1, X_2, ..., X_k are the sons of Y in T, and that the
    1451              :      subtrees of the dominance tree of CFG rooted in X_i are already correct.
    1452              :      Let G' be the subgraph of G induced by {X_1, X_2, ..., X_k}.  We make
    1453              :      the following observations:
    1454              :        (i) the immediate dominator of all blocks in a strongly connected
    1455              :            component of G' is the same
    1456              :        (ii) if X has no predecessors in G', then the immediate dominator of X
    1457              :             is the nearest common ancestor of the predecessors of X in the
    1458              :             subtree of F rooted in Y
    1459              :      Therefore, it suffices to find the topological ordering of G', and
    1460              :      process the nodes X_i in this order using the rules (i) and (ii).
    1461              :      Then, we contract all the nodes X_i with Y in G, so that the further
    1462              :      steps work correctly.  */
    1463              : 
    1464      1352937 :   if (!conservative)
    1465              :     {
    1466              :       /* Split the tree now.  If the idoms of blocks in BBS are not
    1467              :          conservatively correct, setting the dominators using the
    1468              :          heuristics in prune_bbs_to_update_dominators could
    1469              :          create cycles in the dominance "tree", and cause ICE.  */
    1470      2613957 :       FOR_EACH_VEC_ELT (bbs, i, bb)
    1471      1899181 :         set_immediate_dominator (CDI_DOMINATORS, bb, NULL);
    1472              :     }
    1473              : 
    1474      1352937 :   prune_bbs_to_update_dominators (bbs, conservative);
    1475      1352937 :   n = bbs.length ();
    1476              : 
    1477      1352937 :   if (n == 0)
    1478       769650 :     return;
    1479              : 
    1480       817638 :   if (n == 1)
    1481              :     {
    1482       234351 :       bb = bbs[0];
    1483       234351 :       set_immediate_dominator (CDI_DOMINATORS, bb,
    1484              :                                recompute_dominator (CDI_DOMINATORS, bb));
    1485       234351 :       return;
    1486              :     }
    1487              : 
    1488       583287 :   timevar_push (TV_DOMINANCE);
    1489              : 
    1490              :   /* Construct the graph G.  */
    1491       583287 :   hash_map<basic_block, int> map (251);
    1492      2429460 :   FOR_EACH_VEC_ELT (bbs, i, bb)
    1493              :     {
    1494              :       /* If the dominance tree is conservatively correct, split it now.  */
    1495      1262886 :       if (conservative)
    1496       101150 :         set_immediate_dominator (CDI_DOMINATORS, bb, NULL);
    1497      1262886 :       map.put (bb, i);
    1498              :     }
    1499       583287 :   map.put (ENTRY_BLOCK_PTR_FOR_FN (cfun), n);
    1500              : 
    1501       583287 :   g = new_graph (n + 1);
    1502      3012747 :   for (y = 0; y < g->n_vertices; y++)
    1503      1846173 :     g->vertices[y].data = BITMAP_ALLOC (NULL);
    1504      1846173 :   FOR_EACH_VEC_ELT (bbs, i, bb)
    1505              :     {
    1506      5173208 :       FOR_EACH_EDGE (e, ei, bb->preds)
    1507              :         {
    1508      3910322 :           dom = root_of_dom_tree (CDI_DOMINATORS, e->src);
    1509      3910322 :           if (dom == bb)
    1510       551780 :             continue;
    1511              : 
    1512      3358542 :           dom_i = *map.get (dom);
    1513              : 
    1514              :           /* Do not include parallel edges to G.  */
    1515      3358542 :           if (!bitmap_set_bit ((bitmap) g->vertices[dom_i].data, i))
    1516      1468229 :             continue;
    1517              : 
    1518      1890313 :           add_edge (g, dom_i, i);
    1519              :         }
    1520              :     }
    1521      2429460 :   for (y = 0; y < g->n_vertices; y++)
    1522      1846173 :     BITMAP_FREE (g->vertices[y].data);
    1523              : 
    1524              :   /* Find the dominator tree of G.  */
    1525       583287 :   son = XNEWVEC (int, n + 1);
    1526       583287 :   brother = XNEWVEC (int, n + 1);
    1527       583287 :   parent = XNEWVEC (int, n + 1);
    1528       583287 :   graphds_domtree (g, n, parent, son, brother);
    1529              : 
    1530              :   /* Finally, traverse the tree and find the immediate dominators.  */
    1531      1804201 :   for (y = n; son[y] != -1; y = son[y])
    1532       637627 :     continue;
    1533      2429460 :   while (y != -1)
    1534              :     {
    1535      1846173 :       determine_dominators_for_sons (g, bbs, y, son, brother);
    1536              : 
    1537      1846173 :       if (brother[y] != -1)
    1538              :         {
    1539              :           y = brother[y];
    1540       625259 :           while (son[y] != -1)
    1541              :             y = son[y];
    1542              :         }
    1543              :       else
    1544      1247419 :         y = parent[y];
    1545              :     }
    1546              : 
    1547       583287 :   free (son);
    1548       583287 :   free (brother);
    1549       583287 :   free (parent);
    1550              : 
    1551       583287 :   free_graph (g);
    1552              : 
    1553       583287 :   timevar_pop (TV_DOMINANCE);
    1554       583287 : }
    1555              : 
    1556              : void
    1557     31524627 : add_to_dominance_info (enum cdi_direction dir, basic_block bb)
    1558              : {
    1559     31524627 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
    1560              : 
    1561     31524627 :   gcc_checking_assert (dom_computed[dir_index] && !bb->dom[dir_index]);
    1562              : 
    1563     31524627 :   n_bbs_in_dom_tree[dir_index]++;
    1564              : 
    1565     31524627 :   bb->dom[dir_index] = et_new_tree (bb);
    1566              : 
    1567     31524627 :   if (dom_computed[dir_index] == DOM_OK)
    1568      4462595 :     dom_computed[dir_index] = DOM_NO_FAST_QUERY;
    1569     31524627 : }
    1570              : 
    1571              : void
    1572     48101173 : delete_from_dominance_info (enum cdi_direction dir, basic_block bb)
    1573              : {
    1574     48101173 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
    1575              : 
    1576     48101173 :   gcc_checking_assert (dom_computed[dir_index]);
    1577              : 
    1578     48101173 :   et_free_tree (bb->dom[dir_index]);
    1579     48101173 :   bb->dom[dir_index] = NULL;
    1580     48101173 :   n_bbs_in_dom_tree[dir_index]--;
    1581              : 
    1582     48101173 :   if (dom_computed[dir_index] == DOM_OK)
    1583      2139552 :     dom_computed[dir_index] = DOM_NO_FAST_QUERY;
    1584     48101173 : }
    1585              : 
    1586              : /* Returns the first son of BB in the dominator or postdominator tree
    1587              :    as determined by DIR.  */
    1588              : 
    1589              : basic_block
    1590    761182629 : first_dom_son (enum cdi_direction dir, basic_block bb)
    1591              : {
    1592    761182629 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
    1593    761182629 :   struct et_node *son = bb->dom[dir_index]->son;
    1594              : 
    1595    761182629 :   return (basic_block) (son ? son->data : NULL);
    1596              : }
    1597              : 
    1598              : /* Returns the next dominance son after BB in the dominator or postdominator
    1599              :    tree as determined by DIR, or NULL if it was the last one.  */
    1600              : 
    1601              : basic_block
    1602    669125495 : next_dom_son (enum cdi_direction dir, basic_block bb)
    1603              : {
    1604    669125495 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
    1605    669125495 :   struct et_node *next = bb->dom[dir_index]->right;
    1606              : 
    1607    669125495 :   return (basic_block) (next->father->son == next ? NULL : next->data);
    1608              : }
    1609              : 
    1610              : /* Return dominance availability for dominance info DIR.  */
    1611              : 
    1612              : enum dom_state
    1613   6479254674 : dom_info_state (function *fn, enum cdi_direction dir)
    1614              : {
    1615   6479254674 :   if (!fn->cfg)
    1616              :     return DOM_NONE;
    1617              : 
    1618   6310723076 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
    1619   6310723076 :   return fn->cfg->x_dom_computed[dir_index];
    1620              : }
    1621              : 
    1622              : enum dom_state
    1623    544011001 : dom_info_state (enum cdi_direction dir)
    1624              : {
    1625    544011001 :   return dom_info_state (cfun, dir);
    1626              : }
    1627              : 
    1628              : /* Set the dominance availability for dominance info DIR to NEW_STATE.  */
    1629              : 
    1630              : void
    1631    200345152 : set_dom_info_availability (enum cdi_direction dir, enum dom_state new_state)
    1632              : {
    1633    200345152 :   unsigned int dir_index = dom_convert_dir_to_idx (dir);
    1634              : 
    1635    200345152 :   dom_computed[dir_index] = new_state;
    1636    200345152 : }
    1637              : 
    1638              : /* Returns true if dominance information for direction DIR is available.  */
    1639              : 
    1640              : bool
    1641   2701947303 : dom_info_available_p (function *fn, enum cdi_direction dir)
    1642              : {
    1643   2701947303 :   return dom_info_state (fn, dir) != DOM_NONE;
    1644              : }
    1645              : 
    1646              : bool
    1647   2252813857 : dom_info_available_p (enum cdi_direction dir)
    1648              : {
    1649   2252813857 :   return dom_info_available_p (cfun, dir);
    1650              : }
    1651              : 
    1652              : DEBUG_FUNCTION void
    1653            0 : debug_dominance_info (enum cdi_direction dir)
    1654              : {
    1655            0 :   basic_block bb, bb2;
    1656            0 :   FOR_EACH_BB_FN (bb, cfun)
    1657            0 :     if ((bb2 = get_immediate_dominator (dir, bb)))
    1658            0 :       fprintf (stderr, "%i %i\n", bb->index, bb2->index);
    1659            0 : }
    1660              : 
    1661              : /* Dump the dominance tree in direction DIR to the file F in dot form.
    1662              :    This allows easily visualizing the tree using graphviz.  */
    1663              : 
    1664              : DEBUG_FUNCTION void
    1665            0 : dot_dominance_tree (FILE *f, enum cdi_direction dir)
    1666              : {
    1667            0 :   fprintf (f, "digraph {\n");
    1668            0 :   basic_block bb, idom;
    1669            0 :   FOR_EACH_BB_FN (bb, cfun)
    1670            0 :     if ((idom = get_immediate_dominator (dir, bb)))
    1671            0 :       fprintf (f, "%i -> %i;\n", idom->index, bb->index);
    1672            0 :   fprintf (f, "}\n");
    1673            0 : }
    1674              : 
    1675              : /* Convenience wrapper around the above that dumps the dominance tree in
    1676              :    direction DIR to the file at path FNAME in dot form.  */
    1677              : 
    1678              : DEBUG_FUNCTION void
    1679            0 : dot_dominance_tree (const char *fname, enum cdi_direction dir)
    1680              : {
    1681            0 :   FILE *f = fopen (fname, "w");
    1682            0 :   if (f)
    1683              :     {
    1684            0 :       dot_dominance_tree (f, dir);
    1685            0 :       fclose (f);
    1686              :     }
    1687              :   else
    1688            0 :     fprintf (stderr, "failed to open %s: %s\n", fname, xstrerror (errno));
    1689            0 : }
    1690              : 
    1691              : /* Prints to stderr representation of the dominance tree (for direction DIR)
    1692              :    rooted in ROOT, indented by INDENT tabulators.  If INDENT_FIRST is false,
    1693              :    the first line of the output is not indented.  */
    1694              : 
    1695              : static void
    1696            0 : debug_dominance_tree_1 (enum cdi_direction dir, basic_block root,
    1697              :                         unsigned indent, bool indent_first)
    1698              : {
    1699            0 :   basic_block son;
    1700            0 :   unsigned i;
    1701            0 :   bool first = true;
    1702              : 
    1703            0 :   if (indent_first)
    1704            0 :     for (i = 0; i < indent; i++)
    1705            0 :       fprintf (stderr, "\t");
    1706            0 :   fprintf (stderr, "%d\t", root->index);
    1707              : 
    1708            0 :   for (son = first_dom_son (dir, root);
    1709            0 :        son;
    1710            0 :        son = next_dom_son (dir, son))
    1711              :     {
    1712            0 :       debug_dominance_tree_1 (dir, son, indent + 1, !first);
    1713            0 :       first = false;
    1714              :     }
    1715              : 
    1716            0 :   if (first)
    1717            0 :     fprintf (stderr, "\n");
    1718            0 : }
    1719              : 
    1720              : /* Prints to stderr representation of the dominance tree (for direction DIR)
    1721              :    rooted in ROOT.  */
    1722              : 
    1723              : DEBUG_FUNCTION void
    1724            0 : debug_dominance_tree (enum cdi_direction dir, basic_block root)
    1725              : {
    1726            0 :   debug_dominance_tree_1 (dir, root, 0, false);
    1727            0 : }
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.