1 /* Calculate (post)dominators in slightly super-linear time.
2    Copyright (C) 2000-2016 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 ();
64   void calc_dfs_tree ();
65   void calc_idoms ();
66 
67   inline basic_block get_idom (basic_block);
68 private:
69   void calc_dfs_tree_nonrec (basic_block);
70   void compress (TBB);
71   TBB eval (TBB);
72   void link_roots (TBB, TBB);
73 
74   /* The parent of a node in the DFS tree.  */
75   TBB *m_dfs_parent;
76   /* For a node x m_key[x] is roughly the node nearest to the root from which
77      exists a way to x only over nodes behind x.  Such a node is also called
78      semidominator.  */
79   TBB *m_key;
80   /* The value in m_path_min[x] is the node y on the path from x to the root of
81      the tree x is in with the smallest m_key[y].  */
82   TBB *m_path_min;
83   /* m_bucket[x] points to the first node of the set of nodes having x as
84      key.  */
85   TBB *m_bucket;
86   /* And m_next_bucket[x] points to the next node.  */
87   TBB *m_next_bucket;
88   /* After the algorithm is done, m_dom[x] contains the immediate dominator
89      of x.  */
90   TBB *m_dom;
91 
92   /* The following few fields implement the structures needed for disjoint
93      sets.  */
94   /* m_set_chain[x] is the next node on the path from x to the representative
95      of the set containing x.  If m_set_chain[x]==0 then x is a root.  */
96   TBB *m_set_chain;
97   /* m_set_size[x] is the number of elements in the set named by x.  */
98   unsigned int *m_set_size;
99   /* m_set_child[x] is used for balancing the tree representing a set.  It can
100      be understood as the next sibling of x.  */
101   TBB *m_set_child;
102 
103   /* If b is the number of a basic block (BB->index), m_dfs_order[b] is the
104      number of that node in DFS order counted from 1.  This is an index
105      into most of the other arrays in this structure.  */
106   TBB *m_dfs_order;
107   /* Points to last element in m_dfs_order array.  */
108   TBB *m_dfs_last;
109   /* If x is the DFS-index of a node which corresponds with a basic block,
110      m_dfs_to_bb[x] is that basic block.  Note, that in our structure there are
111      more nodes that basic blocks, so only
112      m_dfs_to_bb[m_dfs_order[bb->index]]==bb is true for every basic block bb,
113      but not the opposite.  */
114   basic_block *m_dfs_to_bb;
115 
116   /* This is the next free DFS number when creating the DFS tree.  */
117   unsigned int m_dfsnum;
118   /* The number of nodes in the DFS tree (==m_dfsnum-1).  */
119   unsigned int m_nodes;
120 
121   /* Blocks with bits set here have a fake edge to EXIT.  These are used
122      to turn a DFS forest into a proper tree.  */
123   bitmap m_fake_exit_edge;
124 
125   /* Number of basic blocks in the function being compiled.  */
126   size_t m_n_basic_blocks;
127 
128   /* True, if we are computing postdominators (rather than dominators).  */
129   bool m_reverse;
130 
131   /* Start block (the entry block for forward problem, exit block for backward
132      problem).  */
133   basic_block m_start_block;
134   /* Ending block.  */
135   basic_block m_end_block;
136 };
137 
138 } // anonymous namespace
139 
140 void debug_dominance_info (cdi_direction);
141 void debug_dominance_tree (cdi_direction, basic_block);
142 
143 /* Allocate and zero-initialize NUM elements of type T (T must be a
144    POD-type).  Note: after transition to C++11 or later,
145    `x = new_zero_array <T> (num);' can be replaced with
146    `x = new T[num] {};'.  */
147 
148 template<typename T>
new_zero_array(size_t num)149 inline T *new_zero_array (size_t num)
150 {
151   T *result = new T[num];
152   memset (result, 0, sizeof (T) * num);
153   return result;
154 }
155 
156 /* Allocate all needed memory in a pessimistic fashion (so we round up).  */
157 
dom_info(function * fn,cdi_direction dir)158 dom_info::dom_info (function *fn, cdi_direction dir)
159 {
160   /* We need memory for n_basic_blocks nodes.  */
161   size_t num = m_n_basic_blocks = n_basic_blocks_for_fn (fn);
162   m_dfs_parent = new_zero_array <TBB> (num);
163   m_dom = new_zero_array <TBB> (num);
164 
165   m_path_min = new TBB[num];
166   m_key = new TBB[num];
167   m_set_size = new unsigned int[num];
168   for (size_t i = 0; i < num; i++)
169     {
170       m_path_min[i] = m_key[i] = i;
171       m_set_size[i] = 1;
172     }
173 
174   m_bucket = new_zero_array <TBB> (num);
175   m_next_bucket = new_zero_array <TBB> (num);
176 
177   m_set_chain = new_zero_array <TBB> (num);
178   m_set_child = new_zero_array <TBB> (num);
179 
180   unsigned last_bb_index = last_basic_block_for_fn (fn);
181   m_dfs_order = new_zero_array <TBB> (last_bb_index + 1);
182   m_dfs_last = &m_dfs_order[last_bb_index];
183   m_dfs_to_bb = new_zero_array <basic_block> (num);
184 
185   m_dfsnum = 1;
186   m_nodes = 0;
187 
188   switch (dir)
189     {
190       case CDI_DOMINATORS:
191 	m_reverse = false;
192 	m_fake_exit_edge = NULL;
193 	m_start_block = ENTRY_BLOCK_PTR_FOR_FN (fn);
194 	m_end_block = EXIT_BLOCK_PTR_FOR_FN (fn);
195 	break;
196       case CDI_POST_DOMINATORS:
197 	m_reverse = true;
198 	m_fake_exit_edge = BITMAP_ALLOC (NULL);
199 	m_start_block = EXIT_BLOCK_PTR_FOR_FN (fn);
200 	m_end_block = ENTRY_BLOCK_PTR_FOR_FN (fn);
201 	break;
202       default:
203 	gcc_unreachable ();
204     }
205 }
206 
207 inline basic_block
get_idom(basic_block bb)208 dom_info::get_idom (basic_block bb)
209 {
210   TBB d = m_dom[m_dfs_order[bb->index]];
211   return m_dfs_to_bb[d];
212 }
213 
214 /* Map dominance calculation type to array index used for various
215    dominance information arrays.  This version is simple -- it will need
216    to be modified, obviously, if additional values are added to
217    cdi_direction.  */
218 
219 static inline unsigned int
dom_convert_dir_to_idx(cdi_direction dir)220 dom_convert_dir_to_idx (cdi_direction dir)
221 {
222   gcc_checking_assert (dir == CDI_DOMINATORS || dir == CDI_POST_DOMINATORS);
223   return dir - 1;
224 }
225 
226 /* Free all allocated memory in dom_info.  */
227 
~dom_info()228 dom_info::~dom_info ()
229 {
230   delete[] m_dfs_parent;
231   delete[] m_path_min;
232   delete[] m_key;
233   delete[] m_dom;
234   delete[] m_bucket;
235   delete[] m_next_bucket;
236   delete[] m_set_chain;
237   delete[] m_set_size;
238   delete[] m_set_child;
239   delete[] m_dfs_order;
240   delete[] m_dfs_to_bb;
241   BITMAP_FREE (m_fake_exit_edge);
242 }
243 
244 /* The nonrecursive variant of creating a DFS tree.  BB is the starting basic
245    block for this tree and m_reverse is true, if predecessors should be visited
246    instead of successors of a node.  After this is done all nodes reachable
247    from BB were visited, have assigned their dfs number and are linked together
248    to form a tree.  */
249 
250 void
calc_dfs_tree_nonrec(basic_block bb)251 dom_info::calc_dfs_tree_nonrec (basic_block bb)
252 {
253   edge_iterator *stack = new edge_iterator[m_n_basic_blocks + 1];
254   int sp = 0;
255 
256   /* Initialize the first edge.  */
257   edge_iterator ei = m_reverse ? ei_start (bb->preds)
258 			       : ei_start (bb->succs);
259 
260   /* When the stack is empty we break out of this loop.  */
261   while (1)
262     {
263       basic_block bn;
264       edge_iterator einext;
265 
266       /* This loop traverses edges e in depth first manner, and fills the
267          stack.  */
268       while (!ei_end_p (ei))
269 	{
270 	  edge e = ei_edge (ei);
271 
272 	  /* Deduce from E the current and the next block (BB and BN), and the
273 	     next edge.  */
274 	  if (m_reverse)
275 	    {
276 	      bn = e->src;
277 
278 	      /* If the next node BN is either already visited or a border
279 	         block the current edge is useless, and simply overwritten
280 	         with the next edge out of the current node.  */
281 	      if (bn == m_end_block || m_dfs_order[bn->index])
282 		{
283 		  ei_next (&ei);
284 		  continue;
285 		}
286 	      bb = e->dest;
287 	      einext = ei_start (bn->preds);
288 	    }
289 	  else
290 	    {
291 	      bn = e->dest;
292 	      if (bn == m_end_block || m_dfs_order[bn->index])
293 		{
294 		  ei_next (&ei);
295 		  continue;
296 		}
297 	      bb = e->src;
298 	      einext = ei_start (bn->succs);
299 	    }
300 
301 	  gcc_assert (bn != m_start_block);
302 
303 	  /* Fill the DFS tree info calculatable _before_ recursing.  */
304 	  TBB my_i;
305 	  if (bb != m_start_block)
306 	    my_i = m_dfs_order[bb->index];
307 	  else
308 	    my_i = *m_dfs_last;
309 	  TBB child_i = m_dfs_order[bn->index] = m_dfsnum++;
310 	  m_dfs_to_bb[child_i] = bn;
311 	  m_dfs_parent[child_i] = my_i;
312 
313 	  /* Save the current point in the CFG on the stack, and recurse.  */
314 	  stack[sp++] = ei;
315 	  ei = einext;
316 	}
317 
318       if (!sp)
319 	break;
320       ei = stack[--sp];
321 
322       /* OK.  The edge-list was exhausted, meaning normally we would
323          end the recursion.  After returning from the recursive call,
324          there were (may be) other statements which were run after a
325          child node was completely considered by DFS.  Here is the
326          point to do it in the non-recursive variant.
327          E.g. The block just completed is in e->dest for forward DFS,
328          the block not yet completed (the parent of the one above)
329          in e->src.  This could be used e.g. for computing the number of
330          descendants or the tree depth.  */
331       ei_next (&ei);
332     }
333   delete[] stack;
334 }
335 
336 /* The main entry for calculating the DFS tree or forest.  m_reverse is true,
337    if we are interested in the reverse flow graph.  In that case the result is
338    not necessarily a tree but a forest, because there may be nodes from which
339    the EXIT_BLOCK is unreachable.  */
340 
341 void
calc_dfs_tree()342 dom_info::calc_dfs_tree ()
343 {
344   *m_dfs_last = m_dfsnum;
345   m_dfs_to_bb[m_dfsnum] = m_start_block;
346   m_dfsnum++;
347 
348   calc_dfs_tree_nonrec (m_start_block);
349 
350   if (m_reverse)
351     {
352       /* In the post-dom case we may have nodes without a path to EXIT_BLOCK.
353          They are reverse-unreachable.  In the dom-case we disallow such
354          nodes, but in post-dom we have to deal with them.
355 
356 	 There are two situations in which this occurs.  First, noreturn
357 	 functions.  Second, infinite loops.  In the first case we need to
358 	 pretend that there is an edge to the exit block.  In the second
359 	 case, we wind up with a forest.  We need to process all noreturn
360 	 blocks before we know if we've got any infinite loops.  */
361 
362       basic_block b;
363       bool saw_unconnected = false;
364 
365       FOR_BB_BETWEEN (b, m_start_block->prev_bb, m_end_block, prev_bb)
366 	{
367 	  if (EDGE_COUNT (b->succs) > 0)
368 	    {
369 	      if (m_dfs_order[b->index] == 0)
370 		saw_unconnected = true;
371 	      continue;
372 	    }
373 	  bitmap_set_bit (m_fake_exit_edge, b->index);
374 	  m_dfs_order[b->index] = m_dfsnum;
375 	  m_dfs_to_bb[m_dfsnum] = b;
376 	  m_dfs_parent[m_dfsnum] = *m_dfs_last;
377 	  m_dfsnum++;
378 	  calc_dfs_tree_nonrec (b);
379 	}
380 
381       if (saw_unconnected)
382 	{
383 	  FOR_BB_BETWEEN (b, m_start_block->prev_bb, m_end_block, prev_bb)
384 	    {
385 	      if (m_dfs_order[b->index])
386 		continue;
387 	      basic_block b2 = dfs_find_deadend (b);
388 	      gcc_checking_assert (m_dfs_order[b2->index] == 0);
389 	      bitmap_set_bit (m_fake_exit_edge, b2->index);
390 	      m_dfs_order[b2->index] = m_dfsnum;
391 	      m_dfs_to_bb[m_dfsnum] = b2;
392 	      m_dfs_parent[m_dfsnum] = *m_dfs_last;
393 	      m_dfsnum++;
394 	      calc_dfs_tree_nonrec (b2);
395 	      gcc_checking_assert (m_dfs_order[b->index]);
396 	    }
397 	}
398     }
399 
400   m_nodes = m_dfsnum - 1;
401 
402   /* This aborts e.g. when there is _no_ path from ENTRY to EXIT at all.  */
403   gcc_assert (m_nodes == (unsigned int) m_n_basic_blocks - 1);
404 }
405 
406 /* Compress the path from V to the root of its set and update path_min at the
407    same time.  After compress(di, V) set_chain[V] is the root of the set V is
408    in and path_min[V] is the node with the smallest key[] value on the path
409    from V to that root.  */
410 
411 void
compress(TBB v)412 dom_info::compress (TBB v)
413 {
414   /* Btw. It's not worth to unrecurse compress() as the depth is usually not
415      greater than 5 even for huge graphs (I've not seen call depth > 4).
416      Also performance wise compress() ranges _far_ behind eval().  */
417   TBB parent = m_set_chain[v];
418   if (m_set_chain[parent])
419     {
420       compress (parent);
421       if (m_key[m_path_min[parent]] < m_key[m_path_min[v]])
422 	m_path_min[v] = m_path_min[parent];
423       m_set_chain[v] = m_set_chain[parent];
424     }
425 }
426 
427 /* Compress the path from V to the set root of V if needed (when the root has
428    changed since the last call).  Returns the node with the smallest key[]
429    value on the path from V to the root.  */
430 
431 inline TBB
eval(TBB v)432 dom_info::eval (TBB v)
433 {
434   /* The representative of the set V is in, also called root (as the set
435      representation is a tree).  */
436   TBB rep = m_set_chain[v];
437 
438   /* V itself is the root.  */
439   if (!rep)
440     return m_path_min[v];
441 
442   /* Compress only if necessary.  */
443   if (m_set_chain[rep])
444     {
445       compress (v);
446       rep = m_set_chain[v];
447     }
448 
449   if (m_key[m_path_min[rep]] >= m_key[m_path_min[v]])
450     return m_path_min[v];
451   else
452     return m_path_min[rep];
453 }
454 
455 /* This essentially merges the two sets of V and W, giving a single set with
456    the new root V.  The internal representation of these disjoint sets is a
457    balanced tree.  Currently link(V,W) is only used with V being the parent
458    of W.  */
459 
460 void
link_roots(TBB v,TBB w)461 dom_info::link_roots (TBB v, TBB w)
462 {
463   TBB s = w;
464 
465   /* Rebalance the tree.  */
466   while (m_key[m_path_min[w]] < m_key[m_path_min[m_set_child[s]]])
467     {
468       if (m_set_size[s] + m_set_size[m_set_child[m_set_child[s]]]
469 	  >= 2 * m_set_size[m_set_child[s]])
470 	{
471 	  m_set_chain[m_set_child[s]] = s;
472 	  m_set_child[s] = m_set_child[m_set_child[s]];
473 	}
474       else
475 	{
476 	  m_set_size[m_set_child[s]] = m_set_size[s];
477 	  s = m_set_chain[s] = m_set_child[s];
478 	}
479     }
480 
481   m_path_min[s] = m_path_min[w];
482   m_set_size[v] += m_set_size[w];
483   if (m_set_size[v] < 2 * m_set_size[w])
484     std::swap (m_set_child[v], s);
485 
486   /* Merge all subtrees.  */
487   while (s)
488     {
489       m_set_chain[s] = v;
490       s = m_set_child[s];
491     }
492 }
493 
494 /* This calculates the immediate dominators (or post-dominators). THIS is our
495    working structure and should hold the DFS forest.
496    On return the immediate dominator to node V is in m_dom[V].  */
497 
498 void
calc_idoms()499 dom_info::calc_idoms ()
500 {
501   /* Go backwards in DFS order, to first look at the leafs.  */
502   for (TBB v = m_nodes; v > 1; v--)
503     {
504       basic_block bb = m_dfs_to_bb[v];
505       edge e;
506 
507       TBB par = m_dfs_parent[v];
508       TBB k = v;
509 
510       edge_iterator ei = m_reverse ? ei_start (bb->succs)
511 				   : ei_start (bb->preds);
512       edge_iterator einext;
513 
514       if (m_reverse)
515 	{
516 	  /* If this block has a fake edge to exit, process that first.  */
517 	  if (bitmap_bit_p (m_fake_exit_edge, bb->index))
518 	    {
519 	      einext = ei;
520 	      einext.index = 0;
521 	      goto do_fake_exit_edge;
522 	    }
523 	}
524 
525       /* Search all direct predecessors for the smallest node with a path
526          to them.  That way we have the smallest node with also a path to
527          us only over nodes behind us.  In effect we search for our
528          semidominator.  */
529       while (!ei_end_p (ei))
530 	{
531 	  basic_block b;
532 	  TBB k1;
533 
534 	  e = ei_edge (ei);
535 	  b = m_reverse ? e->dest : e->src;
536 	  einext = ei;
537 	  ei_next (&einext);
538 
539 	  if (b == m_start_block)
540 	    {
541 	    do_fake_exit_edge:
542 	      k1 = *m_dfs_last;
543 	    }
544 	  else
545 	    k1 = m_dfs_order[b->index];
546 
547 	  /* Call eval() only if really needed.  If k1 is above V in DFS tree,
548 	     then we know, that eval(k1) == k1 and key[k1] == k1.  */
549 	  if (k1 > v)
550 	    k1 = m_key[eval (k1)];
551 	  if (k1 < k)
552 	    k = k1;
553 
554 	  ei = einext;
555 	}
556 
557       m_key[v] = k;
558       link_roots (par, v);
559       m_next_bucket[v] = m_bucket[k];
560       m_bucket[k] = v;
561 
562       /* Transform semidominators into dominators.  */
563       for (TBB w = m_bucket[par]; w; w = m_next_bucket[w])
564 	{
565 	  k = eval (w);
566 	  if (m_key[k] < m_key[w])
567 	    m_dom[w] = k;
568 	  else
569 	    m_dom[w] = par;
570 	}
571       /* We don't need to cleanup next_bucket[].  */
572       m_bucket[par] = 0;
573     }
574 
575   /* Explicitly define the dominators.  */
576   m_dom[1] = 0;
577   for (TBB v = 2; v <= m_nodes; v++)
578     if (m_dom[v] != m_key[v])
579       m_dom[v] = m_dom[m_dom[v]];
580 }
581 
582 /* Assign dfs numbers starting from NUM to NODE and its sons.  */
583 
584 static void
assign_dfs_numbers(struct et_node * node,int * num)585 assign_dfs_numbers (struct et_node *node, int *num)
586 {
587   struct et_node *son;
588 
589   node->dfs_num_in = (*num)++;
590 
591   if (node->son)
592     {
593       assign_dfs_numbers (node->son, num);
594       for (son = node->son->right; son != node->son; son = son->right)
595 	assign_dfs_numbers (son, num);
596     }
597 
598   node->dfs_num_out = (*num)++;
599 }
600 
601 /* Compute the data necessary for fast resolving of dominator queries in a
602    static dominator tree.  */
603 
604 static void
compute_dom_fast_query(enum cdi_direction dir)605 compute_dom_fast_query (enum cdi_direction dir)
606 {
607   int num = 0;
608   basic_block bb;
609   unsigned int dir_index = dom_convert_dir_to_idx (dir);
610 
611   gcc_checking_assert (dom_info_available_p (dir));
612 
613   if (dom_computed[dir_index] == DOM_OK)
614     return;
615 
616   FOR_ALL_BB_FN (bb, cfun)
617     {
618       if (!bb->dom[dir_index]->father)
619 	assign_dfs_numbers (bb->dom[dir_index], &num);
620     }
621 
622   dom_computed[dir_index] = DOM_OK;
623 }
624 
625 /* The main entry point into this module.  DIR is set depending on whether
626    we want to compute dominators or postdominators.  */
627 
628 void
calculate_dominance_info(cdi_direction dir)629 calculate_dominance_info (cdi_direction dir)
630 {
631   unsigned int dir_index = dom_convert_dir_to_idx (dir);
632 
633   if (dom_computed[dir_index] == DOM_OK)
634     {
635       checking_verify_dominators (dir);
636       return;
637     }
638 
639   timevar_push (TV_DOMINANCE);
640   if (!dom_info_available_p (dir))
641     {
642       gcc_assert (!n_bbs_in_dom_tree[dir_index]);
643 
644       basic_block b;
645       FOR_ALL_BB_FN (b, cfun)
646 	{
647 	  b->dom[dir_index] = et_new_tree (b);
648 	}
649       n_bbs_in_dom_tree[dir_index] = n_basic_blocks_for_fn (cfun);
650 
651       dom_info di (cfun, dir);
652       di.calc_dfs_tree ();
653       di.calc_idoms ();
654 
655       FOR_EACH_BB_FN (b, cfun)
656 	{
657 	  if (basic_block d = di.get_idom (b))
658 	    et_set_father (b->dom[dir_index], d->dom[dir_index]);
659 	}
660 
661       dom_computed[dir_index] = DOM_NO_FAST_QUERY;
662     }
663   else
664     checking_verify_dominators (dir);
665 
666   compute_dom_fast_query (dir);
667 
668   timevar_pop (TV_DOMINANCE);
669 }
670 
671 /* Free dominance information for direction DIR.  */
672 void
free_dominance_info(function * fn,enum cdi_direction dir)673 free_dominance_info (function *fn, enum cdi_direction dir)
674 {
675   basic_block bb;
676   unsigned int dir_index = dom_convert_dir_to_idx (dir);
677 
678   if (!dom_info_available_p (fn, dir))
679     return;
680 
681   FOR_ALL_BB_FN (bb, fn)
682     {
683       et_free_tree_force (bb->dom[dir_index]);
684       bb->dom[dir_index] = NULL;
685     }
686   et_free_pools ();
687 
688   fn->cfg->x_n_bbs_in_dom_tree[dir_index] = 0;
689 
690   fn->cfg->x_dom_computed[dir_index] = DOM_NONE;
691 }
692 
693 void
free_dominance_info(enum cdi_direction dir)694 free_dominance_info (enum cdi_direction dir)
695 {
696   free_dominance_info (cfun, dir);
697 }
698 
699 /* Return the immediate dominator of basic block BB.  */
700 basic_block
get_immediate_dominator(enum cdi_direction dir,basic_block bb)701 get_immediate_dominator (enum cdi_direction dir, basic_block bb)
702 {
703   unsigned int dir_index = dom_convert_dir_to_idx (dir);
704   struct et_node *node = bb->dom[dir_index];
705 
706   gcc_checking_assert (dom_computed[dir_index]);
707 
708   if (!node->father)
709     return NULL;
710 
711   return (basic_block) node->father->data;
712 }
713 
714 /* Set the immediate dominator of the block possibly removing
715    existing edge.  NULL can be used to remove any edge.  */
716 void
set_immediate_dominator(enum cdi_direction dir,basic_block bb,basic_block dominated_by)717 set_immediate_dominator (enum cdi_direction dir, basic_block bb,
718 			 basic_block dominated_by)
719 {
720   unsigned int dir_index = dom_convert_dir_to_idx (dir);
721   struct et_node *node = bb->dom[dir_index];
722 
723   gcc_checking_assert (dom_computed[dir_index]);
724 
725   if (node->father)
726     {
727       if (node->father->data == dominated_by)
728 	return;
729       et_split (node);
730     }
731 
732   if (dominated_by)
733     et_set_father (node, dominated_by->dom[dir_index]);
734 
735   if (dom_computed[dir_index] == DOM_OK)
736     dom_computed[dir_index] = DOM_NO_FAST_QUERY;
737 }
738 
739 /* Returns the list of basic blocks immediately dominated by BB, in the
740    direction DIR.  */
741 vec<basic_block>
get_dominated_by(enum cdi_direction dir,basic_block bb)742 get_dominated_by (enum cdi_direction dir, basic_block bb)
743 {
744   unsigned int dir_index = dom_convert_dir_to_idx (dir);
745   struct et_node *node = bb->dom[dir_index], *son = node->son, *ason;
746   vec<basic_block> bbs = vNULL;
747 
748   gcc_checking_assert (dom_computed[dir_index]);
749 
750   if (!son)
751     return vNULL;
752 
753   bbs.safe_push ((basic_block) son->data);
754   for (ason = son->right; ason != son; ason = ason->right)
755     bbs.safe_push ((basic_block) ason->data);
756 
757   return bbs;
758 }
759 
760 /* Returns the list of basic blocks that are immediately dominated (in
761    direction DIR) by some block between N_REGION ones stored in REGION,
762    except for blocks in the REGION itself.  */
763 
764 vec<basic_block>
get_dominated_by_region(enum cdi_direction dir,basic_block * region,unsigned n_region)765 get_dominated_by_region (enum cdi_direction dir, basic_block *region,
766 			 unsigned n_region)
767 {
768   unsigned i;
769   basic_block dom;
770   vec<basic_block> doms = vNULL;
771 
772   for (i = 0; i < n_region; i++)
773     region[i]->flags |= BB_DUPLICATED;
774   for (i = 0; i < n_region; i++)
775     for (dom = first_dom_son (dir, region[i]);
776 	 dom;
777 	 dom = next_dom_son (dir, dom))
778       if (!(dom->flags & BB_DUPLICATED))
779 	doms.safe_push (dom);
780   for (i = 0; i < n_region; i++)
781     region[i]->flags &= ~BB_DUPLICATED;
782 
783   return doms;
784 }
785 
786 /* Returns the list of basic blocks including BB dominated by BB, in the
787    direction DIR up to DEPTH in the dominator tree.  The DEPTH of zero will
788    produce a vector containing all dominated blocks.  The vector will be sorted
789    in preorder.  */
790 
791 vec<basic_block>
get_dominated_to_depth(enum cdi_direction dir,basic_block bb,int depth)792 get_dominated_to_depth (enum cdi_direction dir, basic_block bb, int depth)
793 {
794   vec<basic_block> bbs = vNULL;
795   unsigned i;
796   unsigned next_level_start;
797 
798   i = 0;
799   bbs.safe_push (bb);
800   next_level_start = 1; /* = bbs.length (); */
801 
802   do
803     {
804       basic_block son;
805 
806       bb = bbs[i++];
807       for (son = first_dom_son (dir, bb);
808 	   son;
809 	   son = next_dom_son (dir, son))
810 	bbs.safe_push (son);
811 
812       if (i == next_level_start && --depth)
813 	next_level_start = bbs.length ();
814     }
815   while (i < next_level_start);
816 
817   return bbs;
818 }
819 
820 /* Returns the list of basic blocks including BB dominated by BB, in the
821    direction DIR.  The vector will be sorted in preorder.  */
822 
823 vec<basic_block>
get_all_dominated_blocks(enum cdi_direction dir,basic_block bb)824 get_all_dominated_blocks (enum cdi_direction dir, basic_block bb)
825 {
826   return get_dominated_to_depth (dir, bb, 0);
827 }
828 
829 /* Redirect all edges pointing to BB to TO.  */
830 void
redirect_immediate_dominators(enum cdi_direction dir,basic_block bb,basic_block to)831 redirect_immediate_dominators (enum cdi_direction dir, basic_block bb,
832 			       basic_block to)
833 {
834   unsigned int dir_index = dom_convert_dir_to_idx (dir);
835   struct et_node *bb_node, *to_node, *son;
836 
837   bb_node = bb->dom[dir_index];
838   to_node = to->dom[dir_index];
839 
840   gcc_checking_assert (dom_computed[dir_index]);
841 
842   if (!bb_node->son)
843     return;
844 
845   while (bb_node->son)
846     {
847       son = bb_node->son;
848 
849       et_split (son);
850       et_set_father (son, to_node);
851     }
852 
853   if (dom_computed[dir_index] == DOM_OK)
854     dom_computed[dir_index] = DOM_NO_FAST_QUERY;
855 }
856 
857 /* Find first basic block in the tree dominating both BB1 and BB2.  */
858 basic_block
nearest_common_dominator(enum cdi_direction dir,basic_block bb1,basic_block bb2)859 nearest_common_dominator (enum cdi_direction dir, basic_block bb1, basic_block bb2)
860 {
861   unsigned int dir_index = dom_convert_dir_to_idx (dir);
862 
863   gcc_checking_assert (dom_computed[dir_index]);
864 
865   if (!bb1)
866     return bb2;
867   if (!bb2)
868     return bb1;
869 
870   return (basic_block) et_nca (bb1->dom[dir_index], bb2->dom[dir_index])->data;
871 }
872 
873 
874 /* Find the nearest common dominator for the basic blocks in BLOCKS,
875    using dominance direction DIR.  */
876 
877 basic_block
nearest_common_dominator_for_set(enum cdi_direction dir,bitmap blocks)878 nearest_common_dominator_for_set (enum cdi_direction dir, bitmap blocks)
879 {
880   unsigned i, first;
881   bitmap_iterator bi;
882   basic_block dom;
883 
884   first = bitmap_first_set_bit (blocks);
885   dom = BASIC_BLOCK_FOR_FN (cfun, first);
886   EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
887     if (dom != BASIC_BLOCK_FOR_FN (cfun, i))
888       dom = nearest_common_dominator (dir, dom, BASIC_BLOCK_FOR_FN (cfun, i));
889 
890   return dom;
891 }
892 
893 /*  Given a dominator tree, we can determine whether one thing
894     dominates another in constant time by using two DFS numbers:
895 
896     1. The number for when we visit a node on the way down the tree
897     2. The number for when we visit a node on the way back up the tree
898 
899     You can view these as bounds for the range of dfs numbers the
900     nodes in the subtree of the dominator tree rooted at that node
901     will contain.
902 
903     The dominator tree is always a simple acyclic tree, so there are
904     only three possible relations two nodes in the dominator tree have
905     to each other:
906 
907     1. Node A is above Node B (and thus, Node A dominates node B)
908 
909      A
910      |
911      C
912     / \
913    B   D
914 
915 
916    In the above case, DFS_Number_In of A will be <= DFS_Number_In of
917    B, and DFS_Number_Out of A will be >= DFS_Number_Out of B.  This is
918    because we must hit A in the dominator tree *before* B on the walk
919    down, and we will hit A *after* B on the walk back up
920 
921    2. Node A is below node B (and thus, node B dominates node A)
922 
923 
924      B
925      |
926      A
927     / \
928    C   D
929 
930    In the above case, DFS_Number_In of A will be >= DFS_Number_In of
931    B, and DFS_Number_Out of A will be <= DFS_Number_Out of B.
932 
933    This is because we must hit A in the dominator tree *after* B on
934    the walk down, and we will hit A *before* B on the walk back up
935 
936    3. Node A and B are siblings (and thus, neither dominates the other)
937 
938      C
939      |
940      D
941     / \
942    A   B
943 
944    In the above case, DFS_Number_In of A will *always* be <=
945    DFS_Number_In of B, and DFS_Number_Out of A will *always* be <=
946    DFS_Number_Out of B.  This is because we will always finish the dfs
947    walk of one of the subtrees before the other, and thus, the dfs
948    numbers for one subtree can't intersect with the range of dfs
949    numbers for the other subtree.  If you swap A and B's position in
950    the dominator tree, the comparison changes direction, but the point
951    is that both comparisons will always go the same way if there is no
952    dominance relationship.
953 
954    Thus, it is sufficient to write
955 
956    A_Dominates_B (node A, node B)
957    {
958      return DFS_Number_In(A) <= DFS_Number_In(B)
959             && DFS_Number_Out (A) >= DFS_Number_Out(B);
960    }
961 
962    A_Dominated_by_B (node A, node B)
963    {
964      return DFS_Number_In(A) >= DFS_Number_In(B)
965             && DFS_Number_Out (A) <= DFS_Number_Out(B);
966    }  */
967 
968 /* Return TRUE in case BB1 is dominated by BB2.  */
969 bool
dominated_by_p(enum cdi_direction dir,const_basic_block bb1,const_basic_block bb2)970 dominated_by_p (enum cdi_direction dir, const_basic_block bb1, const_basic_block bb2)
971 {
972   unsigned int dir_index = dom_convert_dir_to_idx (dir);
973   struct et_node *n1 = bb1->dom[dir_index], *n2 = bb2->dom[dir_index];
974 
975   gcc_checking_assert (dom_computed[dir_index]);
976 
977   if (dom_computed[dir_index] == DOM_OK)
978     return (n1->dfs_num_in >= n2->dfs_num_in
979   	    && n1->dfs_num_out <= n2->dfs_num_out);
980 
981   return et_below (n1, n2);
982 }
983 
984 /* Returns the entry dfs number for basic block BB, in the direction DIR.  */
985 
986 unsigned
bb_dom_dfs_in(enum cdi_direction dir,basic_block bb)987 bb_dom_dfs_in (enum cdi_direction dir, basic_block bb)
988 {
989   unsigned int dir_index = dom_convert_dir_to_idx (dir);
990   struct et_node *n = bb->dom[dir_index];
991 
992   gcc_checking_assert (dom_computed[dir_index] == DOM_OK);
993   return n->dfs_num_in;
994 }
995 
996 /* Returns the exit dfs number for basic block BB, in the direction DIR.  */
997 
998 unsigned
bb_dom_dfs_out(enum cdi_direction dir,basic_block bb)999 bb_dom_dfs_out (enum cdi_direction dir, basic_block bb)
1000 {
1001   unsigned int dir_index = dom_convert_dir_to_idx (dir);
1002   struct et_node *n = bb->dom[dir_index];
1003 
1004   gcc_checking_assert (dom_computed[dir_index] == DOM_OK);
1005   return n->dfs_num_out;
1006 }
1007 
1008 /* Verify invariants of dominator structure.  */
1009 DEBUG_FUNCTION void
verify_dominators(cdi_direction dir)1010 verify_dominators (cdi_direction dir)
1011 {
1012   gcc_assert (dom_info_available_p (dir));
1013 
1014   dom_info di (cfun, dir);
1015   di.calc_dfs_tree ();
1016   di.calc_idoms ();
1017 
1018   bool err = false;
1019   basic_block bb;
1020   FOR_EACH_BB_FN (bb, cfun)
1021     {
1022       basic_block imm_bb = get_immediate_dominator (dir, bb);
1023       if (!imm_bb)
1024 	{
1025 	  error ("dominator of %d status unknown", bb->index);
1026 	  err = true;
1027 	}
1028 
1029       basic_block imm_bb_correct = di.get_idom (bb);
1030       if (imm_bb != imm_bb_correct)
1031 	{
1032 	  error ("dominator of %d should be %d, not %d",
1033 		 bb->index, imm_bb_correct->index, imm_bb->index);
1034 	  err = true;
1035 	}
1036     }
1037 
1038   gcc_assert (!err);
1039 }
1040 
1041 /* Determine immediate dominator (or postdominator, according to DIR) of BB,
1042    assuming that dominators of other blocks are correct.  We also use it to
1043    recompute the dominators in a restricted area, by iterating it until it
1044    reaches a fixed point.  */
1045 
1046 basic_block
recompute_dominator(enum cdi_direction dir,basic_block bb)1047 recompute_dominator (enum cdi_direction dir, basic_block bb)
1048 {
1049   unsigned int dir_index = dom_convert_dir_to_idx (dir);
1050   basic_block dom_bb = NULL;
1051   edge e;
1052   edge_iterator ei;
1053 
1054   gcc_checking_assert (dom_computed[dir_index]);
1055 
1056   if (dir == CDI_DOMINATORS)
1057     {
1058       FOR_EACH_EDGE (e, ei, bb->preds)
1059 	{
1060 	  if (!dominated_by_p (dir, e->src, bb))
1061 	    dom_bb = nearest_common_dominator (dir, dom_bb, e->src);
1062 	}
1063     }
1064   else
1065     {
1066       FOR_EACH_EDGE (e, ei, bb->succs)
1067 	{
1068 	  if (!dominated_by_p (dir, e->dest, bb))
1069 	    dom_bb = nearest_common_dominator (dir, dom_bb, e->dest);
1070 	}
1071     }
1072 
1073   return dom_bb;
1074 }
1075 
1076 /* Use simple heuristics (see iterate_fix_dominators) to determine dominators
1077    of BBS.  We assume that all the immediate dominators except for those of the
1078    blocks in BBS are correct.  If CONSERVATIVE is true, we also assume that the
1079    currently recorded immediate dominators of blocks in BBS really dominate the
1080    blocks.  The basic blocks for that we determine the dominator are removed
1081    from BBS.  */
1082 
1083 static void
prune_bbs_to_update_dominators(vec<basic_block> bbs,bool conservative)1084 prune_bbs_to_update_dominators (vec<basic_block> bbs,
1085 				bool conservative)
1086 {
1087   unsigned i;
1088   bool single;
1089   basic_block bb, dom = NULL;
1090   edge_iterator ei;
1091   edge e;
1092 
1093   for (i = 0; bbs.iterate (i, &bb);)
1094     {
1095       if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1096 	goto succeed;
1097 
1098       if (single_pred_p (bb))
1099 	{
1100 	  set_immediate_dominator (CDI_DOMINATORS, bb, single_pred (bb));
1101 	  goto succeed;
1102 	}
1103 
1104       if (!conservative)
1105 	goto fail;
1106 
1107       single = true;
1108       dom = NULL;
1109       FOR_EACH_EDGE (e, ei, bb->preds)
1110 	{
1111 	  if (dominated_by_p (CDI_DOMINATORS, e->src, bb))
1112 	    continue;
1113 
1114 	  if (!dom)
1115 	    dom = e->src;
1116 	  else
1117 	    {
1118 	      single = false;
1119 	      dom = nearest_common_dominator (CDI_DOMINATORS, dom, e->src);
1120 	    }
1121 	}
1122 
1123       gcc_assert (dom != NULL);
1124       if (single
1125 	  || find_edge (dom, bb))
1126 	{
1127 	  set_immediate_dominator (CDI_DOMINATORS, bb, dom);
1128 	  goto succeed;
1129 	}
1130 
1131 fail:
1132       i++;
1133       continue;
1134 
1135 succeed:
1136       bbs.unordered_remove (i);
1137     }
1138 }
1139 
1140 /* Returns root of the dominance tree in the direction DIR that contains
1141    BB.  */
1142 
1143 static basic_block
root_of_dom_tree(enum cdi_direction dir,basic_block bb)1144 root_of_dom_tree (enum cdi_direction dir, basic_block bb)
1145 {
1146   return (basic_block) et_root (bb->dom[dom_convert_dir_to_idx (dir)])->data;
1147 }
1148 
1149 /* See the comment in iterate_fix_dominators.  Finds the immediate dominators
1150    for the sons of Y, found using the SON and BROTHER arrays representing
1151    the dominance tree of graph G.  BBS maps the vertices of G to the basic
1152    blocks.  */
1153 
1154 static void
determine_dominators_for_sons(struct graph * g,vec<basic_block> bbs,int y,int * son,int * brother)1155 determine_dominators_for_sons (struct graph *g, vec<basic_block> bbs,
1156 			       int y, int *son, int *brother)
1157 {
1158   bitmap gprime;
1159   int i, a, nc;
1160   vec<int> *sccs;
1161   basic_block bb, dom, ybb;
1162   unsigned si;
1163   edge e;
1164   edge_iterator ei;
1165 
1166   if (son[y] == -1)
1167     return;
1168   if (y == (int) bbs.length ())
1169     ybb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1170   else
1171     ybb = bbs[y];
1172 
1173   if (brother[son[y]] == -1)
1174     {
1175       /* Handle the common case Y has just one son specially.  */
1176       bb = bbs[son[y]];
1177       set_immediate_dominator (CDI_DOMINATORS, bb,
1178 			       recompute_dominator (CDI_DOMINATORS, bb));
1179       identify_vertices (g, y, son[y]);
1180       return;
1181     }
1182 
1183   gprime = BITMAP_ALLOC (NULL);
1184   for (a = son[y]; a != -1; a = brother[a])
1185     bitmap_set_bit (gprime, a);
1186 
1187   nc = graphds_scc (g, gprime);
1188   BITMAP_FREE (gprime);
1189 
1190   /* ???  Needed to work around the pre-processor confusion with
1191      using a multi-argument template type as macro argument.  */
1192   typedef vec<int> vec_int_heap;
1193   sccs = XCNEWVEC (vec_int_heap, nc);
1194   for (a = son[y]; a != -1; a = brother[a])
1195     sccs[g->vertices[a].component].safe_push (a);
1196 
1197   for (i = nc - 1; i >= 0; i--)
1198     {
1199       dom = NULL;
1200       FOR_EACH_VEC_ELT (sccs[i], si, a)
1201 	{
1202 	  bb = bbs[a];
1203 	  FOR_EACH_EDGE (e, ei, bb->preds)
1204 	    {
1205 	      if (root_of_dom_tree (CDI_DOMINATORS, e->src) != ybb)
1206 		continue;
1207 
1208 	      dom = nearest_common_dominator (CDI_DOMINATORS, dom, e->src);
1209 	    }
1210 	}
1211 
1212       gcc_assert (dom != NULL);
1213       FOR_EACH_VEC_ELT (sccs[i], si, a)
1214 	{
1215 	  bb = bbs[a];
1216 	  set_immediate_dominator (CDI_DOMINATORS, bb, dom);
1217 	}
1218     }
1219 
1220   for (i = 0; i < nc; i++)
1221     sccs[i].release ();
1222   free (sccs);
1223 
1224   for (a = son[y]; a != -1; a = brother[a])
1225     identify_vertices (g, y, a);
1226 }
1227 
1228 /* Recompute dominance information for basic blocks in the set BBS.  The
1229    function assumes that the immediate dominators of all the other blocks
1230    in CFG are correct, and that there are no unreachable blocks.
1231 
1232    If CONSERVATIVE is true, we additionally assume that all the ancestors of
1233    a block of BBS in the current dominance tree dominate it.  */
1234 
1235 void
iterate_fix_dominators(enum cdi_direction dir,vec<basic_block> bbs,bool conservative)1236 iterate_fix_dominators (enum cdi_direction dir, vec<basic_block> bbs,
1237 			bool conservative)
1238 {
1239   unsigned i;
1240   basic_block bb, dom;
1241   struct graph *g;
1242   int n, y;
1243   size_t dom_i;
1244   edge e;
1245   edge_iterator ei;
1246   int *parent, *son, *brother;
1247   unsigned int dir_index = dom_convert_dir_to_idx (dir);
1248 
1249   /* We only support updating dominators.  There are some problems with
1250      updating postdominators (need to add fake edges from infinite loops
1251      and noreturn functions), and since we do not currently use
1252      iterate_fix_dominators for postdominators, any attempt to handle these
1253      problems would be unused, untested, and almost surely buggy.  We keep
1254      the DIR argument for consistency with the rest of the dominator analysis
1255      interface.  */
1256   gcc_checking_assert (dir == CDI_DOMINATORS && dom_computed[dir_index]);
1257 
1258   /* The algorithm we use takes inspiration from the following papers, although
1259      the details are quite different from any of them:
1260 
1261      [1] G. Ramalingam, T. Reps, An Incremental Algorithm for Maintaining the
1262 	 Dominator Tree of a Reducible Flowgraph
1263      [2]  V. C. Sreedhar, G. R. Gao, Y.-F. Lee: Incremental computation of
1264 	  dominator trees
1265      [3]  K. D. Cooper, T. J. Harvey and K. Kennedy: A Simple, Fast Dominance
1266 	  Algorithm
1267 
1268      First, we use the following heuristics to decrease the size of the BBS
1269      set:
1270        a) if BB has a single predecessor, then its immediate dominator is this
1271 	  predecessor
1272        additionally, if CONSERVATIVE is true:
1273        b) if all the predecessors of BB except for one (X) are dominated by BB,
1274 	  then X is the immediate dominator of BB
1275        c) if the nearest common ancestor of the predecessors of BB is X and
1276 	  X -> BB is an edge in CFG, then X is the immediate dominator of BB
1277 
1278      Then, we need to establish the dominance relation among the basic blocks
1279      in BBS.  We split the dominance tree by removing the immediate dominator
1280      edges from BBS, creating a forest F.  We form a graph G whose vertices
1281      are BBS and ENTRY and X -> Y is an edge of G if there exists an edge
1282      X' -> Y in CFG such that X' belongs to the tree of the dominance forest
1283      whose root is X.  We then determine dominance tree of G.  Note that
1284      for X, Y in BBS, X dominates Y in CFG if and only if X dominates Y in G.
1285      In this step, we can use arbitrary algorithm to determine dominators.
1286      We decided to prefer the algorithm [3] to the algorithm of
1287      Lengauer and Tarjan, since the set BBS is usually small (rarely exceeding
1288      10 during gcc bootstrap), and [3] should perform better in this case.
1289 
1290      Finally, we need to determine the immediate dominators for the basic
1291      blocks of BBS.  If the immediate dominator of X in G is Y, then
1292      the immediate dominator of X in CFG belongs to the tree of F rooted in
1293      Y.  We process the dominator tree T of G recursively, starting from leaves.
1294      Suppose that X_1, X_2, ..., X_k are the sons of Y in T, and that the
1295      subtrees of the dominance tree of CFG rooted in X_i are already correct.
1296      Let G' be the subgraph of G induced by {X_1, X_2, ..., X_k}.  We make
1297      the following observations:
1298        (i) the immediate dominator of all blocks in a strongly connected
1299 	   component of G' is the same
1300        (ii) if X has no predecessors in G', then the immediate dominator of X
1301 	    is the nearest common ancestor of the predecessors of X in the
1302 	    subtree of F rooted in Y
1303      Therefore, it suffices to find the topological ordering of G', and
1304      process the nodes X_i in this order using the rules (i) and (ii).
1305      Then, we contract all the nodes X_i with Y in G, so that the further
1306      steps work correctly.  */
1307 
1308   if (!conservative)
1309     {
1310       /* Split the tree now.  If the idoms of blocks in BBS are not
1311 	 conservatively correct, setting the dominators using the
1312 	 heuristics in prune_bbs_to_update_dominators could
1313 	 create cycles in the dominance "tree", and cause ICE.  */
1314       FOR_EACH_VEC_ELT (bbs, i, bb)
1315 	set_immediate_dominator (CDI_DOMINATORS, bb, NULL);
1316     }
1317 
1318   prune_bbs_to_update_dominators (bbs, conservative);
1319   n = bbs.length ();
1320 
1321   if (n == 0)
1322     return;
1323 
1324   if (n == 1)
1325     {
1326       bb = bbs[0];
1327       set_immediate_dominator (CDI_DOMINATORS, bb,
1328 			       recompute_dominator (CDI_DOMINATORS, bb));
1329       return;
1330     }
1331 
1332   /* Construct the graph G.  */
1333   hash_map<basic_block, int> map (251);
1334   FOR_EACH_VEC_ELT (bbs, i, bb)
1335     {
1336       /* If the dominance tree is conservatively correct, split it now.  */
1337       if (conservative)
1338 	set_immediate_dominator (CDI_DOMINATORS, bb, NULL);
1339       map.put (bb, i);
1340     }
1341   map.put (ENTRY_BLOCK_PTR_FOR_FN (cfun), n);
1342 
1343   g = new_graph (n + 1);
1344   for (y = 0; y < g->n_vertices; y++)
1345     g->vertices[y].data = BITMAP_ALLOC (NULL);
1346   FOR_EACH_VEC_ELT (bbs, i, bb)
1347     {
1348       FOR_EACH_EDGE (e, ei, bb->preds)
1349 	{
1350 	  dom = root_of_dom_tree (CDI_DOMINATORS, e->src);
1351 	  if (dom == bb)
1352 	    continue;
1353 
1354 	  dom_i = *map.get (dom);
1355 
1356 	  /* Do not include parallel edges to G.  */
1357 	  if (!bitmap_set_bit ((bitmap) g->vertices[dom_i].data, i))
1358 	    continue;
1359 
1360 	  add_edge (g, dom_i, i);
1361 	}
1362     }
1363   for (y = 0; y < g->n_vertices; y++)
1364     BITMAP_FREE (g->vertices[y].data);
1365 
1366   /* Find the dominator tree of G.  */
1367   son = XNEWVEC (int, n + 1);
1368   brother = XNEWVEC (int, n + 1);
1369   parent = XNEWVEC (int, n + 1);
1370   graphds_domtree (g, n, parent, son, brother);
1371 
1372   /* Finally, traverse the tree and find the immediate dominators.  */
1373   for (y = n; son[y] != -1; y = son[y])
1374     continue;
1375   while (y != -1)
1376     {
1377       determine_dominators_for_sons (g, bbs, y, son, brother);
1378 
1379       if (brother[y] != -1)
1380 	{
1381 	  y = brother[y];
1382 	  while (son[y] != -1)
1383 	    y = son[y];
1384 	}
1385       else
1386 	y = parent[y];
1387     }
1388 
1389   free (son);
1390   free (brother);
1391   free (parent);
1392 
1393   free_graph (g);
1394 }
1395 
1396 void
add_to_dominance_info(enum cdi_direction dir,basic_block bb)1397 add_to_dominance_info (enum cdi_direction dir, basic_block bb)
1398 {
1399   unsigned int dir_index = dom_convert_dir_to_idx (dir);
1400 
1401   gcc_checking_assert (dom_computed[dir_index] && !bb->dom[dir_index]);
1402 
1403   n_bbs_in_dom_tree[dir_index]++;
1404 
1405   bb->dom[dir_index] = et_new_tree (bb);
1406 
1407   if (dom_computed[dir_index] == DOM_OK)
1408     dom_computed[dir_index] = DOM_NO_FAST_QUERY;
1409 }
1410 
1411 void
delete_from_dominance_info(enum cdi_direction dir,basic_block bb)1412 delete_from_dominance_info (enum cdi_direction dir, basic_block bb)
1413 {
1414   unsigned int dir_index = dom_convert_dir_to_idx (dir);
1415 
1416   gcc_checking_assert (dom_computed[dir_index]);
1417 
1418   et_free_tree (bb->dom[dir_index]);
1419   bb->dom[dir_index] = NULL;
1420   n_bbs_in_dom_tree[dir_index]--;
1421 
1422   if (dom_computed[dir_index] == DOM_OK)
1423     dom_computed[dir_index] = DOM_NO_FAST_QUERY;
1424 }
1425 
1426 /* Returns the first son of BB in the dominator or postdominator tree
1427    as determined by DIR.  */
1428 
1429 basic_block
first_dom_son(enum cdi_direction dir,basic_block bb)1430 first_dom_son (enum cdi_direction dir, basic_block bb)
1431 {
1432   unsigned int dir_index = dom_convert_dir_to_idx (dir);
1433   struct et_node *son = bb->dom[dir_index]->son;
1434 
1435   return (basic_block) (son ? son->data : NULL);
1436 }
1437 
1438 /* Returns the next dominance son after BB in the dominator or postdominator
1439    tree as determined by DIR, or NULL if it was the last one.  */
1440 
1441 basic_block
next_dom_son(enum cdi_direction dir,basic_block bb)1442 next_dom_son (enum cdi_direction dir, basic_block bb)
1443 {
1444   unsigned int dir_index = dom_convert_dir_to_idx (dir);
1445   struct et_node *next = bb->dom[dir_index]->right;
1446 
1447   return (basic_block) (next->father->son == next ? NULL : next->data);
1448 }
1449 
1450 /* Return dominance availability for dominance info DIR.  */
1451 
1452 enum dom_state
dom_info_state(function * fn,enum cdi_direction dir)1453 dom_info_state (function *fn, enum cdi_direction dir)
1454 {
1455   if (!fn->cfg)
1456     return DOM_NONE;
1457 
1458   unsigned int dir_index = dom_convert_dir_to_idx (dir);
1459   return fn->cfg->x_dom_computed[dir_index];
1460 }
1461 
1462 enum dom_state
dom_info_state(enum cdi_direction dir)1463 dom_info_state (enum cdi_direction dir)
1464 {
1465   return dom_info_state (cfun, dir);
1466 }
1467 
1468 /* Set the dominance availability for dominance info DIR to NEW_STATE.  */
1469 
1470 void
set_dom_info_availability(enum cdi_direction dir,enum dom_state new_state)1471 set_dom_info_availability (enum cdi_direction dir, enum dom_state new_state)
1472 {
1473   unsigned int dir_index = dom_convert_dir_to_idx (dir);
1474 
1475   dom_computed[dir_index] = new_state;
1476 }
1477 
1478 /* Returns true if dominance information for direction DIR is available.  */
1479 
1480 bool
dom_info_available_p(function * fn,enum cdi_direction dir)1481 dom_info_available_p (function *fn, enum cdi_direction dir)
1482 {
1483   return dom_info_state (fn, dir) != DOM_NONE;
1484 }
1485 
1486 bool
dom_info_available_p(enum cdi_direction dir)1487 dom_info_available_p (enum cdi_direction dir)
1488 {
1489   return dom_info_available_p (cfun, dir);
1490 }
1491 
1492 DEBUG_FUNCTION void
debug_dominance_info(enum cdi_direction dir)1493 debug_dominance_info (enum cdi_direction dir)
1494 {
1495   basic_block bb, bb2;
1496   FOR_EACH_BB_FN (bb, cfun)
1497     if ((bb2 = get_immediate_dominator (dir, bb)))
1498       fprintf (stderr, "%i %i\n", bb->index, bb2->index);
1499 }
1500 
1501 /* Prints to stderr representation of the dominance tree (for direction DIR)
1502    rooted in ROOT, indented by INDENT tabulators.  If INDENT_FIRST is false,
1503    the first line of the output is not indented.  */
1504 
1505 static void
debug_dominance_tree_1(enum cdi_direction dir,basic_block root,unsigned indent,bool indent_first)1506 debug_dominance_tree_1 (enum cdi_direction dir, basic_block root,
1507 			unsigned indent, bool indent_first)
1508 {
1509   basic_block son;
1510   unsigned i;
1511   bool first = true;
1512 
1513   if (indent_first)
1514     for (i = 0; i < indent; i++)
1515       fprintf (stderr, "\t");
1516   fprintf (stderr, "%d\t", root->index);
1517 
1518   for (son = first_dom_son (dir, root);
1519        son;
1520        son = next_dom_son (dir, son))
1521     {
1522       debug_dominance_tree_1 (dir, son, indent + 1, !first);
1523       first = false;
1524     }
1525 
1526   if (first)
1527     fprintf (stderr, "\n");
1528 }
1529 
1530 /* Prints to stderr representation of the dominance tree (for direction DIR)
1531    rooted in ROOT.  */
1532 
1533 DEBUG_FUNCTION void
debug_dominance_tree(enum cdi_direction dir,basic_block root)1534 debug_dominance_tree (enum cdi_direction dir, basic_block root)
1535 {
1536   debug_dominance_tree_1 (dir, root, 0, false);
1537 }
1538