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 */
67typedef 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
74struct 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
124static void init_dom_info (struct dom_info *, enum cdi_direction);
125static void free_dom_info (struct dom_info *);
126static void calc_dfs_tree_nonrec (struct dom_info *, basic_block, bool);
127static void calc_dfs_tree (struct dom_info *, bool);
128static void compress (struct dom_info *, TBB);
129static TBB eval (struct dom_info *, TBB);
130static void link_roots (struct dom_info *, TBB, TBB);
131static void calc_idoms (struct dom_info *, bool);
132void debug_dominance_info (enum cdi_direction);
133void 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
155static void
156init_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
200static unsigned int
201dom_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
209static void
210free_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
232static void
233calc_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
343static void
344calc_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
419static void
420compress (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
439static inline TBB
440eval (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
468static void
469link_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
510static void
511calc_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
605static void
606assign_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
625static void
626compute_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
649void
650calculate_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.  */
693void
694free_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
714void
715free_dominance_info (enum cdi_direction dir)
716{
717  free_dominance_info (cfun, dir);
718}
719
720/* Return the immediate dominator of basic block BB.  */
721basic_block
722get_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.  */
737void
738set_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.  */
762vec<basic_block>
763get_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
785vec<basic_block>
786get_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
812vec<basic_block>
813get_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
844vec<basic_block>
845get_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.  */
851void
852redirect_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.  */
879basic_block
880nearest_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
898basic_block
899nearest_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(B)
986            && DFS_Number_Out (A) <= DFS_Number_Out(B);
987   }  */
988
989/* Return TRUE in case BB1 is dominated by BB2.  */
990bool
991dominated_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
1007unsigned
1008bb_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
1019unsigned
1020bb_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.  */
1030DEBUG_FUNCTION void
1031verify_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
1071basic_block
1072recompute_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
1108static void
1109prune_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
1156fail:
1157      i++;
1158      continue;
1159
1160succeed:
1161      bbs.unordered_remove (i);
1162    }
1163}
1164
1165/* Returns root of the dominance tree in the direction DIR that contains
1166   BB.  */
1167
1168static basic_block
1169root_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
1179static void
1180determine_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
1260void
1261iterate_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
1421void
1422add_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
1436void
1437delete_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
1454basic_block
1455first_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
1466basic_block
1467next_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
1477enum dom_state
1478dom_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
1487enum dom_state
1488dom_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
1495void
1496set_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
1505bool
1506dom_info_available_p (function *fn, enum cdi_direction dir)
1507{
1508  return dom_info_state (fn, dir) != DOM_NONE;
1509}
1510
1511bool
1512dom_info_available_p (enum cdi_direction dir)
1513{
1514  return dom_info_available_p (cfun, dir);
1515}
1516
1517DEBUG_FUNCTION void
1518debug_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
1530static void
1531debug_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
1558DEBUG_FUNCTION void
1559debug_dominance_tree (enum cdi_direction dir, basic_block root)
1560{
1561  debug_dominance_tree_1 (dir, root, 0, false);
1562}
1563