PR target/65871
[official-gcc.git] / gcc / dominance.c
blob09c8c90eebe16fa23bab6c2192fe86ef18d83809
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).
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 "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"
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. */
66 /* Type of Basic Block aka. TBB */
67 typedef unsigned int TBB;
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. */
74 struct dom_info
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;
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;
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;
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;
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;
124 static void init_dom_info (struct dom_info *, enum cdi_direction);
125 static void free_dom_info (struct dom_info *);
126 static void calc_dfs_tree_nonrec (struct dom_info *, basic_block, bool);
127 static void calc_dfs_tree (struct dom_info *, bool);
128 static void compress (struct dom_info *, TBB);
129 static TBB eval (struct dom_info *, TBB);
130 static void link_roots (struct dom_info *, TBB, TBB);
131 static void calc_idoms (struct dom_info *, bool);
132 void debug_dominance_info (enum cdi_direction);
133 void debug_dominance_tree (enum cdi_direction, basic_block);
135 /* Helper macro for allocating and initializing an array,
136 for aesthetic reasons. */
137 #define init_ar(var, type, num, content) \
138 do \
140 unsigned int i = 1; /* Catch content == i. */ \
141 if (! (content)) \
142 (var) = XCNEWVEC (type, num); \
143 else \
145 (var) = XNEWVEC (type, (num)); \
146 for (i = 0; i < num; i++) \
147 (var)[i] = (content); \
150 while (0)
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. */
155 static void
156 init_dom_info (struct dom_info *di, enum cdi_direction dir)
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);
165 init_ar (di->bucket, TBB, num, 0);
166 init_ar (di->next_bucket, TBB, num, 0);
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);
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);
176 di->dfsnum = 1;
177 di->nodes = 0;
179 switch (dir)
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;
193 #undef init_ar
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. */
200 static unsigned int
201 dom_convert_dir_to_idx (enum cdi_direction dir)
203 gcc_checking_assert (dir == CDI_DOMINATORS || dir == CDI_POST_DOMINATORS);
204 return dir - 1;
207 /* Free all allocated memory in DI, but not DI itself. */
209 static void
210 free_dom_info (struct dom_info *di)
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);
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. */
232 static void
233 calc_dfs_tree_nonrec (struct dom_info *di, basic_block bb, bool reverse)
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;
247 stack = XNEWVEC (edge_iterator, n_basic_blocks_for_fn (cfun) + 1);
248 sp = 0;
250 /* Initialize our border blocks, and the first edge. */
251 if (reverse)
253 ei = ei_start (bb->preds);
254 en_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
255 ex_block = ENTRY_BLOCK_PTR_FOR_FN (cfun);
257 else
259 ei = ei_start (bb->succs);
260 en_block = ENTRY_BLOCK_PTR_FOR_FN (cfun);
261 ex_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
264 /* When the stack is empty we break out of this loop. */
265 while (1)
267 basic_block bn;
269 /* This loop traverses edges e in depth first manner, and fills the
270 stack. */
271 while (!ei_end_p (ei))
273 e = ei_edge (ei);
275 /* Deduce from E the current and the next block (BB and BN), and the
276 next edge. */
277 if (reverse)
279 bn = e->src;
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])
286 ei_next (&ei);
287 continue;
289 bb = e->dest;
290 einext = ei_start (bn->preds);
292 else
294 bn = e->dest;
295 if (bn == ex_block || di->dfs_order[bn->index])
297 ei_next (&ei);
298 continue;
300 bb = e->src;
301 einext = ei_start (bn->succs);
304 gcc_assert (bn != en_block);
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;
315 /* Save the current point in the CFG on the stack, and recurse. */
316 stack[sp++] = ei;
317 ei = einext;
320 if (!sp)
321 break;
322 ei = stack[--sp];
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);
335 free (stack);
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. */
343 static void
344 calc_dfs_tree (struct dom_info *di, bool reverse)
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++;
353 calc_dfs_tree_nonrec (di, begin, reverse);
355 if (reverse)
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.
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. */
367 basic_block b;
368 bool saw_unconnected = false;
370 FOR_EACH_BB_REVERSE_FN (b, cfun)
372 if (EDGE_COUNT (b->succs) > 0)
374 if (di->dfs_order[b->index] == 0)
375 saw_unconnected = true;
376 continue;
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);
387 if (saw_unconnected)
389 FOR_EACH_BB_REVERSE_FN (b, cfun)
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]);
408 di->nodes = di->dfsnum - 1;
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);
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. */
419 static void
420 compress (struct dom_info *di, TBB v)
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])
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];
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. */
439 static inline TBB
440 eval (struct dom_info *di, TBB v)
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];
446 /* V itself is the root. */
447 if (!rep)
448 return di->path_min[v];
450 /* Compress only if necessary. */
451 if (di->set_chain[rep])
453 compress (di, v);
454 rep = di->set_chain[v];
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];
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. */
468 static void
469 link_roots (struct dom_info *di, TBB v, TBB w)
471 TBB s = w;
473 /* Rebalance the tree. */
474 while (di->key[di->path_min[w]] < di->key[di->path_min[di->set_child[s]]])
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]])
479 di->set_chain[di->set_child[s]] = s;
480 di->set_child[s] = di->set_child[di->set_child[s]];
482 else
484 di->set_size[di->set_child[s]] = di->set_size[s];
485 s = di->set_chain[s] = di->set_child[s];
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])
493 TBB tmp = s;
494 s = di->set_child[v];
495 di->set_child[v] = tmp;
498 /* Merge all subtrees. */
499 while (s)
501 di->set_chain[s] = v;
502 s = di->set_child[s];
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]. */
510 static void
511 calc_idoms (struct dom_info *di, bool reverse)
513 TBB v, w, k, par;
514 basic_block en_block;
515 edge_iterator ei, einext;
517 if (reverse)
518 en_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
519 else
520 en_block = ENTRY_BLOCK_PTR_FOR_FN (cfun);
522 /* Go backwards in DFS order, to first look at the leafs. */
523 v = di->nodes;
524 while (v > 1)
526 basic_block bb = di->dfs_to_bb[v];
527 edge e;
529 par = di->dfs_parent[v];
530 k = v;
532 ei = (reverse) ? ei_start (bb->succs) : ei_start (bb->preds);
534 if (reverse)
536 /* If this block has a fake edge to exit, process that first. */
537 if (bitmap_bit_p (di->fake_exit_edge, bb->index))
539 einext = ei;
540 einext.index = 0;
541 goto do_fake_exit_edge;
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))
551 TBB k1;
552 basic_block b;
554 e = ei_edge (ei);
555 b = (reverse) ? e->dest : e->src;
556 einext = ei;
557 ei_next (&einext);
559 if (b == en_block)
561 do_fake_exit_edge:
562 k1 = di->dfs_order[last_basic_block_for_fn (cfun)];
564 else
565 k1 = di->dfs_order[b->index];
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;
574 ei = einext;
577 di->key[v] = k;
578 link_roots (di, par, v);
579 di->next_bucket[v] = di->bucket[k];
580 di->bucket[k] = v;
582 /* Transform semidominators into dominators. */
583 for (w = di->bucket[par]; w; w = di->next_bucket[w])
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;
591 /* We don't need to cleanup next_bucket[]. */
592 di->bucket[par] = 0;
593 v--;
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]];
603 /* Assign dfs numbers starting from NUM to NODE and its sons. */
605 static void
606 assign_dfs_numbers (struct et_node *node, int *num)
608 struct et_node *son;
610 node->dfs_num_in = (*num)++;
612 if (node->son)
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);
619 node->dfs_num_out = (*num)++;
622 /* Compute the data necessary for fast resolving of dominator queries in a
623 static dominator tree. */
625 static void
626 compute_dom_fast_query (enum cdi_direction dir)
628 int num = 0;
629 basic_block bb;
630 unsigned int dir_index = dom_convert_dir_to_idx (dir);
632 gcc_checking_assert (dom_info_available_p (dir));
634 if (dom_computed[dir_index] == DOM_OK)
635 return;
637 FOR_ALL_BB_FN (bb, cfun)
639 if (!bb->dom[dir_index]->father)
640 assign_dfs_numbers (bb->dom[dir_index], &num);
643 dom_computed[dir_index] = DOM_OK;
646 /* The main entry point into this module. DIR is set depending on whether
647 we want to compute dominators or postdominators. */
649 void
650 calculate_dominance_info (enum cdi_direction dir)
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;
657 if (dom_computed[dir_index] == DOM_OK)
658 return;
660 timevar_push (TV_DOMINANCE);
661 if (!dom_info_available_p (dir))
663 gcc_assert (!n_bbs_in_dom_tree[dir_index]);
665 FOR_ALL_BB_FN (b, cfun)
667 b->dom[dir_index] = et_new_tree (b);
669 n_bbs_in_dom_tree[dir_index] = n_basic_blocks_for_fn (cfun);
671 init_dom_info (&di, dir);
672 calc_dfs_tree (&di, reverse);
673 calc_idoms (&di, reverse);
675 FOR_EACH_BB_FN (b, cfun)
677 TBB d = di.dom[di.dfs_order[b->index]];
679 if (di.dfs_to_bb[d])
680 et_set_father (b->dom[dir_index], di.dfs_to_bb[d]->dom[dir_index]);
683 free_dom_info (&di);
684 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
687 compute_dom_fast_query (dir);
689 timevar_pop (TV_DOMINANCE);
692 /* Free dominance information for direction DIR. */
693 void
694 free_dominance_info (function *fn, enum cdi_direction dir)
696 basic_block bb;
697 unsigned int dir_index = dom_convert_dir_to_idx (dir);
699 if (!dom_info_available_p (fn, dir))
700 return;
702 FOR_ALL_BB_FN (bb, fn)
704 et_free_tree_force (bb->dom[dir_index]);
705 bb->dom[dir_index] = NULL;
707 et_free_pools ();
709 fn->cfg->x_n_bbs_in_dom_tree[dir_index] = 0;
711 fn->cfg->x_dom_computed[dir_index] = DOM_NONE;
714 void
715 free_dominance_info (enum cdi_direction dir)
717 free_dominance_info (cfun, dir);
720 /* Return the immediate dominator of basic block BB. */
721 basic_block
722 get_immediate_dominator (enum cdi_direction dir, basic_block bb)
724 unsigned int dir_index = dom_convert_dir_to_idx (dir);
725 struct et_node *node = bb->dom[dir_index];
727 gcc_checking_assert (dom_computed[dir_index]);
729 if (!node->father)
730 return NULL;
732 return (basic_block) node->father->data;
735 /* Set the immediate dominator of the block possibly removing
736 existing edge. NULL can be used to remove any edge. */
737 void
738 set_immediate_dominator (enum cdi_direction dir, basic_block bb,
739 basic_block dominated_by)
741 unsigned int dir_index = dom_convert_dir_to_idx (dir);
742 struct et_node *node = bb->dom[dir_index];
744 gcc_checking_assert (dom_computed[dir_index]);
746 if (node->father)
748 if (node->father->data == dominated_by)
749 return;
750 et_split (node);
753 if (dominated_by)
754 et_set_father (node, dominated_by->dom[dir_index]);
756 if (dom_computed[dir_index] == DOM_OK)
757 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
760 /* Returns the list of basic blocks immediately dominated by BB, in the
761 direction DIR. */
762 vec<basic_block>
763 get_dominated_by (enum cdi_direction dir, basic_block bb)
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;
769 gcc_checking_assert (dom_computed[dir_index]);
771 if (!son)
772 return vNULL;
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);
778 return bbs;
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. */
785 vec<basic_block>
786 get_dominated_by_region (enum cdi_direction dir, basic_block *region,
787 unsigned n_region)
789 unsigned i;
790 basic_block dom;
791 vec<basic_block> doms = vNULL;
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;
804 return doms;
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. */
812 vec<basic_block>
813 get_dominated_to_depth (enum cdi_direction dir, basic_block bb, int depth)
815 vec<basic_block> bbs = vNULL;
816 unsigned i;
817 unsigned next_level_start;
819 i = 0;
820 bbs.safe_push (bb);
821 next_level_start = 1; /* = bbs.length (); */
825 basic_block son;
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);
833 if (i == next_level_start && --depth)
834 next_level_start = bbs.length ();
836 while (i < next_level_start);
838 return bbs;
841 /* Returns the list of basic blocks including BB dominated by BB, in the
842 direction DIR. The vector will be sorted in preorder. */
844 vec<basic_block>
845 get_all_dominated_blocks (enum cdi_direction dir, basic_block bb)
847 return get_dominated_to_depth (dir, bb, 0);
850 /* Redirect all edges pointing to BB to TO. */
851 void
852 redirect_immediate_dominators (enum cdi_direction dir, basic_block bb,
853 basic_block to)
855 unsigned int dir_index = dom_convert_dir_to_idx (dir);
856 struct et_node *bb_node, *to_node, *son;
858 bb_node = bb->dom[dir_index];
859 to_node = to->dom[dir_index];
861 gcc_checking_assert (dom_computed[dir_index]);
863 if (!bb_node->son)
864 return;
866 while (bb_node->son)
868 son = bb_node->son;
870 et_split (son);
871 et_set_father (son, to_node);
874 if (dom_computed[dir_index] == DOM_OK)
875 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
878 /* Find first basic block in the tree dominating both BB1 and BB2. */
879 basic_block
880 nearest_common_dominator (enum cdi_direction dir, basic_block bb1, basic_block bb2)
882 unsigned int dir_index = dom_convert_dir_to_idx (dir);
884 gcc_checking_assert (dom_computed[dir_index]);
886 if (!bb1)
887 return bb2;
888 if (!bb2)
889 return bb1;
891 return (basic_block) et_nca (bb1->dom[dir_index], bb2->dom[dir_index])->data;
895 /* Find the nearest common dominator for the basic blocks in BLOCKS,
896 using dominance direction DIR. */
898 basic_block
899 nearest_common_dominator_for_set (enum cdi_direction dir, bitmap blocks)
901 unsigned i, first;
902 bitmap_iterator bi;
903 basic_block dom;
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));
911 return dom;
914 /* Given a dominator tree, we can determine whether one thing
915 dominates another in constant time by using two DFS numbers:
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
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.
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:
928 1. Node A is above Node B (and thus, Node A dominates node B)
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
942 2. Node A is below node B (and thus, node B dominates node A)
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.
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
957 3. Node A and B are siblings (and thus, neither dominates the other)
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.
975 Thus, it is sufficient to write
977 A_Dominates_B (node A, node B)
979 return DFS_Number_In(A) <= DFS_Number_In(B)
980 && DFS_Number_Out (A) >= DFS_Number_Out(B);
983 A_Dominated_by_B (node A, node B)
985 return DFS_Number_In(A) >= DFS_Number_In(B)
986 && DFS_Number_Out (A) <= DFS_Number_Out(B);
987 } */
989 /* Return TRUE in case BB1 is dominated by BB2. */
990 bool
991 dominated_by_p (enum cdi_direction dir, const_basic_block bb1, const_basic_block bb2)
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];
996 gcc_checking_assert (dom_computed[dir_index]);
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);
1002 return et_below (n1, n2);
1005 /* Returns the entry dfs number for basic block BB, in the direction DIR. */
1007 unsigned
1008 bb_dom_dfs_in (enum cdi_direction dir, basic_block bb)
1010 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1011 struct et_node *n = bb->dom[dir_index];
1013 gcc_checking_assert (dom_computed[dir_index] == DOM_OK);
1014 return n->dfs_num_in;
1017 /* Returns the exit dfs number for basic block BB, in the direction DIR. */
1019 unsigned
1020 bb_dom_dfs_out (enum cdi_direction dir, basic_block bb)
1022 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1023 struct et_node *n = bb->dom[dir_index];
1025 gcc_checking_assert (dom_computed[dir_index] == DOM_OK);
1026 return n->dfs_num_out;
1029 /* Verify invariants of dominator structure. */
1030 DEBUG_FUNCTION void
1031 verify_dominators (enum cdi_direction dir)
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;
1038 gcc_assert (dom_info_available_p (dir));
1040 init_dom_info (&di, dir);
1041 calc_dfs_tree (&di, reverse);
1042 calc_idoms (&di, reverse);
1044 FOR_EACH_BB_FN (bb, cfun)
1046 imm_bb = get_immediate_dominator (dir, bb);
1047 if (!imm_bb)
1049 error ("dominator of %d status unknown", bb->index);
1050 err = 1;
1053 imm_bb_correct = di.dfs_to_bb[di.dom[di.dfs_order[bb->index]]];
1054 if (imm_bb != imm_bb_correct)
1056 error ("dominator of %d should be %d, not %d",
1057 bb->index, imm_bb_correct->index, imm_bb->index);
1058 err = 1;
1062 free_dom_info (&di);
1063 gcc_assert (!err);
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. */
1071 basic_block
1072 recompute_dominator (enum cdi_direction dir, basic_block bb)
1074 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1075 basic_block dom_bb = NULL;
1076 edge e;
1077 edge_iterator ei;
1079 gcc_checking_assert (dom_computed[dir_index]);
1081 if (dir == CDI_DOMINATORS)
1083 FOR_EACH_EDGE (e, ei, bb->preds)
1085 if (!dominated_by_p (dir, e->src, bb))
1086 dom_bb = nearest_common_dominator (dir, dom_bb, e->src);
1089 else
1091 FOR_EACH_EDGE (e, ei, bb->succs)
1093 if (!dominated_by_p (dir, e->dest, bb))
1094 dom_bb = nearest_common_dominator (dir, dom_bb, e->dest);
1098 return dom_bb;
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. */
1108 static void
1109 prune_bbs_to_update_dominators (vec<basic_block> bbs,
1110 bool conservative)
1112 unsigned i;
1113 bool single;
1114 basic_block bb, dom = NULL;
1115 edge_iterator ei;
1116 edge e;
1118 for (i = 0; bbs.iterate (i, &bb);)
1120 if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1121 goto succeed;
1123 if (single_pred_p (bb))
1125 set_immediate_dominator (CDI_DOMINATORS, bb, single_pred (bb));
1126 goto succeed;
1129 if (!conservative)
1130 goto fail;
1132 single = true;
1133 dom = NULL;
1134 FOR_EACH_EDGE (e, ei, bb->preds)
1136 if (dominated_by_p (CDI_DOMINATORS, e->src, bb))
1137 continue;
1139 if (!dom)
1140 dom = e->src;
1141 else
1143 single = false;
1144 dom = nearest_common_dominator (CDI_DOMINATORS, dom, e->src);
1148 gcc_assert (dom != NULL);
1149 if (single
1150 || find_edge (dom, bb))
1152 set_immediate_dominator (CDI_DOMINATORS, bb, dom);
1153 goto succeed;
1156 fail:
1157 i++;
1158 continue;
1160 succeed:
1161 bbs.unordered_remove (i);
1165 /* Returns root of the dominance tree in the direction DIR that contains
1166 BB. */
1168 static basic_block
1169 root_of_dom_tree (enum cdi_direction dir, basic_block bb)
1171 return (basic_block) et_root (bb->dom[dom_convert_dir_to_idx (dir)])->data;
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. */
1179 static void
1180 determine_dominators_for_sons (struct graph *g, vec<basic_block> bbs,
1181 int y, int *son, int *brother)
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;
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];
1198 if (brother[son[y]] == -1)
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;
1208 gprime = BITMAP_ALLOC (NULL);
1209 for (a = son[y]; a != -1; a = brother[a])
1210 bitmap_set_bit (gprime, a);
1212 nc = graphds_scc (g, gprime);
1213 BITMAP_FREE (gprime);
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);
1222 for (i = nc - 1; i >= 0; i--)
1224 dom = NULL;
1225 FOR_EACH_VEC_ELT (sccs[i], si, a)
1227 bb = bbs[a];
1228 FOR_EACH_EDGE (e, ei, bb->preds)
1230 if (root_of_dom_tree (CDI_DOMINATORS, e->src) != ybb)
1231 continue;
1233 dom = nearest_common_dominator (CDI_DOMINATORS, dom, e->src);
1237 gcc_assert (dom != NULL);
1238 FOR_EACH_VEC_ELT (sccs[i], si, a)
1240 bb = bbs[a];
1241 set_immediate_dominator (CDI_DOMINATORS, bb, dom);
1245 for (i = 0; i < nc; i++)
1246 sccs[i].release ();
1247 free (sccs);
1249 for (a = son[y]; a != -1; a = brother[a])
1250 identify_vertices (g, y, a);
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.
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. */
1260 void
1261 iterate_fix_dominators (enum cdi_direction dir, vec<basic_block> bbs,
1262 bool conservative)
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);
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]);
1283 /* The algorithm we use takes inspiration from the following papers, although
1284 the details are quite different from any of them:
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
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
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.
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. */
1333 if (!conservative)
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);
1343 prune_bbs_to_update_dominators (bbs, conservative);
1344 n = bbs.length ();
1346 if (n == 0)
1347 return;
1349 if (n == 1)
1351 bb = bbs[0];
1352 set_immediate_dominator (CDI_DOMINATORS, bb,
1353 recompute_dominator (CDI_DOMINATORS, bb));
1354 return;
1357 /* Construct the graph G. */
1358 hash_map<basic_block, int> map (251);
1359 FOR_EACH_VEC_ELT (bbs, i, bb)
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);
1366 map.put (ENTRY_BLOCK_PTR_FOR_FN (cfun), n);
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)
1373 FOR_EACH_EDGE (e, ei, bb->preds)
1375 dom = root_of_dom_tree (CDI_DOMINATORS, e->src);
1376 if (dom == bb)
1377 continue;
1379 dom_i = *map.get (dom);
1381 /* Do not include parallel edges to G. */
1382 if (!bitmap_set_bit ((bitmap) g->vertices[dom_i].data, i))
1383 continue;
1385 add_edge (g, dom_i, i);
1388 for (y = 0; y < g->n_vertices; y++)
1389 BITMAP_FREE (g->vertices[y].data);
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);
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)
1402 determine_dominators_for_sons (g, bbs, y, son, brother);
1404 if (brother[y] != -1)
1406 y = brother[y];
1407 while (son[y] != -1)
1408 y = son[y];
1410 else
1411 y = parent[y];
1414 free (son);
1415 free (brother);
1416 free (parent);
1418 free_graph (g);
1421 void
1422 add_to_dominance_info (enum cdi_direction dir, basic_block bb)
1424 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1426 gcc_checking_assert (dom_computed[dir_index] && !bb->dom[dir_index]);
1428 n_bbs_in_dom_tree[dir_index]++;
1430 bb->dom[dir_index] = et_new_tree (bb);
1432 if (dom_computed[dir_index] == DOM_OK)
1433 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
1436 void
1437 delete_from_dominance_info (enum cdi_direction dir, basic_block bb)
1439 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1441 gcc_checking_assert (dom_computed[dir_index]);
1443 et_free_tree (bb->dom[dir_index]);
1444 bb->dom[dir_index] = NULL;
1445 n_bbs_in_dom_tree[dir_index]--;
1447 if (dom_computed[dir_index] == DOM_OK)
1448 dom_computed[dir_index] = DOM_NO_FAST_QUERY;
1451 /* Returns the first son of BB in the dominator or postdominator tree
1452 as determined by DIR. */
1454 basic_block
1455 first_dom_son (enum cdi_direction dir, basic_block bb)
1457 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1458 struct et_node *son = bb->dom[dir_index]->son;
1460 return (basic_block) (son ? son->data : NULL);
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. */
1466 basic_block
1467 next_dom_son (enum cdi_direction dir, basic_block bb)
1469 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1470 struct et_node *next = bb->dom[dir_index]->right;
1472 return (basic_block) (next->father->son == next ? NULL : next->data);
1475 /* Return dominance availability for dominance info DIR. */
1477 enum dom_state
1478 dom_info_state (function *fn, enum cdi_direction dir)
1480 if (!fn->cfg)
1481 return DOM_NONE;
1483 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1484 return fn->cfg->x_dom_computed[dir_index];
1487 enum dom_state
1488 dom_info_state (enum cdi_direction dir)
1490 return dom_info_state (cfun, dir);
1493 /* Set the dominance availability for dominance info DIR to NEW_STATE. */
1495 void
1496 set_dom_info_availability (enum cdi_direction dir, enum dom_state new_state)
1498 unsigned int dir_index = dom_convert_dir_to_idx (dir);
1500 dom_computed[dir_index] = new_state;
1503 /* Returns true if dominance information for direction DIR is available. */
1505 bool
1506 dom_info_available_p (function *fn, enum cdi_direction dir)
1508 return dom_info_state (fn, dir) != DOM_NONE;
1511 bool
1512 dom_info_available_p (enum cdi_direction dir)
1514 return dom_info_available_p (cfun, dir);
1517 DEBUG_FUNCTION void
1518 debug_dominance_info (enum cdi_direction dir)
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);
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. */
1530 static void
1531 debug_dominance_tree_1 (enum cdi_direction dir, basic_block root,
1532 unsigned indent, bool indent_first)
1534 basic_block son;
1535 unsigned i;
1536 bool first = true;
1538 if (indent_first)
1539 for (i = 0; i < indent; i++)
1540 fprintf (stderr, "\t");
1541 fprintf (stderr, "%d\t", root->index);
1543 for (son = first_dom_son (dir, root);
1544 son;
1545 son = next_dom_son (dir, son))
1547 debug_dominance_tree_1 (dir, son, indent + 1, !first);
1548 first = false;
1551 if (first)
1552 fprintf (stderr, "\n");
1555 /* Prints to stderr representation of the dominance tree (for direction DIR)
1556 rooted in ROOT. */
1558 DEBUG_FUNCTION void
1559 debug_dominance_tree (enum cdi_direction dir, basic_block root)
1561 debug_dominance_tree_1 (dir, root, 0, false);