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