1164146Sdes/* Calculate (post)dominators in slightly super-linear time.
276259Sgreen   Copyright (C) 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
376259Sgreen   Contributed by Michael Matz (matz@ifh.de).
476259Sgreen
576259Sgreen   This file is part of GCC.
676259Sgreen
776259Sgreen   GCC is free software; you can redistribute it and/or modify it
876259Sgreen   under the terms of the GNU General Public License as published by
976259Sgreen   the Free Software Foundation; either version 2, or (at your option)
1076259Sgreen   any later version.
1176259Sgreen
1276259Sgreen   GCC is distributed in the hope that it will be useful, but WITHOUT
1376259Sgreen   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1476259Sgreen   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
1576259Sgreen   License for more details.
1676259Sgreen
1776259Sgreen   You should have received a copy of the GNU General Public License
1876259Sgreen   along with GCC; see the file COPYING.  If not, write to the Free
1976259Sgreen   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2076259Sgreen   02110-1301, USA.  */
2176259Sgreen
2276259Sgreen/* This file implements the well known algorithm from Lengauer and Tarjan
2376259Sgreen   to compute the dominators in a control flow graph.  A basic block D is said
2476259Sgreen   to dominate another block X, when all paths from the entry node of the CFG
2576259Sgreen   to X go also over D.  The dominance relation is a transitive reflexive
2676259Sgreen   relation and its minimal transitive reduction is a tree, called the
2776259Sgreen   dominator tree.  So for each block X besides the entry block exists a
28162852Sdes   block I(X), called the immediate dominator of X, which is the parent of X
29162852Sdes   in the dominator tree.
3076259Sgreen
3176259Sgreen   The algorithm computes this dominator tree implicitly by computing for
3276259Sgreen   each block its immediate dominator.  We use tree balancing and path
33162852Sdes   compression, so it's the O(e*a(e,v)) variant, where a(e,v) is the very
34162852Sdes   slowly growing functional inverse of the Ackerman function.  */
35162852Sdes
3676259Sgreen#include "config.h"
3776259Sgreen#include "system.h"
3876259Sgreen#include "coretypes.h"
3976259Sgreen#include "tm.h"
4076259Sgreen#include "rtl.h"
4176259Sgreen#include "hard-reg-set.h"
4276259Sgreen#include "obstack.h"
4376259Sgreen#include "basic-block.h"
4476259Sgreen#include "toplev.h"
4576259Sgreen#include "et-forest.h"
46126274Sdes
47126274Sdes/* Whether the dominators and the postdominators are available.  */
4876259Sgreenenum dom_state dom_computed[2];
4976259Sgreen
5092555Sdes/* We name our nodes with integers, beginning with 1.  Zero is reserved for
5176259Sgreen   'undefined' or 'end of list'.  The name of each node is given by the dfs
52106121Sdes   number of the corresponding basic block.  Please note, that we include the
5392555Sdes   artificial ENTRY_BLOCK (or EXIT_BLOCK in the post-dom case) in our lists to
5476259Sgreen   support multiple entry points.  As it has no real basic block index we use
5576259Sgreen   'last_basic_block' for that.  Its dfs number is of course 1.  */
5676259Sgreen
5776259Sgreen/* Type of Basic Block aka. TBB */
5876259Sgreentypedef unsigned int TBB;
5976259Sgreen
6076259Sgreen/* We work in a poor-mans object oriented fashion, and carry an instance of
6176259Sgreen   this structure through all our 'methods'.  It holds various arrays
6292555Sdes   reflecting the (sub)structure of the flowgraph.  Most of them are of type
6376259Sgreen   TBB and are also indexed by TBB.  */
6476259Sgreen
6592555Sdesstruct dom_info
6692555Sdes{
6776259Sgreen  /* The parent of a node in the DFS tree.  */
6892555Sdes  TBB *dfs_parent;
6992555Sdes  /* For a node x key[x] is roughly the node nearest to the root from which
7076259Sgreen     exists a way to x only over nodes behind x.  Such a node is also called
7176259Sgreen     semidominator.  */
7276259Sgreen  TBB *key;
7376259Sgreen  /* The value in path_min[x] is the node y on the path from x to the root of
7476259Sgreen     the tree x is in with the smallest key[y].  */
7599060Sdes  TBB *path_min;
7676259Sgreen  /* bucket[x] points to the first node of the set of nodes having x as key.  */
7776259Sgreen  TBB *bucket;
7876259Sgreen  /* And next_bucket[x] points to the next node.  */
7976259Sgreen  TBB *next_bucket;
8076259Sgreen  /* After the algorithm is done, dom[x] contains the immediate dominator
8176259Sgreen     of x.  */
8276259Sgreen  TBB *dom;
8376259Sgreen
8476259Sgreen  /* The following few fields implement the structures needed for disjoint
8576259Sgreen     sets.  */
8676259Sgreen  /* set_chain[x] is the next node on the path from x to the representant
87106121Sdes     of the set containing x.  If set_chain[x]==0 then x is a root.  */
88106121Sdes  TBB *set_chain;
89106121Sdes  /* set_size[x] is the number of elements in the set named by x.  */
90106121Sdes  unsigned int *set_size;
9176259Sgreen  /* set_child[x] is used for balancing the tree representing a set.  It can
9276259Sgreen     be understood as the next sibling of x.  */
9376259Sgreen  TBB *set_child;
9476259Sgreen
9576259Sgreen  /* If b is the number of a basic block (BB->index), dfs_order[b] is the
9676259Sgreen     number of that node in DFS order counted from 1.  This is an index
9776259Sgreen     into most of the other arrays in this structure.  */
9876259Sgreen  TBB *dfs_order;
99106121Sdes  /* If x is the DFS-index of a node which corresponds with a basic block,
100106121Sdes     dfs_to_bb[x] is that basic block.  Note, that in our structure there are
101106121Sdes     more nodes that basic blocks, so only dfs_to_bb[dfs_order[bb->index]]==bb
102106121Sdes     is true for every basic block bb, but not the opposite.  */
103106121Sdes  basic_block *dfs_to_bb;
10476259Sgreen
10576259Sgreen  /* This is the next free DFS number when creating the DFS tree.  */
10676259Sgreen  unsigned int dfsnum;
10776259Sgreen  /* The number of nodes in the DFS tree (==dfsnum-1).  */
108126274Sdes  unsigned int nodes;
109126274Sdes
11076259Sgreen  /* Blocks with bits set here have a fake edge to EXIT.  These are used
11176259Sgreen     to turn a DFS forest into a proper tree.  */
11292555Sdes  bitmap fake_exit_edge;
11376259Sgreen};
11492555Sdes
11576259Sgreenstatic void init_dom_info (struct dom_info *, enum cdi_direction);
11692555Sdesstatic void free_dom_info (struct dom_info *);
11792555Sdesstatic void calc_dfs_tree_nonrec (struct dom_info *, basic_block,
11876259Sgreen				  enum cdi_direction);
11976259Sgreenstatic void calc_dfs_tree (struct dom_info *, enum cdi_direction);
12076259Sgreenstatic void compress (struct dom_info *, TBB);
12176259Sgreenstatic TBB eval (struct dom_info *, TBB);
12276259Sgreenstatic void link_roots (struct dom_info *, TBB, TBB);
12376259Sgreenstatic void calc_idoms (struct dom_info *, enum cdi_direction);
12476259Sgreenvoid debug_dominance_info (enum cdi_direction);
12576259Sgreen
126126274Sdes/* Keeps track of the*/
127126274Sdesstatic unsigned n_bbs_in_dom_tree[2];
12876259Sgreen
12976259Sgreen/* Helper macro for allocating and initializing an array,
13076259Sgreen   for aesthetic reasons.  */
13176259Sgreen#define init_ar(var, type, num, content)			\
13276259Sgreen  do								\
13392555Sdes    {								\
13476259Sgreen      unsigned int i = 1;    /* Catch content == i.  */		\
13576259Sgreen      if (! (content))						\
13676259Sgreen	(var) = xcalloc ((num), sizeof (type));			\
13776259Sgreen      else							\
13892555Sdes	{							\
13976259Sgreen	  (var) = xmalloc ((num) * sizeof (type));		\
14076259Sgreen	  for (i = 0; i < num; i++)				\
14192555Sdes	    (var)[i] = (content);				\
14292555Sdes	}							\
14376259Sgreen    }								\
14492555Sdes  while (0)
14592555Sdes
14692555Sdes/* Allocate all needed memory in a pessimistic fashion (so we round up).
14792555Sdes   This initializes the contents of DI, which already must be allocated.  */
14892555Sdes
14976259Sgreenstatic void
15076259Sgreeninit_dom_info (struct dom_info *di, enum cdi_direction dir)
15176259Sgreen{
15276259Sgreen  /* We need memory for n_basic_blocks nodes and the ENTRY_BLOCK or
15376259Sgreen     EXIT_BLOCK.  */
15499060Sdes  unsigned int num = n_basic_blocks + 1 + 1;
15576259Sgreen  init_ar (di->dfs_parent, TBB, num, 0);
15676259Sgreen  init_ar (di->path_min, TBB, num, i);
15776259Sgreen  init_ar (di->key, TBB, num, i);
15892555Sdes  init_ar (di->dom, TBB, num, 0);
15992555Sdes
16092555Sdes  init_ar (di->bucket, TBB, num, 0);
16192555Sdes  init_ar (di->next_bucket, TBB, num, 0);
16292555Sdes
16392555Sdes  init_ar (di->set_chain, TBB, num, 0);
164164146Sdes  init_ar (di->set_size, unsigned int, num, 1);
165164146Sdes  init_ar (di->set_child, TBB, num, 0);
166164146Sdes
16776259Sgreen  init_ar (di->dfs_order, TBB, (unsigned int) last_basic_block + 1, 0);
168126274Sdes  init_ar (di->dfs_to_bb, basic_block, num, 0);
169126274Sdes
170126274Sdes  di->dfsnum = 1;
17176259Sgreen  di->nodes = 0;
17276259Sgreen
17376259Sgreen  di->fake_exit_edge = dir ? BITMAP_ALLOC (NULL) : NULL;
17476259Sgreen}
17592555Sdes
17676259Sgreen#undef init_ar
17776259Sgreen
17892555Sdes/* Free all allocated memory in DI, but not DI itself.  */
17976259Sgreen
18076259Sgreenstatic void
18176259Sgreenfree_dom_info (struct dom_info *di)
18292555Sdes{
18392555Sdes  free (di->dfs_parent);
18476259Sgreen  free (di->path_min);
18576259Sgreen  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_FREE (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
203static void
204calc_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
315static void
316calc_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  /* Make sure there is a 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
384static void
385compress (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
404static inline TBB
405eval (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
433static void
434link_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
475static void
476calc_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
570static void
571assign_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
590static void
591compute_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
613void
614calculate_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.  */
652void
653free_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      et_free_tree_force (bb->dom[dir]);
663      bb->dom[dir] = NULL;
664    }
665
666  n_bbs_in_dom_tree[dir] = 0;
667
668  dom_computed[dir] = DOM_NONE;
669}
670
671/* Return the immediate dominator of basic block BB.  */
672basic_block
673get_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.  */
687inline void
688set_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.  */
711int
712get_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
741unsigned
742get_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]->flags |= BB_DUPLICATED;
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->flags & BB_DUPLICATED))
755	doms[n_doms++] = dom;
756  for (i = 0; i < n_region; i++)
757    region[i]->flags &= ~BB_DUPLICATED;
758
759  return n_doms;
760}
761
762/* Redirect all edges pointing to BB to TO.  */
763void
764redirect_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.  */
787basic_block
788nearest_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
801/* Find the nearest common dominator for the basic blocks in BLOCKS,
802   using dominance direction DIR.  */
803
804basic_block
805nearest_common_dominator_for_set (enum cdi_direction dir, bitmap blocks)
806{
807  unsigned i, first;
808  bitmap_iterator bi;
809  basic_block dom;
810
811  first = bitmap_first_set_bit (blocks);
812  dom = BASIC_BLOCK (first);
813  EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
814    if (dom != BASIC_BLOCK (i))
815      dom = nearest_common_dominator (dir, dom, BASIC_BLOCK (i));
816
817  return dom;
818}
819
820
821/* Return TRUE in case BB1 is dominated by BB2.  */
822bool
823dominated_by_p (enum cdi_direction dir, basic_block bb1, basic_block bb2)
824{
825  struct et_node *n1 = bb1->dom[dir], *n2 = bb2->dom[dir];
826
827  gcc_assert (dom_computed[dir]);
828
829  if (dom_computed[dir] == DOM_OK)
830    return (n1->dfs_num_in >= n2->dfs_num_in
831  	    && n1->dfs_num_out <= n2->dfs_num_out);
832
833  return et_below (n1, n2);
834}
835
836/* Verify invariants of dominator structure.  */
837void
838verify_dominators (enum cdi_direction dir)
839{
840  int err = 0;
841  basic_block bb;
842
843  gcc_assert (dom_info_available_p (dir));
844
845  FOR_EACH_BB (bb)
846    {
847      basic_block dom_bb;
848      basic_block imm_bb;
849
850      dom_bb = recount_dominator (dir, bb);
851      imm_bb = get_immediate_dominator (dir, bb);
852      if (dom_bb != imm_bb)
853	{
854	  if ((dom_bb == NULL) || (imm_bb == NULL))
855	    error ("dominator of %d status unknown", bb->index);
856	  else
857	    error ("dominator of %d should be %d, not %d",
858		   bb->index, dom_bb->index, imm_bb->index);
859	  err = 1;
860	}
861    }
862
863  if (dir == CDI_DOMINATORS)
864    {
865      FOR_EACH_BB (bb)
866	{
867	  if (!dominated_by_p (dir, bb, ENTRY_BLOCK_PTR))
868	    {
869	      error ("ENTRY does not dominate bb %d", bb->index);
870	      err = 1;
871	    }
872	}
873    }
874
875  gcc_assert (!err);
876}
877
878/* Determine immediate dominator (or postdominator, according to DIR) of BB,
879   assuming that dominators of other blocks are correct.  We also use it to
880   recompute the dominators in a restricted area, by iterating it until it
881   reaches a fixed point.  */
882
883basic_block
884recount_dominator (enum cdi_direction dir, basic_block bb)
885{
886  basic_block dom_bb = NULL;
887  edge e;
888  edge_iterator ei;
889
890  gcc_assert (dom_computed[dir]);
891
892  if (dir == CDI_DOMINATORS)
893    {
894      FOR_EACH_EDGE (e, ei, bb->preds)
895	{
896	  /* Ignore the predecessors that either are not reachable from
897	     the entry block, or whose dominator was not determined yet.  */
898	  if (!dominated_by_p (dir, e->src, ENTRY_BLOCK_PTR))
899	    continue;
900
901	  if (!dominated_by_p (dir, e->src, bb))
902	    dom_bb = nearest_common_dominator (dir, dom_bb, e->src);
903	}
904    }
905  else
906    {
907      FOR_EACH_EDGE (e, ei, bb->succs)
908	{
909	  if (!dominated_by_p (dir, e->dest, bb))
910	    dom_bb = nearest_common_dominator (dir, dom_bb, e->dest);
911	}
912    }
913
914  return dom_bb;
915}
916
917/* Iteratively recount dominators of BBS. The change is supposed to be local
918   and not to grow further.  */
919void
920iterate_fix_dominators (enum cdi_direction dir, basic_block *bbs, int n)
921{
922  int i, changed = 1;
923  basic_block old_dom, new_dom;
924
925  gcc_assert (dom_computed[dir]);
926
927  for (i = 0; i < n; i++)
928    set_immediate_dominator (dir, bbs[i], NULL);
929
930  while (changed)
931    {
932      changed = 0;
933      for (i = 0; i < n; i++)
934	{
935	  old_dom = get_immediate_dominator (dir, bbs[i]);
936	  new_dom = recount_dominator (dir, bbs[i]);
937	  if (old_dom != new_dom)
938	    {
939	      changed = 1;
940	      set_immediate_dominator (dir, bbs[i], new_dom);
941	    }
942	}
943    }
944
945  for (i = 0; i < n; i++)
946    gcc_assert (get_immediate_dominator (dir, bbs[i]));
947}
948
949void
950add_to_dominance_info (enum cdi_direction dir, basic_block bb)
951{
952  gcc_assert (dom_computed[dir]);
953  gcc_assert (!bb->dom[dir]);
954
955  n_bbs_in_dom_tree[dir]++;
956
957  bb->dom[dir] = et_new_tree (bb);
958
959  if (dom_computed[dir] == DOM_OK)
960    dom_computed[dir] = DOM_NO_FAST_QUERY;
961}
962
963void
964delete_from_dominance_info (enum cdi_direction dir, basic_block bb)
965{
966  gcc_assert (dom_computed[dir]);
967
968  et_free_tree (bb->dom[dir]);
969  bb->dom[dir] = NULL;
970  n_bbs_in_dom_tree[dir]--;
971
972  if (dom_computed[dir] == DOM_OK)
973    dom_computed[dir] = DOM_NO_FAST_QUERY;
974}
975
976/* Returns the first son of BB in the dominator or postdominator tree
977   as determined by DIR.  */
978
979basic_block
980first_dom_son (enum cdi_direction dir, basic_block bb)
981{
982  struct et_node *son = bb->dom[dir]->son;
983
984  return son ? son->data : NULL;
985}
986
987/* Returns the next dominance son after BB in the dominator or postdominator
988   tree as determined by DIR, or NULL if it was the last one.  */
989
990basic_block
991next_dom_son (enum cdi_direction dir, basic_block bb)
992{
993  struct et_node *next = bb->dom[dir]->right;
994
995  return next->father->son == next ? NULL : next->data;
996}
997
998/* Returns true if dominance information for direction DIR is available.  */
999
1000bool
1001dom_info_available_p (enum cdi_direction dir)
1002{
1003  return dom_computed[dir] != DOM_NONE;
1004}
1005
1006void
1007debug_dominance_info (enum cdi_direction dir)
1008{
1009  basic_block bb, bb2;
1010  FOR_EACH_BB (bb)
1011    if ((bb2 = get_immediate_dominator (dir, bb)))
1012      fprintf (stderr, "%i %i\n", bb->index, bb2->index);
1013}
1014