Backport from GCC mainline.
[platform/upstream/linaro-gcc.git] / gcc / dominance.c
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>
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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> 
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> 
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> 
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> 
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
1487 dom_info_available_p (enum cdi_direction dir)
1488 {
1489   return dom_info_available_p (cfun, dir);
1490 }
1491
1492 DEBUG_FUNCTION void
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
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
1534 debug_dominance_tree (enum cdi_direction dir, basic_block root)
1535 {
1536   debug_dominance_tree_1 (dir, root, 0, false);
1537 }