PR preprocessor/60723 - missing system-ness marks for macro tokens
[official-gcc.git] / gcc / dominance.c
blobbe0a43910e60b4aae24723be8f9525df44d8c20e
1 /* Calculate (post)dominators in slightly super-linear time.
2 Copyright (C) 2000-2014 Free Software Foundation, Inc.
3 Contributed by Michael Matz (matz@ifh.de).
5 This file is part of GCC.
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.
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.
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/>. */
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.
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. */
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 "basic-block.h"
43 #include "diagnostic-core.h"
44 #include "et-forest.h"
45 #include "timevar.h"
46 #include "hash-map.h"
47 #include "pointer-set.h"
48 #include "graphds.h"
49 #include "bitmap.h"
51 /* We name our nodes with integers, beginning with 1. Zero is reserved for
52 'undefined' or 'end of list'. The name of each node is given by the dfs
53 number of the corresponding basic block. Please note, that we include the
54 artificial ENTRY_BLOCK (or EXIT_BLOCK in the post-dom case) in our lists to
55 support multiple entry points. Its dfs number is of course 1. */
57 /* Type of Basic Block aka. TBB */
58 typedef unsigned int TBB;
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. */
65 struct dom_info
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;
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 representative
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;
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;
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;
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;
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, bool);
118 static void calc_dfs_tree (struct dom_info *, bool);
119 static void compress (struct dom_info *, TBB);
120 static TBB eval (struct dom_info *, TBB);
121 static void link_roots (struct dom_info *, TBB, TBB);
122 static void calc_idoms (struct dom_info *, bool);
123 void debug_dominance_info (enum cdi_direction);
124 void debug_dominance_tree (enum cdi_direction, basic_block);
126 /* Helper macro for allocating and initializing an array,
127 for aesthetic reasons. */
128 #define init_ar(var, type, num, content) \
129 do \
131 unsigned int i = 1; /* Catch content == i. */ \
132 if (! (content)) \
133 (var) = XCNEWVEC (type, num); \
134 else \
136 (var) = XNEWVEC (type, (num)); \
137 for (i = 0; i < num; i++) \
138 (var)[i] = (content); \
141 while (0)
143 /* Allocate all needed memory in a pessimistic fashion (so we round up).
144 This initializes the contents of DI, which already must be allocated. */
146 static void
147 init_dom_info (struct dom_info *di, enum cdi_direction dir)
149 /* We need memory for n_basic_blocks nodes. */
150 unsigned int num = n_basic_blocks_for_fn (cfun);
151 init_ar (di->dfs_parent, TBB, num, 0);
152 init_ar (di->path_min, TBB, num, i);
153 init_ar (di->key, TBB, num, i);
154 init_ar (di->dom, TBB, num, 0);
156 init_ar (di->bucket, TBB, num, 0);
157 init_ar (di->next_bucket, TBB, num, 0);
159 init_ar (di->set_chain, TBB, num, 0);
160 init_ar (di->set_size, unsigned int, num, 1);
161 init_ar (di->set_child, TBB, num, 0);
163 init_ar (di->dfs_order, TBB,
164 (unsigned int) last_basic_block_for_fn (cfun) + 1, 0);
165 init_ar (di->dfs_to_bb, basic_block, num, 0);
167 di->dfsnum = 1;
168 di->nodes = 0;
170 switch (dir)
172 case CDI_DOMINATORS:
173 di->fake_exit_edge = NULL;
174 break;
175 case CDI_POST_DOMINATORS:
176 di->fake_exit_edge = BITMAP_ALLOC (NULL);
177 break;
178 default:
179 gcc_unreachable ();
180 break;
184 #undef init_ar
186 /* Map dominance calculation type to array index used for various
187 dominance information arrays. This version is simple -- it will need
188 to be modified, obviously, if additional values are added to
189 cdi_direction. */
191 static unsigned int
192 dom_convert_dir_to_idx (enum cdi_direction dir)
194 gcc_checking_assert (dir == CDI_DOMINATORS || dir == CDI_POST_DOMINATORS);
195 return dir - 1;
198 /* Free all allocated memory in DI, but not DI itself. */
200 static void
201 free_dom_info (struct dom_info *di)
203 free (di->dfs_parent);
204 free (di->path_min);
205 free (di->key);
206 free (di->dom);
207 free (di->bucket);
208 free (di->next_bucket);
209 free (di->set_chain);
210 free (di->set_size);
211 free (di->set_child);
212 free (di->dfs_order);
213 free (di->dfs_to_bb);
214 BITMAP_FREE (di->fake_exit_edge);
217 /* The nonrecursive variant of creating a DFS tree. DI is our working
218 structure, BB the starting basic block for this tree and REVERSE
219 is true, if predecessors should be visited instead of successors of a
220 node. After this is done all nodes reachable from BB were visited, have
221 assigned their dfs number and are linked together to form a tree. */
223 static void
224 calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb, bool reverse)
226 /* We call this _only_ if bb is not already visited. */
227 edge e;
228 TBB child_i, my_i = 0;
229 edge_iterator *stack;
230 edge_iterator ei, einext;
231 int sp;
232 /* Start block (the entry block for forward problem, exit block for backward
233 problem). */
234 basic_block en_block;
235 /* Ending block. */
236 basic_block ex_block;
238 stack = XNEWVEC (edge_iterator, n_basic_blocks_for_fn (cfun) + 1);
239 sp = 0;
241 /* Initialize our border blocks, and the first edge. */
242 if (reverse)
244 ei = ei_start (bb->preds);
245 en_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
246 ex_block = ENTRY_BLOCK_PTR_FOR_FN (cfun);
248 else
250 ei = ei_start (bb->succs);
251 en_block = ENTRY_BLOCK_PTR_FOR_FN (cfun);
252 ex_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
255 /* When the stack is empty we break out of this loop. */
256 while (1)
258 basic_block bn;
260 /* This loop traverses edges e in depth first manner, and fills the
261 stack. */
262 while (!ei_end_p (ei))
264 e = ei_edge (ei);
266 /* Deduce from E the current and the next block (BB and BN), and the
267 next edge. */
268 if (reverse)
270 bn = e->src;
272 /* If the next node BN is either already visited or a border
273 block the current edge is useless, and simply overwritten
274 with the next edge out of the current node. */
275 if (bn == ex_block || di->dfs_order[bn->index])
277 ei_next (&ei);
278 continue;
280 bb = e->dest;
281 einext = ei_start (bn->preds);
283 else
285 bn = e->dest;
286 if (bn == ex_block || di->dfs_order[bn->index])
288 ei_next (&ei);
289 continue;
291 bb = e->src;
292 einext = ei_start (bn->succs);
295 gcc_assert (bn != en_block);
297 /* Fill the DFS tree info calculatable _before_ recursing. */
298 if (bb != en_block)
299 my_i = di->dfs_order[bb->index];
300 else
301 my_i = di->dfs_order[last_basic_block_for_fn (cfun)];
302 child_i = di->dfs_order[bn->index] = di->dfsnum++;
303 di->dfs_to_bb[child_i] = bn;
304 di->dfs_parent[child_i] = my_i;
306 /* Save the current point in the CFG on the stack, and recurse. */
307 stack[sp++] = ei;
308 ei = einext;
311 if (!sp)
312 break;
313 ei = stack[--sp];
315 /* OK. The edge-list was exhausted, meaning normally we would
316 end the recursion. After returning from the recursive call,
317 there were (may be) other statements which were run after a
318 child node was completely considered by DFS. Here is the
319 point to do it in the non-recursive variant.
320 E.g. The block just completed is in e->dest for forward DFS,
321 the block not yet completed (the parent of the one above)
322 in e->src. This could be used e.g. for computing the number of
323 descendants or the tree depth. */
324 ei_next (&ei);
326 free (stack);
329 /* The main entry for calculating the DFS tree or forest. DI is our working
330 structure and REVERSE is true, if we are interested in the reverse flow
331 graph. In that case the result is not necessarily a tree but a forest,
332 because there may be nodes from which the EXIT_BLOCK is unreachable. */
334 static void
335 calc_dfs_tree (struct dom_info *di, bool reverse)
337 /* The first block is the ENTRY_BLOCK (or EXIT_BLOCK if REVERSE). */
338 basic_block begin = (reverse
339 ? EXIT_BLOCK_PTR_FOR_FN (cfun) : ENTRY_BLOCK_PTR_FOR_FN (cfun));
340 di->dfs_order[last_basic_block_for_fn (cfun)] = di->dfsnum;
341 di->dfs_to_bb[di->dfsnum] = begin;
342 di->dfsnum++;
344 calc_dfs_tree_nonrec (di, begin, reverse);
346 if (reverse)
348 /* In the post-dom case we may have nodes without a path to EXIT_BLOCK.
349 They are reverse-unreachable. In the dom-case we disallow such
350 nodes, but in post-dom we have to deal with them.
352 There are two situations in which this occurs. First, noreturn
353 functions. Second, infinite loops. In the first case we need to
354 pretend that there is an edge to the exit block. In the second
355 case, we wind up with a forest. We need to process all noreturn
356 blocks before we know if we've got any infinite loops. */
358 basic_block b;
359 bool saw_unconnected = false;
361 FOR_EACH_BB_REVERSE_FN (b, cfun)
363 if (EDGE_COUNT (b->succs) > 0)
365 if (di->dfs_order[b->index] == 0)
366 saw_unconnected = true;
367 continue;
369 bitmap_set_bit (di->fake_exit_edge, b->index);
370 di->dfs_order[b->index] = di->dfsnum;
371 di->dfs_to_bb[di->dfsnum] = b;
372 di->dfs_parent[di->dfsnum] =
373 di->dfs_order[last_basic_block_for_fn (cfun)];
374 di->dfsnum++;
375 calc_dfs_tree_nonrec (di, b, reverse);
378 if (saw_unconnected)
380 FOR_EACH_BB_REVERSE_FN (b, cfun)
382 basic_block b2;
383 if (di->dfs_order[b->index])
384 continue;
385 b2 = dfs_find_deadend (b);
386 gcc_checking_assert (di->dfs_order[b2->index] == 0);
387 bitmap_set_bit (di->fake_exit_edge, b2->index);
388 di->dfs_order[b2->index] = di->dfsnum;
389 di->dfs_to_bb[di->dfsnum] = b2;
390 di->dfs_parent[di->dfsnum] =
391 di->dfs_order[last_basic_block_for_fn (cfun)];
392 di->dfsnum++;
393 calc_dfs_tree_nonrec (di, b2, reverse);
394 gcc_checking_assert (di->dfs_order[b->index]);
399 di->nodes = di->dfsnum - 1;
401 /* This aborts e.g. when there is _no_ path from ENTRY to EXIT at all. */
402 gcc_assert (di->nodes == (unsigned int) n_basic_blocks_for_fn (cfun) - 1);
405 /* Compress the path from V to the root of its set and update path_min at the
406 same time. After compress(di, V) set_chain[V] is the root of the set V is
407 in and path_min[V] is the node with the smallest key[] value on the path
408 from V to that root. */
410 static void
411 compress (struct dom_info *di, TBB v)
413 /* Btw. It's not worth to unrecurse compress() as the depth is usually not
414 greater than 5 even for huge graphs (I've not seen call depth > 4).
415 Also performance wise compress() ranges _far_ behind eval(). */
416 TBB parent = di->set_chain[v];
417 if (di->set_chain[parent])
419 compress (di, parent);
420 if (di->key[di->path_min[parent]] < di->key[di->path_min[v]])
421 di->path_min[v] = di->path_min[parent];
422 di->set_chain[v] = di->set_chain[parent];
426 /* Compress the path from V to the set root of V if needed (when the root has
427 changed since the last call). Returns the node with the smallest key[]
428 value on the path from V to the root. */
430 static inline TBB
431 eval (struct dom_info *di, TBB v)
433 /* The representative of the set V is in, also called root (as the set
434 representation is a tree). */
435 TBB rep = di->set_chain[v];
437 /* V itself is the root. */
438 if (!rep)
439 return di->path_min[v];
441 /* Compress only if necessary. */
442 if (di->set_chain[rep])
444 compress (di, v);
445 rep = di->set_chain[v];
448 if (di->key[di->path_min[rep]] >= di->key[di->path_min[v]])
449 return di->path_min[v];
450 else
451 return di->path_min[rep];
454 /* This essentially merges the two sets of V and W, giving a single set with
455 the new root V. The internal representation of these disjoint sets is a
456 balanced tree. Currently link(V,W) is only used with V being the parent
457 of W. */
459 static void
460 link_roots (struct dom_info *di, TBB v, TBB w)
462 TBB s = w;
464 /* Rebalance the tree. */
465 while (di->key[di->path_min[w]] < di->key[di->path_min[di->set_child[s]]])
467 if (di->set_size[s] + di->set_size[di->set_child[di->set_child[s]]]
468 >= 2 * di->set_size[di->set_child[s]])
470 di->set_chain[di->set_child[s]] = s;
471 di->set_child[s] = di->set_child[di->set_child[s]];
473 else
475 di->set_size[di->set_child[s]] = di->set_size[s];
476 s = di->set_chain[s] = di->set_child[s];
480 di->path_min[s] = di->path_min[w];
481 di->set_size[v] += di->set_size[w];
482 if (di->set_size[v] < 2 * di->set_size[w])
484 TBB tmp = s;
485 s = di->set_child[v];
486 di->set_child[v] = tmp;
489 /* Merge all subtrees. */
490 while (s)
492 di->set_chain[s] = v;
493 s = di->set_child[s];
497 /* This calculates the immediate dominators (or post-dominators if REVERSE is
498 true). DI is our working structure and should hold the DFS forest.
499 On return the immediate dominator to node V is in di->dom[V]. */
501 static void
502 calc_idoms (struct dom_info *di, bool reverse)
504 TBB v, w, k, par;
505 basic_block en_block;
506 edge_iterator ei, einext;
508 if (reverse)
509 en_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
510 else
511 en_block = ENTRY_BLOCK_PTR_FOR_FN (cfun);
513 /* Go backwards in DFS order, to first look at the leafs. */
514 v = di->nodes;
515 while (v > 1)
517 basic_block bb = di->dfs_to_bb[v];
518 edge e;
520 par = di->dfs_parent[v];
521 k = v;
523 ei = (reverse) ? ei_start (bb->succs) : ei_start (bb->preds);
525 if (reverse)
527 /* If this block has a fake edge to exit, process that first. */
528 if (bitmap_bit_p (di->fake_exit_edge, bb->index))
530 einext = ei;
531 einext.index = 0;
532 goto do_fake_exit_edge;
536 /* Search all direct predecessors for the smallest node with a path
537 to them. That way we have the smallest node with also a path to
538 us only over nodes behind us. In effect we search for our
539 semidominator. */
540 while (!ei_end_p (ei))
542 TBB k1;
543 basic_block b;
545 e = ei_edge (ei);
546 b = (reverse) ? e->dest : e->src;
547 einext = ei;
548 ei_next (&einext);
550 if (b == en_block)
552 do_fake_exit_edge:
553 k1 = di->dfs_order[last_basic_block_for_fn (cfun)];
555 else
556 k1 = di->dfs_order[b->index];
558 /* Call eval() only if really needed. If k1 is above V in DFS tree,
559 then we know, that eval(k1) == k1 and key[k1] == k1. */
560 if (k1 > v)
561 k1 = di->key[eval (di, k1)];
562 if (k1 < k)
563 k = k1;
565 ei = einext;
568 di->key[v] = k;
569 link_roots (di, par, v);
570 di->next_bucket[v] = di->bucket[k];
571 di->bucket[k] = v;
573 /* Transform semidominators into dominators. */
574 for (w = di->bucket[par]; w; w = di->next_bucket[w])
576 k = eval (di, w);
577 if (di->key[k] < di->key[w])
578 di->dom[w] = k;
579 else
580 di->dom[w] = par;
582 /* We don't need to cleanup next_bucket[]. */
583 di->bucket[par] = 0;
584 v--;
587 /* Explicitly define the dominators. */
588 di->dom[1] = 0;
589 for (v = 2; v <= di->nodes; v++)
590 if (di->dom[v] != di->key[v])
591 di->dom[v] = di->dom[di->dom[v]];
594 /* Assign dfs numbers starting from NUM to NODE and its sons. */
596 static void
597 assign_dfs_numbers (struct et_node *node, int *num)
599 struct et_node *son;
601 node->dfs_num_in = (*num)++;
603 if (node->son)
605 assign_dfs_numbers (node->son, num);
606 for (son = node->son->right; son != node->son; son = son->right)
607 assign_dfs_numbers (son, num);
610 node->dfs_num_out = (*num)++;
613 /* Compute the data necessary for fast resolving of dominator queries in a
614 static dominator tree. */
616 static void
617 compute_dom_fast_query (enum cdi_direction dir)
619 int num = 0;
620 basic_block bb;
621 unsigned int dir_index = dom_convert_dir_to_idx (dir);
623 gcc_checking_assert (dom_info_available_p (dir));
625 if (dom_computed[dir_index] == DOM_OK)
626 return;
628 FOR_ALL_BB_FN (bb, cfun)
630 if (!bb->dom[dir_index]->father)
631 assign_dfs_numbers (bb->dom[dir_index], &num);
634 dom_computed[dir_index] = DOM_OK;
637 /* The main entry point into this module. DIR is set depending on whether
638 we want to compute dominators or postdominators. */
640 void
641 calculate_dominance_info (enum cdi_direction dir)
643 struct dom_info di;
644 basic_block b;
645 unsigned int dir_index = dom_convert_dir_to_idx (dir);
646 bool reverse = (dir == CDI_POST_DOMINATORS) ? true : false;
648 if (dom_computed[dir_index] == DOM_OK)
649 return;
651 timevar_push (TV_DOMINANCE);
652 if (!dom_info_available_p (dir))
654 gcc_assert (!n_bbs_in_dom_tree[dir_index]);
656 FOR_ALL_BB_FN (b, cfun)
658 b->dom[dir_index] = et_new_tree (b);
660 n_bbs_in_dom_tree[dir_index] = n_basic_blocks_for_fn (cfun);
662 init_dom_info (&di, dir);
663 calc_dfs_tree (&di, reverse);
664 calc_idoms (&di, reverse);
666 FOR_EACH_BB_FN (b, cfun)
668 TBB d = di.dom[di.dfs_order[b->index]];
670 if (di.dfs_to_bb[d])
671 et_set_father (b->dom[dir_index], di.dfs_to_bb[d]->dom[dir_index]);
674 free_dom_info (&di);
675 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
678 compute_dom_fast_query (dir);
680 timevar_pop (TV_DOMINANCE);
683 /* Free dominance information for direction DIR. */
684 void
685 free_dominance_info (function *fn, enum cdi_direction dir)
687 basic_block bb;
688 unsigned int dir_index = dom_convert_dir_to_idx (dir);
690 if (!dom_info_available_p (fn, dir))
691 return;
693 FOR_ALL_BB_FN (bb, fn)
695 et_free_tree_force (bb->dom[dir_index]);
696 bb->dom[dir_index] = NULL;
698 et_free_pools ();
700 fn->cfg->x_n_bbs_in_dom_tree[dir_index] = 0;
702 fn->cfg->x_dom_computed[dir_index] = DOM_NONE;
705 void
706 free_dominance_info (enum cdi_direction dir)
708 free_dominance_info (cfun, dir);
711 /* Return the immediate dominator of basic block BB. */
712 basic_block
713 get_immediate_dominator (enum cdi_direction dir, basic_block bb)
715 unsigned int dir_index = dom_convert_dir_to_idx (dir);
716 struct et_node *node = bb->dom[dir_index];
718 gcc_checking_assert (dom_computed[dir_index]);
720 if (!node->father)
721 return NULL;
723 return (basic_block) node->father->data;
726 /* Set the immediate dominator of the block possibly removing
727 existing edge. NULL can be used to remove any edge. */
728 void
729 set_immediate_dominator (enum cdi_direction dir, basic_block bb,
730 basic_block dominated_by)
732 unsigned int dir_index = dom_convert_dir_to_idx (dir);
733 struct et_node *node = bb->dom[dir_index];
735 gcc_checking_assert (dom_computed[dir_index]);
737 if (node->father)
739 if (node->father->data == dominated_by)
740 return;
741 et_split (node);
744 if (dominated_by)
745 et_set_father (node, dominated_by->dom[dir_index]);
747 if (dom_computed[dir_index] == DOM_OK)
748 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
751 /* Returns the list of basic blocks immediately dominated by BB, in the
752 direction DIR. */
753 vec<basic_block>
754 get_dominated_by (enum cdi_direction dir, basic_block bb)
756 unsigned int dir_index = dom_convert_dir_to_idx (dir);
757 struct et_node *node = bb->dom[dir_index], *son = node->son, *ason;
758 vec<basic_block> bbs = vNULL;
760 gcc_checking_assert (dom_computed[dir_index]);
762 if (!son)
763 return vNULL;
765 bbs.safe_push ((basic_block) son->data);
766 for (ason = son->right; ason != son; ason = ason->right)
767 bbs.safe_push ((basic_block) ason->data);
769 return bbs;
772 /* Returns the list of basic blocks that are immediately dominated (in
773 direction DIR) by some block between N_REGION ones stored in REGION,
774 except for blocks in the REGION itself. */
776 vec<basic_block>
777 get_dominated_by_region (enum cdi_direction dir, basic_block *region,
778 unsigned n_region)
780 unsigned i;
781 basic_block dom;
782 vec<basic_block> doms = vNULL;
784 for (i = 0; i < n_region; i++)
785 region[i]->flags |= BB_DUPLICATED;
786 for (i = 0; i < n_region; i++)
787 for (dom = first_dom_son (dir, region[i]);
788 dom;
789 dom = next_dom_son (dir, dom))
790 if (!(dom->flags & BB_DUPLICATED))
791 doms.safe_push (dom);
792 for (i = 0; i < n_region; i++)
793 region[i]->flags &= ~BB_DUPLICATED;
795 return doms;
798 /* Returns the list of basic blocks including BB dominated by BB, in the
799 direction DIR up to DEPTH in the dominator tree. The DEPTH of zero will
800 produce a vector containing all dominated blocks. The vector will be sorted
801 in preorder. */
803 vec<basic_block>
804 get_dominated_to_depth (enum cdi_direction dir, basic_block bb, int depth)
806 vec<basic_block> bbs = vNULL;
807 unsigned i;
808 unsigned next_level_start;
810 i = 0;
811 bbs.safe_push (bb);
812 next_level_start = 1; /* = bbs.length (); */
816 basic_block son;
818 bb = bbs[i++];
819 for (son = first_dom_son (dir, bb);
820 son;
821 son = next_dom_son (dir, son))
822 bbs.safe_push (son);
824 if (i == next_level_start && --depth)
825 next_level_start = bbs.length ();
827 while (i < next_level_start);
829 return bbs;
832 /* Returns the list of basic blocks including BB dominated by BB, in the
833 direction DIR. The vector will be sorted in preorder. */
835 vec<basic_block>
836 get_all_dominated_blocks (enum cdi_direction dir, basic_block bb)
838 return get_dominated_to_depth (dir, bb, 0);
841 /* Redirect all edges pointing to BB to TO. */
842 void
843 redirect_immediate_dominators (enum cdi_direction dir, basic_block bb,
844 basic_block to)
846 unsigned int dir_index = dom_convert_dir_to_idx (dir);
847 struct et_node *bb_node, *to_node, *son;
849 bb_node = bb->dom[dir_index];
850 to_node = to->dom[dir_index];
852 gcc_checking_assert (dom_computed[dir_index]);
854 if (!bb_node->son)
855 return;
857 while (bb_node->son)
859 son = bb_node->son;
861 et_split (son);
862 et_set_father (son, to_node);
865 if (dom_computed[dir_index] == DOM_OK)
866 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
869 /* Find first basic block in the tree dominating both BB1 and BB2. */
870 basic_block
871 nearest_common_dominator (enum cdi_direction dir, basic_block bb1, basic_block bb2)
873 unsigned int dir_index = dom_convert_dir_to_idx (dir);
875 gcc_checking_assert (dom_computed[dir_index]);
877 if (!bb1)
878 return bb2;
879 if (!bb2)
880 return bb1;
882 return (basic_block) et_nca (bb1->dom[dir_index], bb2->dom[dir_index])->data;
886 /* Find the nearest common dominator for the basic blocks in BLOCKS,
887 using dominance direction DIR. */
889 basic_block
890 nearest_common_dominator_for_set (enum cdi_direction dir, bitmap blocks)
892 unsigned i, first;
893 bitmap_iterator bi;
894 basic_block dom;
896 first = bitmap_first_set_bit (blocks);
897 dom = BASIC_BLOCK_FOR_FN (cfun, first);
898 EXECUTE_IF_SET_IN_BITMAP (blocks, 0, i, bi)
899 if (dom != BASIC_BLOCK_FOR_FN (cfun, i))
900 dom = nearest_common_dominator (dir, dom, BASIC_BLOCK_FOR_FN (cfun, i));
902 return dom;
905 /* Given a dominator tree, we can determine whether one thing
906 dominates another in constant time by using two DFS numbers:
908 1. The number for when we visit a node on the way down the tree
909 2. The number for when we visit a node on the way back up the tree
911 You can view these as bounds for the range of dfs numbers the
912 nodes in the subtree of the dominator tree rooted at that node
913 will contain.
915 The dominator tree is always a simple acyclic tree, so there are
916 only three possible relations two nodes in the dominator tree have
917 to each other:
919 1. Node A is above Node B (and thus, Node A dominates node B)
928 In the above case, DFS_Number_In of A will be <= DFS_Number_In of
929 B, and DFS_Number_Out of A will be >= DFS_Number_Out of B. This is
930 because we must hit A in the dominator tree *before* B on the walk
931 down, and we will hit A *after* B on the walk back up
933 2. Node A is below node B (and thus, node B dominates node A)
942 In the above case, DFS_Number_In of A will be >= DFS_Number_In of
943 B, and DFS_Number_Out of A will be <= DFS_Number_Out of B.
945 This is because we must hit A in the dominator tree *after* B on
946 the walk down, and we will hit A *before* B on the walk back up
948 3. Node A and B are siblings (and thus, neither dominates the other)
956 In the above case, DFS_Number_In of A will *always* be <=
957 DFS_Number_In of B, and DFS_Number_Out of A will *always* be <=
958 DFS_Number_Out of B. This is because we will always finish the dfs
959 walk of one of the subtrees before the other, and thus, the dfs
960 numbers for one subtree can't intersect with the range of dfs
961 numbers for the other subtree. If you swap A and B's position in
962 the dominator tree, the comparison changes direction, but the point
963 is that both comparisons will always go the same way if there is no
964 dominance relationship.
966 Thus, it is sufficient to write
968 A_Dominates_B (node A, node B)
970 return DFS_Number_In(A) <= DFS_Number_In(B)
971 && DFS_Number_Out (A) >= DFS_Number_Out(B);
974 A_Dominated_by_B (node A, node B)
976 return DFS_Number_In(A) >= DFS_Number_In(A)
977 && DFS_Number_Out (A) <= DFS_Number_Out(B);
978 } */
980 /* Return TRUE in case BB1 is dominated by BB2. */
981 bool
982 dominated_by_p (enum cdi_direction dir, const_basic_block bb1, const_basic_block bb2)
984 unsigned int dir_index = dom_convert_dir_to_idx (dir);
985 struct et_node *n1 = bb1->dom[dir_index], *n2 = bb2->dom[dir_index];
987 gcc_checking_assert (dom_computed[dir_index]);
989 if (dom_computed[dir_index] == DOM_OK)
990 return (n1->dfs_num_in >= n2->dfs_num_in
991 && n1->dfs_num_out <= n2->dfs_num_out);
993 return et_below (n1, n2);
996 /* Returns the entry dfs number for basic block BB, in the direction DIR. */
998 unsigned
999 bb_dom_dfs_in (enum cdi_direction dir, basic_block bb)
1001 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1002 struct et_node *n = bb->dom[dir_index];
1004 gcc_checking_assert (dom_computed[dir_index] == DOM_OK);
1005 return n->dfs_num_in;
1008 /* Returns the exit dfs number for basic block BB, in the direction DIR. */
1010 unsigned
1011 bb_dom_dfs_out (enum cdi_direction dir, basic_block bb)
1013 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1014 struct et_node *n = bb->dom[dir_index];
1016 gcc_checking_assert (dom_computed[dir_index] == DOM_OK);
1017 return n->dfs_num_out;
1020 /* Verify invariants of dominator structure. */
1021 DEBUG_FUNCTION void
1022 verify_dominators (enum cdi_direction dir)
1024 int err = 0;
1025 basic_block bb, imm_bb, imm_bb_correct;
1026 struct dom_info di;
1027 bool reverse = (dir == CDI_POST_DOMINATORS) ? true : false;
1029 gcc_assert (dom_info_available_p (dir));
1031 init_dom_info (&di, dir);
1032 calc_dfs_tree (&di, reverse);
1033 calc_idoms (&di, reverse);
1035 FOR_EACH_BB_FN (bb, cfun)
1037 imm_bb = get_immediate_dominator (dir, bb);
1038 if (!imm_bb)
1040 error ("dominator of %d status unknown", bb->index);
1041 err = 1;
1044 imm_bb_correct = di.dfs_to_bb[di.dom[di.dfs_order[bb->index]]];
1045 if (imm_bb != imm_bb_correct)
1047 error ("dominator of %d should be %d, not %d",
1048 bb->index, imm_bb_correct->index, imm_bb->index);
1049 err = 1;
1053 free_dom_info (&di);
1054 gcc_assert (!err);
1057 /* Determine immediate dominator (or postdominator, according to DIR) of BB,
1058 assuming that dominators of other blocks are correct. We also use it to
1059 recompute the dominators in a restricted area, by iterating it until it
1060 reaches a fixed point. */
1062 basic_block
1063 recompute_dominator (enum cdi_direction dir, basic_block bb)
1065 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1066 basic_block dom_bb = NULL;
1067 edge e;
1068 edge_iterator ei;
1070 gcc_checking_assert (dom_computed[dir_index]);
1072 if (dir == CDI_DOMINATORS)
1074 FOR_EACH_EDGE (e, ei, bb->preds)
1076 if (!dominated_by_p (dir, e->src, bb))
1077 dom_bb = nearest_common_dominator (dir, dom_bb, e->src);
1080 else
1082 FOR_EACH_EDGE (e, ei, bb->succs)
1084 if (!dominated_by_p (dir, e->dest, bb))
1085 dom_bb = nearest_common_dominator (dir, dom_bb, e->dest);
1089 return dom_bb;
1092 /* Use simple heuristics (see iterate_fix_dominators) to determine dominators
1093 of BBS. We assume that all the immediate dominators except for those of the
1094 blocks in BBS are correct. If CONSERVATIVE is true, we also assume that the
1095 currently recorded immediate dominators of blocks in BBS really dominate the
1096 blocks. The basic blocks for that we determine the dominator are removed
1097 from BBS. */
1099 static void
1100 prune_bbs_to_update_dominators (vec<basic_block> bbs,
1101 bool conservative)
1103 unsigned i;
1104 bool single;
1105 basic_block bb, dom = NULL;
1106 edge_iterator ei;
1107 edge e;
1109 for (i = 0; bbs.iterate (i, &bb);)
1111 if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1112 goto succeed;
1114 if (single_pred_p (bb))
1116 set_immediate_dominator (CDI_DOMINATORS, bb, single_pred (bb));
1117 goto succeed;
1120 if (!conservative)
1121 goto fail;
1123 single = true;
1124 dom = NULL;
1125 FOR_EACH_EDGE (e, ei, bb->preds)
1127 if (dominated_by_p (CDI_DOMINATORS, e->src, bb))
1128 continue;
1130 if (!dom)
1131 dom = e->src;
1132 else
1134 single = false;
1135 dom = nearest_common_dominator (CDI_DOMINATORS, dom, e->src);
1139 gcc_assert (dom != NULL);
1140 if (single
1141 || find_edge (dom, bb))
1143 set_immediate_dominator (CDI_DOMINATORS, bb, dom);
1144 goto succeed;
1147 fail:
1148 i++;
1149 continue;
1151 succeed:
1152 bbs.unordered_remove (i);
1156 /* Returns root of the dominance tree in the direction DIR that contains
1157 BB. */
1159 static basic_block
1160 root_of_dom_tree (enum cdi_direction dir, basic_block bb)
1162 return (basic_block) et_root (bb->dom[dom_convert_dir_to_idx (dir)])->data;
1165 /* See the comment in iterate_fix_dominators. Finds the immediate dominators
1166 for the sons of Y, found using the SON and BROTHER arrays representing
1167 the dominance tree of graph G. BBS maps the vertices of G to the basic
1168 blocks. */
1170 static void
1171 determine_dominators_for_sons (struct graph *g, vec<basic_block> bbs,
1172 int y, int *son, int *brother)
1174 bitmap gprime;
1175 int i, a, nc;
1176 vec<int> *sccs;
1177 basic_block bb, dom, ybb;
1178 unsigned si;
1179 edge e;
1180 edge_iterator ei;
1182 if (son[y] == -1)
1183 return;
1184 if (y == (int) bbs.length ())
1185 ybb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
1186 else
1187 ybb = bbs[y];
1189 if (brother[son[y]] == -1)
1191 /* Handle the common case Y has just one son specially. */
1192 bb = bbs[son[y]];
1193 set_immediate_dominator (CDI_DOMINATORS, bb,
1194 recompute_dominator (CDI_DOMINATORS, bb));
1195 identify_vertices (g, y, son[y]);
1196 return;
1199 gprime = BITMAP_ALLOC (NULL);
1200 for (a = son[y]; a != -1; a = brother[a])
1201 bitmap_set_bit (gprime, a);
1203 nc = graphds_scc (g, gprime);
1204 BITMAP_FREE (gprime);
1206 /* ??? Needed to work around the pre-processor confusion with
1207 using a multi-argument template type as macro argument. */
1208 typedef vec<int> vec_int_heap;
1209 sccs = XCNEWVEC (vec_int_heap, nc);
1210 for (a = son[y]; a != -1; a = brother[a])
1211 sccs[g->vertices[a].component].safe_push (a);
1213 for (i = nc - 1; i >= 0; i--)
1215 dom = NULL;
1216 FOR_EACH_VEC_ELT (sccs[i], si, a)
1218 bb = bbs[a];
1219 FOR_EACH_EDGE (e, ei, bb->preds)
1221 if (root_of_dom_tree (CDI_DOMINATORS, e->src) != ybb)
1222 continue;
1224 dom = nearest_common_dominator (CDI_DOMINATORS, dom, e->src);
1228 gcc_assert (dom != NULL);
1229 FOR_EACH_VEC_ELT (sccs[i], si, a)
1231 bb = bbs[a];
1232 set_immediate_dominator (CDI_DOMINATORS, bb, dom);
1236 for (i = 0; i < nc; i++)
1237 sccs[i].release ();
1238 free (sccs);
1240 for (a = son[y]; a != -1; a = brother[a])
1241 identify_vertices (g, y, a);
1244 /* Recompute dominance information for basic blocks in the set BBS. The
1245 function assumes that the immediate dominators of all the other blocks
1246 in CFG are correct, and that there are no unreachable blocks.
1248 If CONSERVATIVE is true, we additionally assume that all the ancestors of
1249 a block of BBS in the current dominance tree dominate it. */
1251 void
1252 iterate_fix_dominators (enum cdi_direction dir, vec<basic_block> bbs,
1253 bool conservative)
1255 unsigned i;
1256 basic_block bb, dom;
1257 struct graph *g;
1258 int n, y;
1259 size_t dom_i;
1260 edge e;
1261 edge_iterator ei;
1262 int *parent, *son, *brother;
1263 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1265 /* We only support updating dominators. There are some problems with
1266 updating postdominators (need to add fake edges from infinite loops
1267 and noreturn functions), and since we do not currently use
1268 iterate_fix_dominators for postdominators, any attempt to handle these
1269 problems would be unused, untested, and almost surely buggy. We keep
1270 the DIR argument for consistency with the rest of the dominator analysis
1271 interface. */
1272 gcc_checking_assert (dir == CDI_DOMINATORS && dom_computed[dir_index]);
1274 /* The algorithm we use takes inspiration from the following papers, although
1275 the details are quite different from any of them:
1277 [1] G. Ramalingam, T. Reps, An Incremental Algorithm for Maintaining the
1278 Dominator Tree of a Reducible Flowgraph
1279 [2] V. C. Sreedhar, G. R. Gao, Y.-F. Lee: Incremental computation of
1280 dominator trees
1281 [3] K. D. Cooper, T. J. Harvey and K. Kennedy: A Simple, Fast Dominance
1282 Algorithm
1284 First, we use the following heuristics to decrease the size of the BBS
1285 set:
1286 a) if BB has a single predecessor, then its immediate dominator is this
1287 predecessor
1288 additionally, if CONSERVATIVE is true:
1289 b) if all the predecessors of BB except for one (X) are dominated by BB,
1290 then X is the immediate dominator of BB
1291 c) if the nearest common ancestor of the predecessors of BB is X and
1292 X -> BB is an edge in CFG, then X is the immediate dominator of BB
1294 Then, we need to establish the dominance relation among the basic blocks
1295 in BBS. We split the dominance tree by removing the immediate dominator
1296 edges from BBS, creating a forest F. We form a graph G whose vertices
1297 are BBS and ENTRY and X -> Y is an edge of G if there exists an edge
1298 X' -> Y in CFG such that X' belongs to the tree of the dominance forest
1299 whose root is X. We then determine dominance tree of G. Note that
1300 for X, Y in BBS, X dominates Y in CFG if and only if X dominates Y in G.
1301 In this step, we can use arbitrary algorithm to determine dominators.
1302 We decided to prefer the algorithm [3] to the algorithm of
1303 Lengauer and Tarjan, since the set BBS is usually small (rarely exceeding
1304 10 during gcc bootstrap), and [3] should perform better in this case.
1306 Finally, we need to determine the immediate dominators for the basic
1307 blocks of BBS. If the immediate dominator of X in G is Y, then
1308 the immediate dominator of X in CFG belongs to the tree of F rooted in
1309 Y. We process the dominator tree T of G recursively, starting from leaves.
1310 Suppose that X_1, X_2, ..., X_k are the sons of Y in T, and that the
1311 subtrees of the dominance tree of CFG rooted in X_i are already correct.
1312 Let G' be the subgraph of G induced by {X_1, X_2, ..., X_k}. We make
1313 the following observations:
1314 (i) the immediate dominator of all blocks in a strongly connected
1315 component of G' is the same
1316 (ii) if X has no predecessors in G', then the immediate dominator of X
1317 is the nearest common ancestor of the predecessors of X in the
1318 subtree of F rooted in Y
1319 Therefore, it suffices to find the topological ordering of G', and
1320 process the nodes X_i in this order using the rules (i) and (ii).
1321 Then, we contract all the nodes X_i with Y in G, so that the further
1322 steps work correctly. */
1324 if (!conservative)
1326 /* Split the tree now. If the idoms of blocks in BBS are not
1327 conservatively correct, setting the dominators using the
1328 heuristics in prune_bbs_to_update_dominators could
1329 create cycles in the dominance "tree", and cause ICE. */
1330 FOR_EACH_VEC_ELT (bbs, i, bb)
1331 set_immediate_dominator (CDI_DOMINATORS, bb, NULL);
1334 prune_bbs_to_update_dominators (bbs, conservative);
1335 n = bbs.length ();
1337 if (n == 0)
1338 return;
1340 if (n == 1)
1342 bb = bbs[0];
1343 set_immediate_dominator (CDI_DOMINATORS, bb,
1344 recompute_dominator (CDI_DOMINATORS, bb));
1345 return;
1348 /* Construct the graph G. */
1349 hash_map<basic_block, int> map (251);
1350 FOR_EACH_VEC_ELT (bbs, i, bb)
1352 /* If the dominance tree is conservatively correct, split it now. */
1353 if (conservative)
1354 set_immediate_dominator (CDI_DOMINATORS, bb, NULL);
1355 map.put (bb, i);
1357 map.put (ENTRY_BLOCK_PTR_FOR_FN (cfun), n);
1359 g = new_graph (n + 1);
1360 for (y = 0; y < g->n_vertices; y++)
1361 g->vertices[y].data = BITMAP_ALLOC (NULL);
1362 FOR_EACH_VEC_ELT (bbs, i, bb)
1364 FOR_EACH_EDGE (e, ei, bb->preds)
1366 dom = root_of_dom_tree (CDI_DOMINATORS, e->src);
1367 if (dom == bb)
1368 continue;
1370 dom_i = *map.get (dom);
1372 /* Do not include parallel edges to G. */
1373 if (!bitmap_set_bit ((bitmap) g->vertices[dom_i].data, i))
1374 continue;
1376 add_edge (g, dom_i, i);
1379 for (y = 0; y < g->n_vertices; y++)
1380 BITMAP_FREE (g->vertices[y].data);
1382 /* Find the dominator tree of G. */
1383 son = XNEWVEC (int, n + 1);
1384 brother = XNEWVEC (int, n + 1);
1385 parent = XNEWVEC (int, n + 1);
1386 graphds_domtree (g, n, parent, son, brother);
1388 /* Finally, traverse the tree and find the immediate dominators. */
1389 for (y = n; son[y] != -1; y = son[y])
1390 continue;
1391 while (y != -1)
1393 determine_dominators_for_sons (g, bbs, y, son, brother);
1395 if (brother[y] != -1)
1397 y = brother[y];
1398 while (son[y] != -1)
1399 y = son[y];
1401 else
1402 y = parent[y];
1405 free (son);
1406 free (brother);
1407 free (parent);
1409 free_graph (g);
1412 void
1413 add_to_dominance_info (enum cdi_direction dir, basic_block bb)
1415 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1417 gcc_checking_assert (dom_computed[dir_index] && !bb->dom[dir_index]);
1419 n_bbs_in_dom_tree[dir_index]++;
1421 bb->dom[dir_index] = et_new_tree (bb);
1423 if (dom_computed[dir_index] == DOM_OK)
1424 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
1427 void
1428 delete_from_dominance_info (enum cdi_direction dir, basic_block bb)
1430 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1432 gcc_checking_assert (dom_computed[dir_index]);
1434 et_free_tree (bb->dom[dir_index]);
1435 bb->dom[dir_index] = NULL;
1436 n_bbs_in_dom_tree[dir_index]--;
1438 if (dom_computed[dir_index] == DOM_OK)
1439 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
1442 /* Returns the first son of BB in the dominator or postdominator tree
1443 as determined by DIR. */
1445 basic_block
1446 first_dom_son (enum cdi_direction dir, basic_block bb)
1448 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1449 struct et_node *son = bb->dom[dir_index]->son;
1451 return (basic_block) (son ? son->data : NULL);
1454 /* Returns the next dominance son after BB in the dominator or postdominator
1455 tree as determined by DIR, or NULL if it was the last one. */
1457 basic_block
1458 next_dom_son (enum cdi_direction dir, basic_block bb)
1460 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1461 struct et_node *next = bb->dom[dir_index]->right;
1463 return (basic_block) (next->father->son == next ? NULL : next->data);
1466 /* Return dominance availability for dominance info DIR. */
1468 enum dom_state
1469 dom_info_state (function *fn, enum cdi_direction dir)
1471 if (!fn->cfg)
1472 return DOM_NONE;
1474 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1475 return fn->cfg->x_dom_computed[dir_index];
1478 enum dom_state
1479 dom_info_state (enum cdi_direction dir)
1481 return dom_info_state (cfun, dir);
1484 /* Set the dominance availability for dominance info DIR to NEW_STATE. */
1486 void
1487 set_dom_info_availability (enum cdi_direction dir, enum dom_state new_state)
1489 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1491 dom_computed[dir_index] = new_state;
1494 /* Returns true if dominance information for direction DIR is available. */
1496 bool
1497 dom_info_available_p (function *fn, enum cdi_direction dir)
1499 return dom_info_state (fn, dir) != DOM_NONE;
1502 bool
1503 dom_info_available_p (enum cdi_direction dir)
1505 return dom_info_available_p (cfun, dir);
1508 DEBUG_FUNCTION void
1509 debug_dominance_info (enum cdi_direction dir)
1511 basic_block bb, bb2;
1512 FOR_EACH_BB_FN (bb, cfun)
1513 if ((bb2 = get_immediate_dominator (dir, bb)))
1514 fprintf (stderr, "%i %i\n", bb->index, bb2->index);
1517 /* Prints to stderr representation of the dominance tree (for direction DIR)
1518 rooted in ROOT, indented by INDENT tabulators. If INDENT_FIRST is false,
1519 the first line of the output is not indented. */
1521 static void
1522 debug_dominance_tree_1 (enum cdi_direction dir, basic_block root,
1523 unsigned indent, bool indent_first)
1525 basic_block son;
1526 unsigned i;
1527 bool first = true;
1529 if (indent_first)
1530 for (i = 0; i < indent; i++)
1531 fprintf (stderr, "\t");
1532 fprintf (stderr, "%d\t", root->index);
1534 for (son = first_dom_son (dir, root);
1535 son;
1536 son = next_dom_son (dir, son))
1538 debug_dominance_tree_1 (dir, son, indent + 1, !first);
1539 first = false;
1542 if (first)
1543 fprintf (stderr, "\n");
1546 /* Prints to stderr representation of the dominance tree (for direction DIR)
1547 rooted in ROOT. */
1549 DEBUG_FUNCTION void
1550 debug_dominance_tree (enum cdi_direction dir, basic_block root)
1552 debug_dominance_tree_1 (dir, root, 0, false);