OSDN Git Service

(PREFERRED_DEBUGGING_TYPE): Use DWARF2_DEBUG.
[pf3gnuchains/gcc-fork.git] / gcc / dominance.c
1 /* Calculate (post)dominators in slightly super-linear time.
2    Copyright (C) 2000, 2003, 2004 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 2, 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 COPYING.  If not, write to the Free
19    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20    02111-1307, USA.  */
21
22 /* This file implements the well known algorithm from Lengauer and Tarjan
23    to compute the dominators in a control flow graph.  A basic block D is said
24    to dominate another block X, when all paths from the entry node of the CFG
25    to X go also over D.  The dominance relation is a transitive reflexive
26    relation and its minimal transitive reduction is a tree, called the
27    dominator tree.  So for each block X besides the entry block exists a
28    block I(X), called the immediate dominator of X, which is the parent of X
29    in the dominator tree.
30
31    The algorithm computes this dominator tree implicitly by computing for
32    each block its immediate dominator.  We use tree balancing and path
33    compression, so its the O(e*a(e,v)) variant, where a(e,v) is the very
34    slowly growing functional inverse of the Ackerman function.  */
35
36 #include "config.h"
37 #include "system.h"
38 #include "coretypes.h"
39 #include "tm.h"
40 #include "rtl.h"
41 #include "hard-reg-set.h"
42 #include "obstack.h"
43 #include "basic-block.h"
44 #include "errors.h"
45 #include "et-forest.h"
46
47 /* Whether the dominators and the postdominators are available.  */
48 enum dom_state dom_computed[2];
49
50 /* We name our nodes with integers, beginning with 1.  Zero is reserved for
51    'undefined' or 'end of list'.  The name of each node is given by the dfs
52    number of the corresponding basic block.  Please note, that we include the
53    artificial ENTRY_BLOCK (or EXIT_BLOCK in the post-dom case) in our lists to
54    support multiple entry points.  As it has no real basic block index we use
55    'last_basic_block' for that.  Its dfs number is of course 1.  */
56
57 /* Type of Basic Block aka. TBB */
58 typedef unsigned int TBB;
59
60 /* We work in a poor-mans object oriented fashion, and carry an instance of
61    this structure through all our 'methods'.  It holds various arrays
62    reflecting the (sub)structure of the flowgraph.  Most of them are of type
63    TBB and are also indexed by TBB.  */
64
65 struct dom_info
66 {
67   /* The parent of a node in the DFS tree.  */
68   TBB *dfs_parent;
69   /* For a node x key[x] is roughly the node nearest to the root from which
70      exists a way to x only over nodes behind x.  Such a node is also called
71      semidominator.  */
72   TBB *key;
73   /* The value in path_min[x] is the node y on the path from x to the root of
74      the tree x is in with the smallest key[y].  */
75   TBB *path_min;
76   /* bucket[x] points to the first node of the set of nodes having x as key.  */
77   TBB *bucket;
78   /* And next_bucket[x] points to the next node.  */
79   TBB *next_bucket;
80   /* After the algorithm is done, dom[x] contains the immediate dominator
81      of x.  */
82   TBB *dom;
83
84   /* The following few fields implement the structures needed for disjoint
85      sets.  */
86   /* set_chain[x] is the next node on the path from x to the representant
87      of the set containing x.  If set_chain[x]==0 then x is a root.  */
88   TBB *set_chain;
89   /* set_size[x] is the number of elements in the set named by x.  */
90   unsigned int *set_size;
91   /* set_child[x] is used for balancing the tree representing a set.  It can
92      be understood as the next sibling of x.  */
93   TBB *set_child;
94
95   /* If b is the number of a basic block (BB->index), dfs_order[b] is the
96      number of that node in DFS order counted from 1.  This is an index
97      into most of the other arrays in this structure.  */
98   TBB *dfs_order;
99   /* If x is the DFS-index of a node which corresponds with a basic block,
100      dfs_to_bb[x] is that basic block.  Note, that in our structure there are
101      more nodes that basic blocks, so only dfs_to_bb[dfs_order[bb->index]]==bb
102      is true for every basic block bb, but not the opposite.  */
103   basic_block *dfs_to_bb;
104
105   /* This is the next free DFS number when creating the DFS tree.  */
106   unsigned int dfsnum;
107   /* The number of nodes in the DFS tree (==dfsnum-1).  */
108   unsigned int nodes;
109
110   /* Blocks with bits set here have a fake edge to EXIT.  These are used
111      to turn a DFS forest into a proper tree.  */
112   bitmap fake_exit_edge;
113 };
114
115 static void init_dom_info (struct dom_info *, enum cdi_direction);
116 static void free_dom_info (struct dom_info *);
117 static void calc_dfs_tree_nonrec (struct dom_info *, basic_block,
118                                   enum cdi_direction);
119 static void calc_dfs_tree (struct dom_info *, enum cdi_direction);
120 static void compress (struct dom_info *, TBB);
121 static TBB eval (struct dom_info *, TBB);
122 static void link_roots (struct dom_info *, TBB, TBB);
123 static void calc_idoms (struct dom_info *, enum cdi_direction);
124 void debug_dominance_info (enum cdi_direction);
125
126 /* Keeps track of the*/
127 static unsigned n_bbs_in_dom_tree[2];
128
129 /* Helper macro for allocating and initializing an array,
130    for aesthetic reasons.  */
131 #define init_ar(var, type, num, content)                        \
132   do                                                            \
133     {                                                           \
134       unsigned int i = 1;    /* Catch content == i.  */         \
135       if (! (content))                                          \
136         (var) = xcalloc ((num), sizeof (type));                 \
137       else                                                      \
138         {                                                       \
139           (var) = xmalloc ((num) * sizeof (type));              \
140           for (i = 0; i < num; i++)                             \
141             (var)[i] = (content);                               \
142         }                                                       \
143     }                                                           \
144   while (0)
145
146 /* Allocate all needed memory in a pessimistic fashion (so we round up).
147    This initializes the contents of DI, which already must be allocated.  */
148
149 static void
150 init_dom_info (struct dom_info *di, enum cdi_direction dir)
151 {
152   /* We need memory for n_basic_blocks nodes and the ENTRY_BLOCK or
153      EXIT_BLOCK.  */
154   unsigned int num = n_basic_blocks + 1 + 1;
155   init_ar (di->dfs_parent, TBB, num, 0);
156   init_ar (di->path_min, TBB, num, i);
157   init_ar (di->key, TBB, num, i);
158   init_ar (di->dom, TBB, num, 0);
159
160   init_ar (di->bucket, TBB, num, 0);
161   init_ar (di->next_bucket, TBB, num, 0);
162
163   init_ar (di->set_chain, TBB, num, 0);
164   init_ar (di->set_size, unsigned int, num, 1);
165   init_ar (di->set_child, TBB, num, 0);
166
167   init_ar (di->dfs_order, TBB, (unsigned int) last_basic_block + 1, 0);
168   init_ar (di->dfs_to_bb, basic_block, num, 0);
169
170   di->dfsnum = 1;
171   di->nodes = 0;
172
173   di->fake_exit_edge = dir ? BITMAP_XMALLOC () : NULL;
174 }
175
176 #undef init_ar
177
178 /* Free all allocated memory in DI, but not DI itself.  */
179
180 static void
181 free_dom_info (struct dom_info *di)
182 {
183   free (di->dfs_parent);
184   free (di->path_min);
185   free (di->key);
186   free (di->dom);
187   free (di->bucket);
188   free (di->next_bucket);
189   free (di->set_chain);
190   free (di->set_size);
191   free (di->set_child);
192   free (di->dfs_order);
193   free (di->dfs_to_bb);
194   BITMAP_XFREE (di->fake_exit_edge);
195 }
196
197 /* The nonrecursive variant of creating a DFS tree.  DI is our working
198    structure, BB the starting basic block for this tree and REVERSE
199    is true, if predecessors should be visited instead of successors of a
200    node.  After this is done all nodes reachable from BB were visited, have
201    assigned their dfs number and are linked together to form a tree.  */
202
203 static void
204 calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb,
205                       enum cdi_direction reverse)
206 {
207   /* We call this _only_ if bb is not already visited.  */
208   edge e;
209   TBB child_i, my_i = 0;
210   edge_iterator *stack;
211   edge_iterator ei, einext;
212   int sp;
213   /* Start block (ENTRY_BLOCK_PTR for forward problem, EXIT_BLOCK for backward
214      problem).  */
215   basic_block en_block;
216   /* Ending block.  */
217   basic_block ex_block;
218
219   stack = xmalloc ((n_basic_blocks + 3) * sizeof (edge_iterator));
220   sp = 0;
221
222   /* Initialize our border blocks, and the first edge.  */
223   if (reverse)
224     {
225       ei = ei_start (bb->preds);
226       en_block = EXIT_BLOCK_PTR;
227       ex_block = ENTRY_BLOCK_PTR;
228     }
229   else
230     {
231       ei = ei_start (bb->succs);
232       en_block = ENTRY_BLOCK_PTR;
233       ex_block = EXIT_BLOCK_PTR;
234     }
235
236   /* When the stack is empty we break out of this loop.  */
237   while (1)
238     {
239       basic_block bn;
240
241       /* This loop traverses edges e in depth first manner, and fills the
242          stack.  */
243       while (!ei_end_p (ei))
244         {
245           e = ei_edge (ei);
246
247           /* Deduce from E the current and the next block (BB and BN), and the
248              next edge.  */
249           if (reverse)
250             {
251               bn = e->src;
252
253               /* If the next node BN is either already visited or a border
254                  block the current edge is useless, and simply overwritten
255                  with the next edge out of the current node.  */
256               if (bn == ex_block || di->dfs_order[bn->index])
257                 {
258                   ei_next (&ei);
259                   continue;
260                 }
261               bb = e->dest;
262               einext = ei_start (bn->preds);
263             }
264           else
265             {
266               bn = e->dest;
267               if (bn == ex_block || di->dfs_order[bn->index])
268                 {
269                   ei_next (&ei);
270                   continue;
271                 }
272               bb = e->src;
273               einext = ei_start (bn->succs);
274             }
275
276           gcc_assert (bn != en_block);
277
278           /* Fill the DFS tree info calculatable _before_ recursing.  */
279           if (bb != en_block)
280             my_i = di->dfs_order[bb->index];
281           else
282             my_i = di->dfs_order[last_basic_block];
283           child_i = di->dfs_order[bn->index] = di->dfsnum++;
284           di->dfs_to_bb[child_i] = bn;
285           di->dfs_parent[child_i] = my_i;
286
287           /* Save the current point in the CFG on the stack, and recurse.  */
288           stack[sp++] = ei;
289           ei = einext;
290         }
291
292       if (!sp)
293         break;
294       ei = stack[--sp];
295
296       /* OK.  The edge-list was exhausted, meaning normally we would
297          end the recursion.  After returning from the recursive call,
298          there were (may be) other statements which were run after a
299          child node was completely considered by DFS.  Here is the
300          point to do it in the non-recursive variant.
301          E.g. The block just completed is in e->dest for forward DFS,
302          the block not yet completed (the parent of the one above)
303          in e->src.  This could be used e.g. for computing the number of
304          descendants or the tree depth.  */
305       ei_next (&ei);
306     }
307   free (stack);
308 }
309
310 /* The main entry for calculating the DFS tree or forest.  DI is our working
311    structure and REVERSE is true, if we are interested in the reverse flow
312    graph.  In that case the result is not necessarily a tree but a forest,
313    because there may be nodes from which the EXIT_BLOCK is unreachable.  */
314
315 static void
316 calc_dfs_tree (struct dom_info *di, enum cdi_direction reverse)
317 {
318   /* The first block is the ENTRY_BLOCK (or EXIT_BLOCK if REVERSE).  */
319   basic_block begin = reverse ? EXIT_BLOCK_PTR : ENTRY_BLOCK_PTR;
320   di->dfs_order[last_basic_block] = di->dfsnum;
321   di->dfs_to_bb[di->dfsnum] = begin;
322   di->dfsnum++;
323
324   calc_dfs_tree_nonrec (di, begin, reverse);
325
326   if (reverse)
327     {
328       /* In the post-dom case we may have nodes without a path to EXIT_BLOCK.
329          They are reverse-unreachable.  In the dom-case we disallow such
330          nodes, but in post-dom we have to deal with them.
331
332          There are two situations in which this occurs.  First, noreturn
333          functions.  Second, infinite loops.  In the first case we need to
334          pretend that there is an edge to the exit block.  In the second
335          case, we wind up with a forest.  We need to process all noreturn
336          blocks before we know if we've got any infinite loops.  */
337
338       basic_block b;
339       bool saw_unconnected = false;
340
341       FOR_EACH_BB_REVERSE (b)
342         {
343           if (EDGE_COUNT (b->succs) > 0)
344             {
345               if (di->dfs_order[b->index] == 0)
346                 saw_unconnected = true;
347               continue;
348             }
349           bitmap_set_bit (di->fake_exit_edge, b->index);
350           di->dfs_order[b->index] = di->dfsnum;
351           di->dfs_to_bb[di->dfsnum] = b;
352           di->dfs_parent[di->dfsnum] = di->dfs_order[last_basic_block];
353           di->dfsnum++;
354           calc_dfs_tree_nonrec (di, b, reverse);
355         }
356
357       if (saw_unconnected)
358         {
359           FOR_EACH_BB_REVERSE (b)
360             {
361               if (di->dfs_order[b->index])
362                 continue;
363               bitmap_set_bit (di->fake_exit_edge, b->index);
364               di->dfs_order[b->index] = di->dfsnum;
365               di->dfs_to_bb[di->dfsnum] = b;
366               di->dfs_parent[di->dfsnum] = di->dfs_order[last_basic_block];
367               di->dfsnum++;
368               calc_dfs_tree_nonrec (di, b, reverse);
369             }
370         }
371     }
372
373   di->nodes = di->dfsnum - 1;
374
375   /* This aborts e.g. when there is _no_ path from ENTRY to EXIT at all.  */
376   gcc_assert (di->nodes == (unsigned int) n_basic_blocks + 1);
377 }
378
379 /* Compress the path from V to the root of its set and update path_min at the
380    same time.  After compress(di, V) set_chain[V] is the root of the set V is
381    in and path_min[V] is the node with the smallest key[] value on the path
382    from V to that root.  */
383
384 static void
385 compress (struct dom_info *di, TBB v)
386 {
387   /* Btw. It's not worth to unrecurse compress() as the depth is usually not
388      greater than 5 even for huge graphs (I've not seen call depth > 4).
389      Also performance wise compress() ranges _far_ behind eval().  */
390   TBB parent = di->set_chain[v];
391   if (di->set_chain[parent])
392     {
393       compress (di, parent);
394       if (di->key[di->path_min[parent]] < di->key[di->path_min[v]])
395         di->path_min[v] = di->path_min[parent];
396       di->set_chain[v] = di->set_chain[parent];
397     }
398 }
399
400 /* Compress the path from V to the set root of V if needed (when the root has
401    changed since the last call).  Returns the node with the smallest key[]
402    value on the path from V to the root.  */
403
404 static inline TBB
405 eval (struct dom_info *di, TBB v)
406 {
407   /* The representant of the set V is in, also called root (as the set
408      representation is a tree).  */
409   TBB rep = di->set_chain[v];
410
411   /* V itself is the root.  */
412   if (!rep)
413     return di->path_min[v];
414
415   /* Compress only if necessary.  */
416   if (di->set_chain[rep])
417     {
418       compress (di, v);
419       rep = di->set_chain[v];
420     }
421
422   if (di->key[di->path_min[rep]] >= di->key[di->path_min[v]])
423     return di->path_min[v];
424   else
425     return di->path_min[rep];
426 }
427
428 /* This essentially merges the two sets of V and W, giving a single set with
429    the new root V.  The internal representation of these disjoint sets is a
430    balanced tree.  Currently link(V,W) is only used with V being the parent
431    of W.  */
432
433 static void
434 link_roots (struct dom_info *di, TBB v, TBB w)
435 {
436   TBB s = w;
437
438   /* Rebalance the tree.  */
439   while (di->key[di->path_min[w]] < di->key[di->path_min[di->set_child[s]]])
440     {
441       if (di->set_size[s] + di->set_size[di->set_child[di->set_child[s]]]
442           >= 2 * di->set_size[di->set_child[s]])
443         {
444           di->set_chain[di->set_child[s]] = s;
445           di->set_child[s] = di->set_child[di->set_child[s]];
446         }
447       else
448         {
449           di->set_size[di->set_child[s]] = di->set_size[s];
450           s = di->set_chain[s] = di->set_child[s];
451         }
452     }
453
454   di->path_min[s] = di->path_min[w];
455   di->set_size[v] += di->set_size[w];
456   if (di->set_size[v] < 2 * di->set_size[w])
457     {
458       TBB tmp = s;
459       s = di->set_child[v];
460       di->set_child[v] = tmp;
461     }
462
463   /* Merge all subtrees.  */
464   while (s)
465     {
466       di->set_chain[s] = v;
467       s = di->set_child[s];
468     }
469 }
470
471 /* This calculates the immediate dominators (or post-dominators if REVERSE is
472    true).  DI is our working structure and should hold the DFS forest.
473    On return the immediate dominator to node V is in di->dom[V].  */
474
475 static void
476 calc_idoms (struct dom_info *di, enum cdi_direction reverse)
477 {
478   TBB v, w, k, par;
479   basic_block en_block;
480   edge_iterator ei, einext;
481
482   if (reverse)
483     en_block = EXIT_BLOCK_PTR;
484   else
485     en_block = ENTRY_BLOCK_PTR;
486
487   /* Go backwards in DFS order, to first look at the leafs.  */
488   v = di->nodes;
489   while (v > 1)
490     {
491       basic_block bb = di->dfs_to_bb[v];
492       edge e;
493
494       par = di->dfs_parent[v];
495       k = v;
496
497       ei = (reverse) ? ei_start (bb->succs) : ei_start (bb->preds);
498
499       if (reverse)
500         {
501           /* If this block has a fake edge to exit, process that first.  */
502           if (bitmap_bit_p (di->fake_exit_edge, bb->index))
503             {
504               einext = ei;
505               einext.index = 0;
506               goto do_fake_exit_edge;
507             }
508         }
509
510       /* Search all direct predecessors for the smallest node with a path
511          to them.  That way we have the smallest node with also a path to
512          us only over nodes behind us.  In effect we search for our
513          semidominator.  */
514       while (!ei_end_p (ei))
515         {
516           TBB k1;
517           basic_block b;
518
519           e = ei_edge (ei);
520           b = (reverse) ? e->dest : e->src;
521           einext = ei;
522           ei_next (&einext);
523
524           if (b == en_block)
525             {
526             do_fake_exit_edge:
527               k1 = di->dfs_order[last_basic_block];
528             }
529           else
530             k1 = di->dfs_order[b->index];
531
532           /* Call eval() only if really needed.  If k1 is above V in DFS tree,
533              then we know, that eval(k1) == k1 and key[k1] == k1.  */
534           if (k1 > v)
535             k1 = di->key[eval (di, k1)];
536           if (k1 < k)
537             k = k1;
538
539           ei = einext;
540         }
541
542       di->key[v] = k;
543       link_roots (di, par, v);
544       di->next_bucket[v] = di->bucket[k];
545       di->bucket[k] = v;
546
547       /* Transform semidominators into dominators.  */
548       for (w = di->bucket[par]; w; w = di->next_bucket[w])
549         {
550           k = eval (di, w);
551           if (di->key[k] < di->key[w])
552             di->dom[w] = k;
553           else
554             di->dom[w] = par;
555         }
556       /* We don't need to cleanup next_bucket[].  */
557       di->bucket[par] = 0;
558       v--;
559     }
560
561   /* Explicitly define the dominators.  */
562   di->dom[1] = 0;
563   for (v = 2; v <= di->nodes; v++)
564     if (di->dom[v] != di->key[v])
565       di->dom[v] = di->dom[di->dom[v]];
566 }
567
568 /* Assign dfs numbers starting from NUM to NODE and its sons.  */
569
570 static void
571 assign_dfs_numbers (struct et_node *node, int *num)
572 {
573   struct et_node *son;
574
575   node->dfs_num_in = (*num)++;
576
577   if (node->son)
578     {
579       assign_dfs_numbers (node->son, num);
580       for (son = node->son->right; son != node->son; son = son->right)
581         assign_dfs_numbers (son, num);
582     }
583
584   node->dfs_num_out = (*num)++;
585 }
586
587 /* Compute the data necessary for fast resolving of dominator queries in a
588    static dominator tree.  */
589
590 static void
591 compute_dom_fast_query (enum cdi_direction dir)
592 {
593   int num = 0;
594   basic_block bb;
595
596   gcc_assert (dom_info_available_p (dir));
597
598   if (dom_computed[dir] == DOM_OK)
599     return;
600
601   FOR_ALL_BB (bb)
602     {
603       if (!bb->dom[dir]->father)
604         assign_dfs_numbers (bb->dom[dir], &num);
605     }
606
607   dom_computed[dir] = DOM_OK;
608 }
609
610 /* The main entry point into this module.  DIR is set depending on whether
611    we want to compute dominators or postdominators.  */
612
613 void
614 calculate_dominance_info (enum cdi_direction dir)
615 {
616   struct dom_info di;
617   basic_block b;
618
619   if (dom_computed[dir] == DOM_OK)
620     return;
621
622   if (!dom_info_available_p (dir))
623     {
624       gcc_assert (!n_bbs_in_dom_tree[dir]);
625
626       FOR_ALL_BB (b)
627         {
628           b->dom[dir] = et_new_tree (b);
629         }
630       n_bbs_in_dom_tree[dir] = n_basic_blocks + 2;
631
632       init_dom_info (&di, dir);
633       calc_dfs_tree (&di, dir);
634       calc_idoms (&di, dir);
635
636       FOR_EACH_BB (b)
637         {
638           TBB d = di.dom[di.dfs_order[b->index]];
639
640           if (di.dfs_to_bb[d])
641             et_set_father (b->dom[dir], di.dfs_to_bb[d]->dom[dir]);
642         }
643
644       free_dom_info (&di);
645       dom_computed[dir] = DOM_NO_FAST_QUERY;
646     }
647
648   compute_dom_fast_query (dir);
649 }
650
651 /* Free dominance information for direction DIR.  */
652 void
653 free_dominance_info (enum cdi_direction dir)
654 {
655   basic_block bb;
656
657   if (!dom_info_available_p (dir))
658     return;
659
660   FOR_ALL_BB (bb)
661     {
662       delete_from_dominance_info (dir, bb);
663     }
664
665   /* If there are any nodes left, something is wrong.  */
666   gcc_assert (!n_bbs_in_dom_tree[dir]);
667
668   dom_computed[dir] = DOM_NONE;
669 }
670
671 /* Return the immediate dominator of basic block BB.  */
672 basic_block
673 get_immediate_dominator (enum cdi_direction dir, basic_block bb)
674 {
675   struct et_node *node = bb->dom[dir];
676
677   gcc_assert (dom_computed[dir]);
678
679   if (!node->father)
680     return NULL;
681
682   return node->father->data;
683 }
684
685 /* Set the immediate dominator of the block possibly removing
686    existing edge.  NULL can be used to remove any edge.  */
687 inline void
688 set_immediate_dominator (enum cdi_direction dir, basic_block bb,
689                          basic_block dominated_by)
690 {
691   struct et_node *node = bb->dom[dir];
692
693   gcc_assert (dom_computed[dir]);
694
695   if (node->father)
696     {
697       if (node->father->data == dominated_by)
698         return;
699       et_split (node);
700     }
701
702   if (dominated_by)
703     et_set_father (node, dominated_by->dom[dir]);
704
705   if (dom_computed[dir] == DOM_OK)
706     dom_computed[dir] = DOM_NO_FAST_QUERY;
707 }
708
709 /* Store all basic blocks immediately dominated by BB into BBS and return
710    their number.  */
711 int
712 get_dominated_by (enum cdi_direction dir, basic_block bb, basic_block **bbs)
713 {
714   int n;
715   struct et_node *node = bb->dom[dir], *son = node->son, *ason;
716
717   gcc_assert (dom_computed[dir]);
718
719   if (!son)
720     {
721       *bbs = NULL;
722       return 0;
723     }
724
725   for (ason = son->right, n = 1; ason != son; ason = ason->right)
726     n++;
727
728   *bbs = xmalloc (n * sizeof (basic_block));
729   (*bbs)[0] = son->data;
730   for (ason = son->right, n = 1; ason != son; ason = ason->right)
731     (*bbs)[n++] = ason->data;
732
733   return n;
734 }
735
736 /* Find all basic blocks that are immediately dominated (in direction DIR)
737    by some block between N_REGION ones stored in REGION, except for blocks
738    in the REGION itself.  The found blocks are stored to DOMS and their number
739    is returned.  */
740
741 unsigned
742 get_dominated_by_region (enum cdi_direction dir, basic_block *region,
743                          unsigned n_region, basic_block *doms)
744 {
745   unsigned n_doms = 0, i;
746   basic_block dom;
747
748   for (i = 0; i < n_region; i++)
749     region[i]->rbi->duplicated = 1;
750   for (i = 0; i < n_region; i++)
751     for (dom = first_dom_son (dir, region[i]);
752          dom;
753          dom = next_dom_son (dir, dom))
754       if (!dom->rbi->duplicated)
755         doms[n_doms++] = dom;
756   for (i = 0; i < n_region; i++)
757     region[i]->rbi->duplicated = 0;
758
759   return n_doms;
760 }
761
762 /* Redirect all edges pointing to BB to TO.  */
763 void
764 redirect_immediate_dominators (enum cdi_direction dir, basic_block bb,
765                                basic_block to)
766 {
767   struct et_node *bb_node = bb->dom[dir], *to_node = to->dom[dir], *son;
768
769   gcc_assert (dom_computed[dir]);
770
771   if (!bb_node->son)
772     return;
773
774   while (bb_node->son)
775     {
776       son = bb_node->son;
777
778       et_split (son);
779       et_set_father (son, to_node);
780     }
781
782   if (dom_computed[dir] == DOM_OK)
783     dom_computed[dir] = DOM_NO_FAST_QUERY;
784 }
785
786 /* Find first basic block in the tree dominating both BB1 and BB2.  */
787 basic_block
788 nearest_common_dominator (enum cdi_direction dir, basic_block bb1, basic_block bb2)
789 {
790   gcc_assert (dom_computed[dir]);
791
792   if (!bb1)
793     return bb2;
794   if (!bb2)
795     return bb1;
796
797   return et_nca (bb1->dom[dir], bb2->dom[dir])->data;
798 }
799
800 /* Return TRUE in case BB1 is dominated by BB2.  */
801 bool
802 dominated_by_p (enum cdi_direction dir, basic_block bb1, basic_block bb2)
803
804   struct et_node *n1 = bb1->dom[dir], *n2 = bb2->dom[dir];
805
806   gcc_assert (dom_computed[dir]);
807
808   if (dom_computed[dir] == DOM_OK)
809     return (n1->dfs_num_in >= n2->dfs_num_in
810             && n1->dfs_num_out <= n2->dfs_num_out);
811
812   return et_below (n1, n2);
813 }
814
815 /* Verify invariants of dominator structure.  */
816 void
817 verify_dominators (enum cdi_direction dir)
818 {
819   int err = 0;
820   basic_block bb;
821
822   gcc_assert (dom_info_available_p (dir));
823
824   FOR_EACH_BB (bb)
825     {
826       basic_block dom_bb;
827       basic_block imm_bb;
828
829       dom_bb = recount_dominator (dir, bb);
830       imm_bb = get_immediate_dominator (dir, bb);
831       if (dom_bb != imm_bb)
832         {
833           if ((dom_bb == NULL) || (imm_bb == NULL))
834             error ("dominator of %d status unknown", bb->index);
835           else
836             error ("dominator of %d should be %d, not %d",
837                    bb->index, dom_bb->index, imm_bb->index);
838           err = 1;
839         }
840     }
841
842   if (dir == CDI_DOMINATORS)
843     {
844       FOR_EACH_BB (bb)
845         {
846           if (!dominated_by_p (dir, bb, ENTRY_BLOCK_PTR))
847             {
848               error ("ENTRY does not dominate bb %d", bb->index);
849               err = 1;
850             }
851         }
852     }
853
854   gcc_assert (!err);
855 }
856
857 /* Determine immediate dominator (or postdominator, according to DIR) of BB,
858    assuming that dominators of other blocks are correct.  We also use it to
859    recompute the dominators in a restricted area, by iterating it until it
860    reaches a fixed point.  */
861
862 basic_block
863 recount_dominator (enum cdi_direction dir, basic_block bb)
864 {
865   basic_block dom_bb = NULL;
866   edge e;
867   edge_iterator ei;
868
869   gcc_assert (dom_computed[dir]);
870
871   if (dir == CDI_DOMINATORS)
872     {
873       FOR_EACH_EDGE (e, ei, bb->preds)
874         {
875           /* Ignore the predecessors that either are not reachable from
876              the entry block, or whose dominator was not determined yet.  */
877           if (!dominated_by_p (dir, e->src, ENTRY_BLOCK_PTR))
878             continue;
879
880           if (!dominated_by_p (dir, e->src, bb))
881             dom_bb = nearest_common_dominator (dir, dom_bb, e->src);
882         }
883     }
884   else
885     {
886       FOR_EACH_EDGE (e, ei, bb->succs)
887         {
888           if (!dominated_by_p (dir, e->dest, bb))
889             dom_bb = nearest_common_dominator (dir, dom_bb, e->dest);
890         }
891     }
892
893   return dom_bb;
894 }
895
896 /* Iteratively recount dominators of BBS. The change is supposed to be local
897    and not to grow further.  */
898 void
899 iterate_fix_dominators (enum cdi_direction dir, basic_block *bbs, int n)
900 {
901   int i, changed = 1;
902   basic_block old_dom, new_dom;
903
904   gcc_assert (dom_computed[dir]);
905
906   for (i = 0; i < n; i++)
907     set_immediate_dominator (dir, bbs[i], NULL);
908
909   while (changed)
910     {
911       changed = 0;
912       for (i = 0; i < n; i++)
913         {
914           old_dom = get_immediate_dominator (dir, bbs[i]);
915           new_dom = recount_dominator (dir, bbs[i]);
916           if (old_dom != new_dom)
917             {
918               changed = 1;
919               set_immediate_dominator (dir, bbs[i], new_dom);
920             }
921         }
922     }
923
924   for (i = 0; i < n; i++)
925     gcc_assert (get_immediate_dominator (dir, bbs[i]));
926 }
927
928 void
929 add_to_dominance_info (enum cdi_direction dir, basic_block bb)
930 {
931   gcc_assert (dom_computed[dir]);
932   gcc_assert (!bb->dom[dir]);
933
934   n_bbs_in_dom_tree[dir]++;
935   
936   bb->dom[dir] = et_new_tree (bb);
937
938   if (dom_computed[dir] == DOM_OK)
939     dom_computed[dir] = DOM_NO_FAST_QUERY;
940 }
941
942 void
943 delete_from_dominance_info (enum cdi_direction dir, basic_block bb)
944 {
945   gcc_assert (dom_computed[dir]);
946
947   et_free_tree (bb->dom[dir]);
948   bb->dom[dir] = NULL;
949   n_bbs_in_dom_tree[dir]--;
950
951   if (dom_computed[dir] == DOM_OK)
952     dom_computed[dir] = DOM_NO_FAST_QUERY;
953 }
954
955 /* Returns the first son of BB in the dominator or postdominator tree
956    as determined by DIR.  */
957
958 basic_block
959 first_dom_son (enum cdi_direction dir, basic_block bb)
960 {
961   struct et_node *son = bb->dom[dir]->son;
962
963   return son ? son->data : NULL;
964 }
965
966 /* Returns the next dominance son after BB in the dominator or postdominator
967    tree as determined by DIR, or NULL if it was the last one.  */
968
969 basic_block
970 next_dom_son (enum cdi_direction dir, basic_block bb)
971 {
972   struct et_node *next = bb->dom[dir]->right;
973
974   return next->father->son == next ? NULL : next->data;
975 }
976
977 /* Returns true if dominance information for direction DIR is available.  */
978
979 bool
980 dom_info_available_p (enum cdi_direction dir)
981 {
982   return dom_computed[dir] != DOM_NONE;
983 }
984
985 void
986 debug_dominance_info (enum cdi_direction dir)
987 {
988   basic_block bb, bb2;
989   FOR_EACH_BB (bb)
990     if ((bb2 = get_immediate_dominator (dir, bb)))
991       fprintf (stderr, "%i %i\n", bb->index, bb2->index);
992 }